Exemplo n.º 1
0
 private RWDreieck(Dreieck dreieck)
 {
     this.dreieck = dreieck;
     this.height  = this.dreieck.Höhe()[2];
     this.theta   = Math.Acos(this.dreieck.seiten[0] / this.dreieck.seiten[2]);
     Debug.Assert(Invariant());
 }
Exemplo n.º 2
0
        private static Dreieck[] Trigo(Nullable <double> a, Nullable <double> b, Nullable <double> c, Nullable <double> h, Nullable <double> theta)
        {
            int valuecount = 0;
            int index      = -1;

            double[] sides = new double[3];

            if (a is double aval)
            {
                index = 0;
                valuecount++;
                sides[0] = aval;
                if (b is double bval)
                {
                    valuecount++;
                    sides[1] = bval;
                    return(new Dreieck[] { RWDreieck.Rechtwinklig(new double?[] { aval, bval, null }) });
                }
                else
                {
                    if (c is double cval)
                    {
                        sides[2] = cval;
                        valuecount++;
                        return(new Dreieck[] { RWDreieck.Rechtwinklig(new double?[] { aval, null, cval }) });
                    }
                }
            }
            else
            {
                if (b is double bval)
                {
                    index = 1;
                    valuecount++;
                    sides[1] = bval;
                    if (c is double cval)
                    {
                        valuecount++;
                        sides[2] = cval;
                        return(new Dreieck[] { RWDreieck.Rechtwinklig(new double?[] { null, bval, cval }) });
                    }
                }
                else
                {
                    if (c is double cval)
                    {
                        valuecount++;
                        sides[2] = cval;
                        index    = 2;
                    }
                }
            }

            Debug.Assert(valuecount < 2);
            Debug.Assert(valuecount == 0 || index >= 0);

            // less trivial cases

            if (h is double hval)
            {
                if (valuecount == 1)
                {
                    if (index == 2)
                    {
                        double var = Math.Pow(sides[2], 2) - 4 * Math.Pow(hval, 4);

                        if (var > 0)
                        {
                            Dreieck[] sol = new Dreieck[2];
                            double    q   = (sides[2] + var) / 2;
                            double    p   = (sides[2] - var) / 2;

                            sol[0] = RWDreieck.Rechtwinklig(new double?[] { q, hval, null }).strecken(2, sides[2]);
                            sol[1] = RWDreieck.Rechtwinklig(new double?[] { hval, p, null }).strecken(2, sides[2]);
                            return(sol);
                        }
                        else if (var == 0)
                        {
                            Dreieck[] sol = new Dreieck[1];
                            double    q   = sides[2] / 2;
                            sol[0] = RWDreieck.Rechtwinklig(new double?[] { q, hval, null }).strecken(2, sides[2]);
                            return(sol);
                        }
                        else
                        {
                            return(new Dreieck[0]);
                        }
                    }
                    else if (index == 1)
                    {
                        return(new Dreieck[] { RWDreieck.Rechtwinklig(new double?[] { hval, null, sides[1] }).strecken(1, sides[1]) });
                    }
                    else
                    {
                        Debug.Assert(index == 0);
                        return(new Dreieck[] { RWDreieck.Rechtwinklig(new double?[] { null, hval, sides[0] }).strecken(0, sides[0]) });
                    }
                }
                else
                {
                    if (theta is double thetaval)
                    {
                        Dreieck basis = new Dreieck(Math.Cos(thetaval), Math.Sin(thetaval), 1);
                        basis    = basis.strecken(2, hval);
                        sides[0] = basis.seiten[2];
                        return(new Dreieck[] { basis.strecken(0, sides[0]) });
                    }
                    else
                    {
                        throw new Exception();
                    }
                }
            }
            else
            {
                if (theta is double thetaval)
                {
                    Debug.Assert(index >= 0 && index < 3);
                    return(new Dreieck[] { Triangle.Dreieck.ThetaEinheit(thetaval).strecken(index, sides[index]) });
                }
                else
                {
                    throw new Exception();
                }
            }
        }