我正在尝试创建一个带两个点的箭头类。这就是我所拥有的:
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坐标),(箭头相对于箭头的y点坐标) p2).x和.y表示法返回Point p的x和y坐标。
感谢您的帮助。
答案 0 :(得分: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
比将int
存储在弧度中要join_angle
好得多。
答案 1 :(得分:0)
你不需要像atan这样的三角函数。只需将矢量从p1归一化到p2(你需要sqrt),得到正交矢量(2D简易),并通过增加这两个的倍数(因子确定箭头的长度和宽度)得到缺失的两个点单位向量到终点。