gpt4 book ai didi

java - 如何找到椭圆和线之间的交点?

转载 作者:行者123 更新时间:2023-11-29 08:06:41 24 4
gpt4 key购买 nike

我完全卡住了。我有一个椭圆和一条线。线由两点设置,椭圆 - 由左下角和右上角设置。我必须使用 java 找到它们的交点。我试图求解一个方程组:

(1) y = kx + m;
x^2/a^2 + y^2/b^2 = 1;

但我无法让事情正常进行。我认为这是因为 java 的坐标系,但也可能是我自己的错误,因为我对此感到困惑。

有没有更好的方法来找到交点,如果没有,我怎样才能正确找到它们?

提前谢谢你。

代码:

double r1 = in_y2-in_y;
double r2 = in_x2-in_x;
double k = r1/r2;
double m = in_y2 - k*in_x2;
double a = Math.abs((double)x2 - (double)x)/2;
double b = Math.abs((double)y2 - (double)y)/2;

double A1 = 1/(a*a) + (k*k)/(b*b);
double B1 = (2*k*m)/b*b;
double C1 = (m*m)/(b*b);
double D = Math.sqrt(B1*B1 - 4*A1*C1);
double ex1 = (-B1 + D/(2*A1));
double ey1 = k*ex1 + m;
double ex2 = (-B1 - D/(2*A1));
double ey2 = k*ex2 + m;

最佳答案

这可能与原来的问题所有者不再相关,但由于我遇到了同样的问题,让我提出我的答案。

我可以看到原始计算中存在三个错误:(i) @mprivat 指出的错误,(ii) B1 赋值中的括号而应该是

double B1 = (2*k*m)/(b*b);

和 (iii) 更基本的一个:所提供的计算不正确椭圆的原点。由于椭圆是由其外接边界定义的,因此无法保证它以 (0,0) 为中心。 .

我们调用中心(cx,cy) , 那么椭圆的方程就变成了

(x-cx)^2/a^2 + (y-cy)^2/b^2 = 1

而不是原来的

x^2/a^2 + y^2/b^2 = 1

我认为最简单的修复方法是翻译 wrt (cx,cy) 行并将结果翻译回来,像这样:

...
double m = (in_y2-cy) - k*(in_x2-cx);
...
double ex1 = (-B1 + D/(2*A1)) + cx;
double ey1 = k*(ex1-cx) + m + cy;
double ex2 = (-B1 - D/(2*A1)) + cx;
double ey2 = k*(ex2-cx) + m + cy;

更优雅的修复方法是求解椭圆的正确方程,但这会导致 B1 的公式更加难以理解。和 C1 :

double B1 = (2*k*(m-cy))/(b*b) - (2*cx)/(a*a);
double C1 = (m-cy)*(m-cy)/(b*b) - 1 + (cx*cx)/(a*a);

作为最后的评论,请注意这会分解为垂直线,如 r2 = 0所以k未定义。

关于java - 如何找到椭圆和线之间的交点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10691765/

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