创建箭头类

时间:2013-06-21 17:33:58

标签: c++

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

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坐标。

感谢您的帮助。

2 个答案:

答案 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简易),并通过增加这两个的倍数(因子确定箭头的长度和宽度)得到缺失的两个点单位向量到终点。