private static double incidenceLineCircle(NPoint point1, NPoint point2, double radius) { double determinant = point1.CrossProduct(point2); double lineLength = Algebra.SRSS((point2.X - point1.X), (point2.Y - point1.Y)); return(incidenceLineCircle(radius, lineLength, determinant)); }
/// <summary> /// The y-coordinates of a line intersecting a circle centered at 0,0. /// </summary> /// <param name="point1">First point forming the line.</param> /// <param name="point2">Second point forming the line.</param> /// <param name="radius">Radius of the circle centered at 0,0.</param> public static double[] CircleLineIntersectY(NPoint point1, NPoint point2, double radius) { Offset delta = new Offset(point1, point2); double determinant = point1.CrossProduct(point2); double lineLength = Algebra.SRSS(delta.X(), delta.Y()); double incidence = incidenceLineCircle(radius, lineLength, determinant); return(CircleLineIntersectY(radius, lineLength, incidence, determinant, delta)); }
/// <summary> /// /// </summary> /// <param name="point1"></param> /// <param name="point2"></param> /// <param name="radius"></param> /// <returns></returns> public static NPoint[] CircleLineIntersect(NPoint point1, NPoint point2, double radius) { Offset delta = new Offset(point1, point2); double determinant = point1.CrossProduct(point2); double lineLength = Algebra.SRSS(delta.X(), delta.Y()); double incidence = incidenceLineCircle(radius, lineLength, determinant); double[] xCoords = CircleLineIntersectX(radius, lineLength, incidence, determinant, delta); double[] yCoords = CircleLineIntersectY(radius, lineLength, incidence, determinant, delta); return(new[] { new NPoint(xCoords[0], yCoords[0]), new NPoint(xCoords[1], yCoords[1]) }); }