Алгоритм рисования стрелки на линии

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

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

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


person nunos    schedule 09.06.2010    source источник
comment
Это стрелка, указывающая на середину строки? Или исходя из этого? Или наконечник стрелы, который проходит вдоль линии?   -  person Justin L.    schedule 10.06.2010
comment
тот, который проходит вдоль линии.   -  person nunos    schedule 10.06.2010


Ответы (2)


Вот функция для рисования стрелки с наконечником в точке 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);
}
person bbudge    schedule 10.06.2010
comment
Как можно отрегулировать размер стрелки? Мне нравится, когда он основан на длине линии, но текущее соотношение размера стрелки к размеру линии неверно для моего приложения. - person renosis; 01.02.2013

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

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);
}
person Komplot    schedule 15.02.2012