Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何找到椭圆和直线的交点?_Java_Geometry_Coordinates - Fatal编程技术网

Java 如何找到椭圆和直线的交点?

Java 如何找到椭圆和直线的交点?,java,geometry,coordinates,Java,Geometry,Coordinates,我完全卡住了。 我有一个椭圆和一条线。直线由两个点设置,椭圆-由左下角和右上角设置。我必须用java找到它们的交点。 我试图解一个方程组: (1) y = kx + m; x^2/a^2 + y^2/b^2 = 1; 但我不能让事情正常运转。我想这是因为java的坐标系,但也可能是我自己的错误,因为我对它感到困惑 有没有更好的方法找到交叉点?如果没有,我如何才能正确地找到它们 先谢谢你 代码: Java不能解决代数问题,但一旦你告诉它要计算什么,它就可以计算出解决方案 听起来你只需要将椭圆方程

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

(1) y = kx + m;
x^2/a^2 + y^2/b^2 = 1;
但我不能让事情正常运转。我想这是因为java的坐标系,但也可能是我自己的错误,因为我对它感到困惑

有没有更好的方法找到交叉点?如果没有,我如何才能正确地找到它们

先谢谢你

代码:


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

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


在您的特定情况下,您希望使用Java作为一个简单的计算器…

Java无法解决代数问题,但一旦您告诉它要计算什么,它就可以计算出解决方案

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


在您的特殊情况下,您想使用Java作为一个简单的计算器…

您能把您的代码放好让我们看看它是否正确吗

无论如何,这里有一个算法:


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

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

无论如何,这里有一个算法:


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

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

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

这可能与最初的问题所有者不再相关,但由于我遇到了相同的问题,让我给出我的答案

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

Line2D.Double line=newline2d.Double(x1,y1,x2,y2);
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;
    }
}
Ellipse2D.Double椭圆=新的Ellipse2D.Double(x,y,宽度,高度); int分辨率=1000; int x_distance=ellipse.getWidth()/2; int y_distance=ellipse.getHeight()/2; 双角度=360.0/(双)分辨率; 点中心=新点(宽度/2,高度/2); 点=新点(); for(int index=0;index
Line2D.Double line=新的Line2D.Double(x1,y1,x2,y2);
Ellipse2D.Double椭圆=新的Ellipse2D.Double(x,y,宽度,高度);
int分辨率=1000;
int x_distance=ellipse.getWidth()/2;
int y_distance=ellipse.getHeight()/2;
双角度=360.0/(双)分辨率;
点中心=新点(宽度/2,高度/2);
点=新点();
for(int index=0;index
您需要一组方程,然后需要求解它们。看来你正在这么做,那么你到底面临什么问题呢?从你的照片上看不太清楚