public static Ellipse ConstructFromConjugateDiameters(Point M, Point P, Point Q) { Ellipse result; try { if (P.DistanceTo(M) > Q.DistanceTo(M)) { Point point = P.DeepCopy(); P = Q.DeepCopy(); Q = point.DeepCopy(); } Vector3d vector3d = new Vector3d(Q - M); Vector3d vector3d2 = new Vector3d(P - M); if (vector3d2.IsOrthogonalTo(vector3d)) { result = new Ellipse(M, vector3d, vector3d2); } else { Plane plane = new Plane(M, P, Q); plane.Normalize(); Matrix3d rotationMatrix = Matrix3d.RotationArbitraryAxis(plane.NormalVector, 1.5707963267948966); Point point2 = P.Rotate(M, rotationMatrix); if (Vector3d.Angle(vector3d, new Vector3d(point2 - M)) > 1.5707963267948966) { point2 = -1.0 * (point2 - M) + M; } Point midPoint = new Edge(point2, Q).MidPoint; Circle circle = new Circle(midPoint, M.DistanceTo(midPoint), plane.NormalVector); Plane plane2 = new Plane(midPoint, new Vector3d(point2 - midPoint), plane.NormalVector); plane2.Normalize(); Edge edge = plane2.method_5(circle); double num = Q.DistanceTo(edge.StartPoint); double num2 = Q.DistanceTo(edge.EndPoint); if (num < num2) { num = num2; num2 = Q.DistanceTo(edge.StartPoint); } Vector3d vector3d3 = new Vector3d(edge.EndPoint - M); Vector3d vector3d4 = new Vector3d(edge.StartPoint - M); if (vector3d4.Norm > vector3d3.Norm) { vector3d3 = new Vector3d(edge.StartPoint - M); vector3d4 = new Vector3d(edge.EndPoint - M); } vector3d3.Norm = num; vector3d4.Norm = num2; Ellipse ellipse = new Ellipse(); ellipse.point_0 = M; if (vector3d3.Norm >= vector3d4.Norm) { ellipse.vector3d_0 = vector3d3; ellipse.vector3d_1 = vector3d4; } else { ellipse.vector3d_0 = vector3d4; ellipse.vector3d_1 = vector3d3; } result = ellipse; } } catch (System.Exception ex) { throw new ArithmeticException("Rytz construction failed due to numerical problems:\n" + ex.Message); } return(result); }
public PointSet method_0(Edge edge) { return(edge.method_2(this)); }
public Point method_3(Edge edge) { return(edge.method_8(this)); }
public bool IsCoplanarTo(Edge edge) { return(edge.IsCoplanarTo(this)); }
public bool IsParallelTo(Edge edge) { return(edge.IsParallelTo(this)); }
public bool Intersects3d(Edge edge) { return(this.method_3(edge) != null); }
public bool Intersects2d(Edge edge) { return(edge.Intersects2d(this)); }
public bool Contains(Edge edge) { return(this.Contains(edge.StartPoint) && this.Contains(edge.EndPoint)); }
public bool IsParallelTo(Edge edge) { return(this.vector3d_0.IsParallelTo(edge.ToLine().DirectionVector)); }
public bool IsCollinearTo(Edge edge) { return(this.Contains(edge)); }