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()); }
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(); } } }