Алгоритм рисования стрелок на линии - PullRequest
14 голосов
/ 10 июня 2010

Есть ли у кого-нибудь алгоритм для рисования стрелки в середине заданной линии.Я искал Google, но не нашел хорошей реализации.

PS Я действительно не против языка, но было бы замечательно, если бы это была Java, так как это язык, который я использую для этого.

Заранее спасибо.

Ответы [ 2 ]

21 голосов
/ 10 июня 2010

Вот функция для рисования стрелки с головой в точке p.Вы бы установили это на середину вашей линии.dx и dy - направление линии, которое определяется выражением (x1 - x0, y1 - y0).Это даст стрелку, которая масштабируется до длины линии.Нормализуйте это направление, если хотите, чтобы стрелка всегда была одинакового размера.

private static void DrawArrow(Graphics g, Pen pen, Point p, float dx, float dy)
{
    const double cos = 0.866;
    const double sin = 0.500;
    PointF end1 = new PointF(
        (float)(p.X + (dx * cos + dy * -sin)),
        (float)(p.Y + (dx * sin + dy * cos)));
    PointF end2 = new PointF(
        (float)(p.X + (dx * cos + dy * sin)),
        (float)(p.Y + (dx * -sin + dy * cos)));
    g.DrawLine(pen, p, end1);
    g.DrawLine(pen, p, end2);
}
12 голосов
/ 15 февраля 2012

Вот способ добавить стрелку в строку.Вы просто должны дать ему координаты наконечника и хвоста стрелы.

private static void drawArrow(int tipX, int tailX, int tipY, int tailY, Graphics2D g)
{
    int arrowLength = 7; //can be adjusted
    int dx = tipX - tailX;
    int dy = tipY - tailY;

    double theta = Math.atan2(dy, dx);

    double rad = Math.toRadians(35); //35 angle, can be adjusted
    double x = tipX - arrowLength * Math.cos(theta + rad);
    double y = tipY - arrowLength * Math.sin(theta + rad);

    double phi2 = Math.toRadians(-35);//-35 angle, can be adjusted
    double x2 = tipX - arrowLength * Math.cos(theta + phi2);
    double y2 = tipY - arrowLength * Math.sin(theta + phi2);

    int[] arrowYs = new int[3];
    arrowYs[0] = tipY;
    arrowYs[1] = (int) y;
    arrowYs[2] = (int) y2;

    int[] arrowXs = new int[3];
    arrowXs[0] = tipX;
    arrowXs[1] = (int) x;
    arrowXs[2] = (int) x2;

    g.fillPolygon(arrowXs, arrowYs, 3);
}
...