2010-03-26 62 views
2

箭頭我有這樣的代碼:畫上線

CGPoint arrowMiddle = CGPointMake((arrowOne.x + arrowTo.x)/2, (arrowOne.y + arrowTo.y)/2); 

CGPoint arrowLeft = CGPointMake(arrowMiddle.x-40, arrowMiddle.y); 
CGPoint arrowRight = CGPointMake(arrowMiddle.x, arrowMiddle.y + 40); 

[arrowPath addLineToScreenPoint:arrowLeft]; 
[arrowPath addLineToScreenPoint:arrowMiddle]; 
[arrowPath addLineToScreenPoint:arrowRight]; 
[[mapContents overlay] addSublayer:arrowPath]; 
[arrowPath release]; 

與此輸出:

http://img517.yfrog.com/img517/7690/schermafbeelding2010032.png

我有什麼補充,以獲得左側和右側的相同程度的線+ 30°。

如果有人擁有在一條線上繪製箭頭的算法,請給予它。不要緊,它是什麼編程語言...

謝謝

回答

3

這是你做什麼。首先,取線的矢量,並通過將其除以長度來對其進行歸一化 - 這將爲您提供長度爲1的矢量,指向線的方向。接下來,乘以你需要的長度。將其旋轉120°和-120°以製作箭頭。最後,用你想要的座標抵消它。下面是它在代碼中的樣子:

// calculate the position of the arrow 
CGPoint arrowMiddle; 
arrowMiddle.x = (arrowOne.x + arrowTo.x)/2; 
arrowMiddle.y = (arrowOne.y + arrowTo.y)/2; 

// create a line vector 
CGPoint v; 
v.x = arrowTo.x - arrowOne.x; 
v.y = arrowTo.y - arrowOne.y; 

// normalize it and multiply by needed length 
CGFloat length = sqrt(v.x * v.x + v.y * v.y); 
v.x = 40 * (v.x/length); 
v.y = 40 * (v.y/length); 

// turn it by 120° and offset to position 
CGPoint arrowLeft = CGPointApplyAffineTransform(v, CGAffineTransformMakeRotation(3.14 * 2/3)); 
arrowLeft.x = arrowLeft.x + arrowMiddle.x; 
arrowLeft.y = arrowLeft.y + arrowMiddle.y; 

// turn it by -120° and offset to position 
CGPoint arrowRight = CGPointApplyAffineTransform(v, CGAffineTransformMakeRotation(-3.14 * 2/3)); 
arrowRight.x = arrowRight.x + arrowMiddle.x; 
arrowRight.y = arrowRight.y + arrowMiddle.y; 
+0

perrrrrrrrrrrrrrfect !!!! – SpaceDog 2011-03-24 19:00:50

1

感謝您的回覆! 與此同時,我發現了一個解決方案。

是這樣的:


double slopy , cosy , siny; 
       double Par = 10.0; //length of Arrow (>) 
       slopy = atan2((arrowOne.y - arrowTo.y), 
           (arrowOne.x - arrowTo.x)); 
       cosy = cos(slopy); 
       siny = sin(slopy); //need math.h for these functions

  CGPoint arrowMiddle = CGPointMake((arrowOne.x + arrowTo.x)/2, (arrowOne.y + arrowTo.y)/2); 
      [arrowPath addLineToScreenPoint:arrowMiddle]; 

      CGPoint arrowLeft = CGPointMake(arrowMiddle.x + round(- Par * cosy - (Par/2.0 * siny)), arrowMiddle.y + round(- Par * siny + (Par/2.0 * cosy))); 
      [arrowPath addLineToScreenPoint:arrowLeft]; 

      CGPoint arrowRight = CGPointMake(arrowMiddle.x + round(- Par * cosy + (Par/2.0 * siny)),arrowMiddle.y - round(Par/2.0 * cosy + Par * siny)); 
      [arrowPath addLineToScreenPoint:arrowRight]; 

      [arrowPath addLineToScreenPoint:arrowMiddle]; 
      [[mapContents overlay] addSublayer:arrowPath]; 
      [arrowPath release]; 

這裏唯一的問題是,我畫它喜歡它是一個RMPath(路由我的框架),而箭頭變大了/當你放大小輸入/輸出。

但是,非常感謝您的回覆,我會研究一下哪些代碼最具性能。

+0

完美,這就是我一整天都在尋找的東西。謝啦。 – Bakhtiyor 2011-06-07 19:43:26