1

我完全被困住了。我有一个椭圆和一条线。线由两个点设置,椭圆 - 由左下角和右上角。我必须使用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;
4

4 回答 4

2

Java 不能解决代数问题,但是一旦你告诉它要计算什么,它就可以计算出解决方案。

听起来您只需y将椭圆方程中的您替换为kx+m然后求解 x。看起来这是一个简单的二项式方程。x=...编写一个基于 k、m、a 和 b计算的程序。如果你告诉它要计算什么以及 k、m、a 和 b 的值是什么,Java 可以帮助你计算根。

在您的特定情况下,您想将 Java 用作简单的计算器......

于 2012-05-21T20:24:11.293 回答
2

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

我可以看到原始计算中有三个错误:(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);

作为最后一点,请注意这会分解为垂直线,因为 then r2 = 0sok没有定义。

于 2013-05-12T08:07:12.950 回答
1

能否请您输入您的代码,以便我们查看它是否正确?

无论如何,这是一个算法: http: //mathworld.wolfram.com/Ellipse-LineIntersection.html

请注意,由于它有一个平方根,您可能会得到一个不精确的解决方案。

于 2012-05-21T20:30:48.117 回答
0
Line2D.Double line = new Line2D.Double(x1,y1,x2,y2);

Ellipse2D.Double ellipse = new Ellipse2D.Double(x,y,width,height);

int resolution = 1000;
int x_distance = ellipse.getWidth()/2;
int y_distance = ellipse.getHeight()/2;

double angle = 360.0/(double)resolution;

Point center = new Point(width/2,height/2);
Point point = new Point();

for (int index = 0; index < resolution; index++)
{
    int x = (center.x+x_distance)*Math.sin(Math.toRadians(angle*index)));
    int y = (center.y+y_distance)*Math.cos(Math.toRadians(angle*index)));

    Ellipse2D.Double dot = new Ellipse2D.Double(x,y,1,1);

    if (line.intersects(dot.getBounds()))
    {
       point.setLocation(x,y);
       index = resolution;
    }
}
于 2016-11-29T11:00:44.290 回答