gpt4 book ai didi

java - 椭圆和直线相交JAVA

转载 作者:行者123 更新时间:2023-11-30 08:22:43 25 4
gpt4 key购买 nike

我有一个椭圆,其中点为“mid”,水平半径为“h”,垂直半径为“v”,还有一个 Line2D。

现在我需要一些代码来计算两者的两个交点。我已经尝试过一些代码并自己尝试过,但总是会出错。

有人有一些工作代码吗?

最佳答案

你需要用代数来解这两个方程,而且会有点乱。首先你必须写出椭圆

(1) (x/h)^2 + (y/v)^2 = 1

和格式中的行

(2) y = ax + b

首先,在坐标轴上移动,使椭圆以原点为中心。您可以通过从该行中减去 mid 来做到这一点。计算出交点后,通过添加 mid 将它们移回。

您可以从线的起点和终点计算 delta-y/delta-x 的线性斜率。您将必须检查斜坡是否垂直。如果斜率是垂直的,你只需要检查线点的x值是否落在椭圆的位置,然后很容易计算出这些值。在纸上画出来,看看如何计算。

现在假设斜坡不是垂直的。由于您根据直线中的 x 知道 y,将其平方并代入 (1)。化简给出二次方程。

(3) ((ah)^2+v^2)x^2 + (2abh^2)x + ((hb)^2-(hv)^2) = 0

使用二次公式给出交叉点 x 坐标的两个值。如果 x 有两个实数值,则有两个交点。如果 x 只有一个实数解,则存在一个交集。如果 x 没有实解,则不存在交集。

给定 ax^2+ bx + c = 0, x 由

x = (1/2a)(-b +- Sqrt(b^2 - 4ac))

令 D = b^2 - 4ac

如果D < 0,则没有交叉点

如果D = 0,则有一个路口

如果D > 0,则有两个交点

计算出 x 交集的值后,将 x 的值代入 (2) 以获得 y 值。

现在,您需要确保这些点落在直线内。为此,只需检查计算点的 x 和 y 分量是否满足 x1 <= x <= x2 和 y1 <= y <= y2 其中 x1 是最小的,x2 是直线的最大 x 端点,y1是最小的,y2 是直线的最大 y 端点。

这是我做的一个示例方法

public static ArrayList<Point2D> getIntersection(double x1, double x2, double y1, double y2, double midX, double midY, double h, double v) {
ArrayList<Point2D> points = new ArrayList();

x1 -= midX;
y1 -= midY;

x2 -= midX;
y2 -= midY;

if (x1 == x2) {
double y = (v/h)*Math.sqrt(h*h-x1*x1);
if (Math.min(y1, y2) <= y && y <= Math.max(y1, y2)) {
points.add(new Point2D(x1+midX, y+midY);
}
if (Math.min(y1, y2) <= -y && -y <= Math.max(y1, y2)) {
points.add(newPoint2D(x1+midX, -y+midY);
}
}
else {
double a = (y2 - y1) / (x2 - x1);
double b = (y1 - a*x1);

double r = a*a*h*h + v*v;
double s = 2*a*b*h*h;
double t = h*h*b*b - h*h*v*v;

double d = s*s - 4*r*t;

if (d > 0) {
double xi1 = (-s+Math.sqrt(d))/(2*r);
double xi2 = (-s-Math.sqrt(d))/(2*r);

double yi1 = a*xi1+b;
double yi2 = a*xi2+b;

if (isPointInLine(x1, x2, y1, y2, xi1, yi1)) {
points.add(new Point2D.Double(xi1+midX, yi1+midY);
}
if (isPointInLine(x1, x2, y1, y2, xi2, yi2)) {
points.add(new Point2D.Double(xi2+midX, yi2+midY);
}
}
else if (d == 0) {
double xi = -s/(2*r);
double yi = a*xi+b;

if (isPointInLine(x1, x2, y1, y2, xi, yi)) {
points.add(new Point2D.Double(xi+midX, yi+midY));
}
}
}

return points;
}

public static boolean isPointInLine(double x1, double x2, double y1, double y2, double px, double py) {
double xMin = Math.min(x1, x2);
double xMax = Math.max(x1, x2);

double yMin = Math.min(y1, y2);
double yMax = Math.max(y1, y2);

return (xMin <= px && px <= xMax) && (yMin <= py && py <= yMax);
}

请随意检查我的代数和我的代码,但你应该通过仔细完成每个代数步骤来解决这个问题。

关于java - 椭圆和直线相交JAVA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24164485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com