public static void Main()
Console.WriteLine("Rytz's construction example");
Circle3d circle = new Circle3d(new Point3d(2, 3, -1), 5, new Vector3d(1, 1, 1));
Plane3d plane = new Plane3d(new Point3d(-1, -5, 0), new Vector3d(3, 0, 1));
Point3d d1 = circle.ParametricForm(0);
Point3d d2 = circle.ParametricForm(Math.PI / 2);
Point3d C = circle.Center.ProjectionTo(plane);
Point3d P = d1.ProjectionTo(plane);
Point3d Q = d2.ProjectionTo(plane);
Rotation r = new Rotation(plane.Normal, Math.PI / 2);
Point3d P_prime = P.Rotate(r, C);
Point3d D = (P_prime + Q) / 2;
double radius = D.DistanceTo(C);
Circle3d circle_DC = new Circle3d(D, radius, plane.Normal);
Line3d line = new Line3d(P_prime, Q);
Segment3d AB = (Segment3d)line.IntersectionWith(circle_DC);
double semi_axis_a = Q.DistanceTo(A);
double semi_axis_b = Q.DistanceTo(B);
Vector3d vec_CA = new Vector3d(C, A);
Vector3d vec_CB = new Vector3d(C, B);
vec_CA = semi_axis_b * vec_CA.Normalized;
vec_CB = semi_axis_a * vec_CB.Normalized;
Ellipse ellipse = new Ellipse(C, vec_CA, vec_CB);
if (ellipse == circle.ProjectionTo(plane))
Console.WriteLine("Your construction is correct!");
Console.WriteLine(ellipse.ToString());