public PointSet method_3(Circle circle) { if (!circle.IsCoplanarTo(this)) { return(null); } if (circle == this) { return(null); } PointSet result = new PointSet(); if (circle.point_0 == this.point_0) { return(result); } Circle circle2; Circle circle3; if (this.double_0 > circle.double_0) { circle2 = this; circle3 = circle; } else { circle3 = this; circle2 = circle; } Vector3d vector3d = new Vector3d(circle3.point_0 - circle2.point_0); double norm = vector3d.Norm; double scalar = (circle2.double_0 * circle2.double_0 - circle3.double_0 * circle3.double_0 + norm * norm) / (2.0 * norm); Point point = circle2.point_0 + scalar * vector3d.Normalize().ToPoint(); Line line = new Line(point, Vector3d.Cross(vector3d, this.vector3d_0)); return(this.method_1(line)); }
public List <Line> TangentLines2d(Circle circle) { if (!circle.IsCoplanarTo(this)) { return(null); } List <Line> list = new List <Line>(); if (this.Contains(circle)) { return(list); } if (circle.Contains(this)) { return(list); } Vector3d vector3d = new Vector3d(circle.point_0 - this.point_0); if (this.Intersects2d(circle)) { if (Global.AlmostEquals(this.double_0, circle.double_0)) { Vector3d b = new Vector3d(this.point_0 - circle.point_0); Vector3d vector3d2 = Vector3d.Cross(this.NormalVector, b); vector3d2.Norm = this.double_0; list.Add(new Line(this.point_0, circle.point_0).Move(vector3d2)); list.Add(new Line(this.point_0, circle.point_0).Move(-1.0 * vector3d2)); return(list); } double scalar = this.double_0 / (this.double_0 - circle.double_0); Point point = this.point_0 + scalar * vector3d.ToPoint(); return(this.TangentLines2d(point)); } else { if (Global.AlmostEquals(this.double_0, circle.double_0)) { Vector3d b2 = new Vector3d(this.point_0 - circle.point_0); Vector3d vector3d3 = Vector3d.Cross(this.NormalVector, b2); vector3d3.Norm = this.double_0; list.Add(new Line(this.point_0, circle.point_0).Move(vector3d3)); list.Add(new Line(this.point_0, circle.point_0).Move(-1.0 * vector3d3)); double scalar2 = this.double_0 / (this.double_0 + circle.double_0); Point point2 = this.point_0 + scalar2 * vector3d.ToPoint(); List <Line> list2 = this.TangentLines2d(point2); foreach (Line current in list2) { list.Add(current); } return(list); } double scalar3 = this.double_0 / (this.double_0 - circle.double_0); double scalar4 = this.double_0 / (this.double_0 + circle.double_0); Point point3 = this.point_0 + scalar3 * vector3d.ToPoint(); Point point4 = this.point_0 + scalar4 * vector3d.ToPoint(); List <Line> list3 = this.TangentLines2d(point3); List <Line> list4 = this.TangentLines2d(point4); foreach (Line current2 in list3) { list.Add(current2); } foreach (Line current3 in list4) { list.Add(current3); } return(list); } }
public bool IsCoplanarTo(Circle circle) { return(circle.IsCoplanarTo(this)); }