public LineCircleX Intersect( Line2 line, ref double l0, ref double l1, ref double a0, ref double a1) { a0 = double.NaN; a1 = double.NaN; LineCircleX lineCircleX; switch (this.Intersect(line, ref l0, ref l1)) { case LineCircleX.None: lineCircleX = LineCircleX.None; break; case LineCircleX.Tangent: a0 = this.ClosestPointTo(line.PointAt(l0)); lineCircleX = LineCircleX.Tangent; break; case LineCircleX.Secant: a0 = this.ClosestPointTo(line.PointAt(l0)); a1 = this.ClosestPointTo(line.PointAt(l1)); lineCircleX = LineCircleX.Secant; break; default: lineCircleX = LineCircleX.None; break; } return(lineCircleX); }
public LineCircleX Intersect(Line2 line, ref double l0, ref double l1) { if (this.R <= 0.0) { throw new Exception("Invalid circle, zero or negative radius"); } l0 = double.NaN; l1 = double.NaN; int num1 = (int)this.Contains(line.Ax, line.Ay); int num2 = (int)this.Contains(line.Bx, line.By); double t = line.ClosestPoint(this.O); Node2 pt = line.PointAt(t); LineCircleX lineCircleX; switch (this.Contains(pt)) { case Containment.coincident: l0 = t; l1 = l0; lineCircleX = LineCircleX.Tangent; break; case Containment.outside: lineCircleX = LineCircleX.None; break; default: double num3 = Math.Sqrt(this.R * this.R - pt.DistanceSquared(this.O)) / line.Length(); l0 = t - num3; l1 = t + num3; lineCircleX = LineCircleX.Secant; break; } return(lineCircleX); }