Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Your calculations seem quite long, and I do not see the use of the different cases you test. Anyway, since I found the problem interesting I attempted to solve it myself and came up with the following. Feel free to replace <code>double radius</code> by <code>int radius</code> and use <code>IntPoint</code>s, but be aware that every time you cast, as discussed in the comments, results that are not exact integer intersection points will become wrong.</p> <p>The background of the calculations performed is this: From point A, a scaled version of vector AB points to a point on the circle. That point has distance radius from center. Hence, |AC + scalingFactor * AB|=r.</p> <pre><code>import java.util.Arrays; import java.util.Collections; import java.util.List; public class CircleLine { public static List&lt;Point&gt; getCircleLineIntersectionPoint(Point pointA, Point pointB, Point center, double radius) { double baX = pointB.x - pointA.x; double baY = pointB.y - pointA.y; double caX = center.x - pointA.x; double caY = center.y - pointA.y; double a = baX * baX + baY * baY; double bBy2 = baX * caX + baY * caY; double c = caX * caX + caY * caY - radius * radius; double pBy2 = bBy2 / a; double q = c / a; double disc = pBy2 * pBy2 - q; if (disc &lt; 0) { return Collections.emptyList(); } // if disc == 0 ... dealt with later double tmpSqrt = Math.sqrt(disc); double abScalingFactor1 = -pBy2 + tmpSqrt; double abScalingFactor2 = -pBy2 - tmpSqrt; Point p1 = new Point(pointA.x - baX * abScalingFactor1, pointA.y - baY * abScalingFactor1); if (disc == 0) { // abScalingFactor1 == abScalingFactor2 return Collections.singletonList(p1); } Point p2 = new Point(pointA.x - baX * abScalingFactor2, pointA.y - baY * abScalingFactor2); return Arrays.asList(p1, p2); } static class Point { double x, y; public Point(double x, double y) { this.x = x; this.y = y; } @Override public String toString() { return "Point [x=" + x + ", y=" + y + "]"; } } public static void main(String[] args) { System.out.println(getCircleLineIntersectionPoint(new Point(-3, -3), new Point(-3, 3), new Point(0, 0), 5)); System.out.println(getCircleLineIntersectionPoint(new Point(0, -2), new Point(1, -2), new Point(1, 1), 5)); System.out.println(getCircleLineIntersectionPoint(new Point(1, -1), new Point(-1, 0), new Point(-1, 1), 5)); System.out.println(getCircleLineIntersectionPoint(new Point(-3, -3), new Point(-2, -2), new Point(0, 0), Math.sqrt(2))); } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload