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); }
/// <summary>Rgister a new node with this collection.</summary> /// <param name="node">Node to register</param> /// <param name="index">Index of node</param> /// <returns>True if node was accepted, false if the node is too far or too close.</returns> public bool RegisterNode(Node2 node, int index) { if (index == m_base_index) { return(false); } double num = m_base.DistanceSquared(node); if (num < m_min_2) { return(false); } if (num > m_max_2) { return(false); } int num2 = m_D.BinarySearch(num); if (num2 < 0) { num2 ^= -1; } if (num2 == m_max_count) { return(false); } if (m_I[m_max_count - 1] < 0) { m_cur_count++; } if (num2 == m_max_count - 1) { m_I[num2] = index; m_D[num2] = num; return(true); } if (m_I[num2] < 0) { m_I[num2] = index; m_D[num2] = num; } else { int num3 = m_max_count - 1; int num4 = num2 + 1; for (int i = num3; i >= num4; i += -1) { m_I[i] = m_I[i - 1]; m_D[i] = m_D[i - 1]; } m_I[num2] = index; m_D[num2] = num; } return(true); }
public static Line2 MidLine(Node2 A, Node2 B) { Line2 line2; if (Math.Abs(A.DistanceSquared(B)) < Line2.tolerance) { line2 = (Line2)null; } else { double nAx = 0.5 * (A.x + B.x); double nAy = 0.5 * (A.y + B.y); double num1 = B.x - A.x; double num2 = B.y - A.y; line2 = new Line2(nAx, nAy, nAx + num2, nAy - num1); } return(line2); }
public static Line2 MidLine(Node2 A, Node2 B, double Wa, double Wb) { Line2 line2; if (Math.Abs(A.DistanceSquared(B)) < Line2.tolerance) { line2 = (Line2)null; } else { double num1 = Wa / (Wa + Wb); double nAx = A.x + num1 * (B.x - A.x); double nAy = A.y + num1 * (B.y - A.y); double num2 = B.x - A.x; double num3 = B.y - A.y; line2 = new Line2(nAx, nAy, nAx + num3, nAy - num2); } return(line2); }