您的计算似乎很长,我看不到您测试的不同案例的使用。无论如何,由于我发现了有趣的问题,所以我尝试自己解决该问题,并提出了以下解决方案。随意更换
doubleradius的
int radius,并使用
IntPointS,但是要知道,你每次投,如评论,一点效果都没有准确的整数交点将成为讨论错误的时间。
进行计算的背景是这样的:从点A开始,矢量AB的缩放版本指向圆上的点。该点具有距中心的距离半径。因此,| AC + scaleFactor * AB | =
r。
import java.util.Arrays;import java.util.Collections;import java.util.List;public class CircleLine { public static List<Point> 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 < 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))); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)