在Android自定义视图中在任意行的末尾绘制箭头的算法

时间:2015-01-31 11:51:04

标签: android algorithm line-drawing

我一直试图想出一个使用Path在自定义视图中绘制箭头的算法,但我还没弄明白如何获得箭头提示的坐标。线起点和终点坐标是任意的,箭头相对于线的角度和箭头的长度是固定的。

我想我必须以某种方式使用三角函数,但我不确定如何。

1 个答案:

答案 0 :(得分:0)

我的朋友提出了一个数学方程式,我在这里将其翻译成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);
}

我没有彻底测试过,但是对于前几次测试,它似乎是正确的。