2013-06-21 78 views
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座標),(箭頭的後面的y座標相對於P2),該.X和.Y記號返回X和p點的y座標。

感謝您的任何幫助。

+0

箭與什麼之間的夾角? 'atan2'(http://en.cppreference.com/w/c/numeric/math/atan2)可能會有所幫助。 – aschepler

+0

您需要計算線x,y - x1,y1的斜率,然後使用一些預定義(或可能的話)使用源自箭頭軸末端的點 - 斜距計算箭頭的端點從軸的長度算起)與箭頭大小的距離。 – Joe

+0

@aschpler:謝謝,我認爲它需要一些關於atan()。我會研究這一點。我的意思是線條本身和箭頭線之間的角度。 – Hosch250

回答

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來加上或減去斜率的角度以創建箭頭線的角度,另一個用於長度,並且它處理基本點座標本身。

除了doubleint以弧度爲存儲join_angle好得多。

+0

謝謝。這是非常乾淨整潔的。我之前從未使用atan2(),所以我不知道如何使用它。我會研究你的例子,直到我得到它。這對我遇到的其他問題會非常有幫助。 – Hosch250

0

你不需要像atan那樣的三角函數。只需對從p1到p2的矢量進行歸一化(您需要sqrt),然後獲得正交矢量(2D),並通過添加倍數(因子決定箭頭的長度和寬度)來得到缺失的兩點單位矢量到終點。