Нарисовать стрелку на линейном алгоритме

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

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

Спасибо заранее.

Ответы

Ответ 1

Здесь функция для рисования стрелки с головой в точке 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);
}

Ответ 2

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

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);
}