2017-12-09 15 views
0

私はJavaでプロジェクトを進めています。私はポイント、p3p4を点p1とは反対の円の外にちょうど移動しようとしています。以下は、問題を説明するイメージです、私は解決しようとしています。逆方向の移動ポイント

Moving Points to the edge of the circle

//given two points, calculates the angle 
public static double calcAngle(Point2D.Double p1, Point2D.Double p2) { 
    double deltaX = p2.x - p1.x; 
    double deltaY = p2.y - p1.y; 
    return (Math.atan2(deltaY, deltaX) * 180/Math.PI); 
} 

//calculates a point on a circle given the angle, center of the circle and the radius 
public static Point2D.Double pointOnCircle(Point2D.Double point, double radius , double angle) { 
    double x = Math.abs(point.x + (radius * Math.cos(angle * Math.PI/180F))); 
    double y = Math.abs(point.y + (radius * Math.sin(angle * Math.PI/180F))); 
    return new Point2D.Double(x,y); 
} 

どのように私は、Javaで角度がポイントp2のそれぞれのためのシステムおよび送信先の座標を座標計算p3p4のですか?

私は上記のコードをまだ試していません。より大きなプロジェクトの一部であるため、私のアプローチが正しいかどうかを知りたいと思います。前もって感謝します!

+1

これ以上の説明がなければ、あなたは正しい方向に動いていると言いたいと思います。 – MadProgrammer

+1

上記はうまくいきますが、角度と三角法を使うのは面倒です。代わりにベクトル演算を使用してください。 – meowgoesthedog

答えて

1

一般的な考え方は実行可能だが、過度に複雑に思える。 x/yベクトルから角度に変換して戻す必要はありません。まったくスケーリングベクトルで十分です。

Point2D p = p2; // likewise for p3, p4 
double factor = radius/p.distance(p1); 
p.setLocation(p1.getX() + (p.getX() - p1.getX())*factor, 
       p1.getY() + (p.getY() - p1.getY())*factor); 

これは、p向かっすなわちp1からベクトルポインティングベクトル(p - p1)をとるfactorことによってそれをスケーリングし、p1の位置に追加します。 factorは、新しい距離がradiusに等しくなるように選択されます。

p1pが同じ場合、このすべてが失敗します。この場合、ゼロで除算されるためです。これが問題になる場合は、factorが有限数であることを確認してください。 Double.isFinite(double)を使用してください。

関連する問題