2

我正在尝试创建一个需要两个点的箭头类。这就是我所拥有的:

struct Arrow : Lines {              // an Arrow is a Line that has an arrow at the end
    Arrow(Point p1, Point p2)       // construct an Arrow from two points
        :p1(p1), p2(p2) {}
    void draw_lines() const;

    Point p1;
    Point p2;
};

这就是我所拥有的 draw_lines() const 函数:

void Arrow::draw_lines() const
{
    Lines arrow;
    arrow.add(p1, p2);
    arrow.draw_lines();

}

它通过键入来工作Arrow a(Point(x,y), Point(x1,y1));。然后应该使用 (x,y) 来计算箭头,它变成 p1,和 (x1,y1),它变成 p2,作为方向的指南,并且 (x1,y1) 作为箭头基点。我希望箭头看起来像这样,只有实心:--->。如何计算箭头指向的角度?箭头的线条需要为两个x,y坐标,如(p2.x,p2.y,(箭头后点相对于p2的x坐标),(箭头后点相对于p2的y坐标p2). .x 和 .y 表示法返回点 p 的 x 和 y 坐标。

感谢您的任何帮助。

4

2 回答 2

1

这是使用atan2.

const double pi = 3.1415926535897931;
const int r = 5;
const double join_angle = pi / 6.0; // 30 degrees
const double stem_angle = atan2(p2.y-p1.y, p2.x-p1.x);

Lines arrow;
arrow.add(p1, p2);
arrow.add(p2, Point(p2.x - r*cos(stem_angle+join_angle), p2.y - r*sin(stem_angle+join_angle)));
arrow.add(p2, Point(p2.x - r*cos(stem_angle-join_angle), p2.y - r*sin(stem_angle-join_angle)));

这正是您在评论中描述的方法:

理想情况下,我想输入一个 const int 来添加或减去斜坡的角度以创建箭头线的角度,另一个用于长度,它会处理细节点坐标本身。

除了这比存储弧度double要好得多。intjoin_angle

于 2013-06-25T20:15:27.157 回答
0

您不需要像 atan 这样的三角函数。只需将向量从 p1 归一化到 p2 (你需要 sqrt ),得到正交向量(在 2D 中很容易)并通过添加这两个的倍数(因素决定箭头的长度和宽度)来获得缺失的两个点单位向量到终点。

于 2013-06-25T21:33:30.170 回答