1

私は完全に立ち往生しています。楕円と線があります。線は、楕円の2つのポイント、つまり左下隅と右上隅によって設定されます。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は代数の問題を解決できませんが、何を計算するかを指示すると、Javaは解決策を計算できます。

y楕円の方程式のを次のように置き換えて、 kx+mxを解く必要があるようです。単純な二項方程式のように見えます。x=...k、m、a、bに基づいて計算するプログラムを作成します。Javaは、何を計算するか、およびk、m、a、bの値を指定すると、ルートの計算に役立ちます。

あなたの特定のケースでは、Javaを単純な計算機として使用したいと思います...

于 2012-05-21T20:24:11.293 に答える
2

これはおそらく元の問題の所有者には関係ありませんが、同じ質問に遭遇したので、答えを提示させてください。

私が見ることができる元の計算には3つの間違いがあります:(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

于 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 に答える