Path を使用して、カスタム ビューで矢印を描画するアルゴリズムを考え出そうとしましたが、矢印の先端の座標を取得する方法がわかりませんでした。線の始点と終点の座標は任意で、線に対する矢印の角度と矢印の長さは固定されています。
どうにかして三角法を使わなければならないと思いますが、どうすればよいかわかりません。
Path を使用して、カスタム ビューで矢印を描画するアルゴリズムを考え出そうとしましたが、矢印の先端の座標を取得する方法がわかりませんでした。線の始点と終点の座標は任意で、線に対する矢印の角度と矢印の長さは固定されています。
どうにかして三角法を使わなければならないと思いますが、どうすればよいかわかりません。
私の友人が数学の方程式を思いついたので、ここで Java コードに変換しました。
public static void calculateArrowHead(Point start, Point end, double angleInDeg, double tipLength){
double x1 = end.getX();
double x2 = start.getX();
double y1 = end.getY();
double y2 = start.getY();
double alpha = Math.toRadians(angleInDeg);
double l1 = Math.sqrt(Math.pow(x2-x1, 2) + Math.pow(y2-y1, 2)); // length of the arrow line
double l2 = tipLength;
double a = Math.pow(y2-y1, 2) + Math.pow(x2-x1, 2);
double b = -2 * l1 * l2 * Math.cos(alpha) * (y2 - y1);
double c = Math.pow(l1, 2) * Math.pow(l2, 2) * Math.pow(Math.cos(alpha), 2) - Math.pow(l2, 2) * Math.pow(x2-x1, 2);
double s2a = (-b + Math.sqrt(Math.pow(b, 2) - 4 * a * c)) / (2 * a);
double s2b = (-b - Math.sqrt(Math.pow(b, 2) - 4 * a * c)) / (2 * a);
double s1a = (l1 * l2 * Math.cos(alpha) - s2a * (y2 - y1)) / (x2-x1);
double s1b = (l1 * l2 * Math.cos(alpha) - s2b * (y2 - y1)) / (x2-x1);
double x3a = s1a + x1;
double y3a = s2a + y1;
double x3b = s1b + x1;
double y3b = s2b + y1;
System.out.println("(A) x:" + (int)x3a + "; y:" + (int)y3a);
System.out.println("(B) x:" + (int)x3b + "; y:" + (int)y3b);
}
十分にテストしたわけではありませんが、最初の数回のテストでは正しいように見えます。