2017-04-20 29 views
3

Pygameでは、矢印の始点と終点を与えられた矢印の頭の3点の座標をどのようにして計算できますか?線と同じ方向の点は?PyGameの線の方向に続く矢印の描画

def __draw_arrow(self, screen, colour, start, end):  
    start = self.__coordinate_lookup[start] 
    end = self.__coordinate_lookup[end] 
    dX = start[0] - end[0] 
    dY = -(start[1] - end[1]) 
    print m.degrees(m.atan(dX/dY)) + 360 
    pygame.draw.line(screen,colour,start,end,2) 

私は角度で遊んで試してみたと直線の勾配で、Yは、下向きの代わりに、上向きに上昇を調整する事実が私を投げていると私は正しい方向にナッジを本当にいただければ幸いです。

+0

startX, startY, endX, endYとして座標示す[座標はラインの端にある矢印ヘッド(isoscele三角形)を描くようにして下さい] (http://stackoverflow.com/questions/31462791/find-coordinates-to-draw-arrow-head-isoscele-triangle-at-the-end-of-a-line) – Spektre

+0

あなたが望むかもしれない重複したQAのアパートこれを見るには:[チューブの終了に基づいてシリンダーに回転を適用する](http://stackoverflow.com/a/39674497/2521214) – Spektre

答えて

1

これは動作するはずです:悪い組織符号のための

def draw_arrow(screen, colour, start, end): 
    pygame.draw.line(screen,colour,start,end,2) 
    rotation = math.degrees(math.atan2(start[1]-end[1], end[0]-start[0]))+90 
    pygame.draw.polygon(screen, (255, 0, 0), ((end[0]+20*math.sin(math.radians(rotation)), end[1]+20*math.cos(math.radians(rotation))), (end[0]+20*math.sin(math.radians(rotation-120)), end[1]+20*math.cos(math.radians(rotation-120))), (end[0]+20*math.sin(math.radians(rotation+120)), end[1]+20*math.cos(math.radians(rotation+120))))) 

申し訳ありません。しかし、あなたが言ったように、左上から始まる座標は、数学を反転させる必要があります。また、三角形をイディオティアールから他のものに変更したい場合は、4行目のrotation +/- 120を変更するか、別の半径の20*を変更するだけです。

・ホープ、このことができます:)

1

を私は開始と終了がの可能性のある重複enter image description here

dX = endX - startX 
dY = endY - startY 

//vector length 
Len = Sqrt(dX* dX + dY * dY) //use Hypot if available 

//normalized direction vector components 
udX = dX/Len 
udY = dY/Len 

//perpendicular vector 
perpX = -udY 
perpY = udX 

//points forming arrowhead 
//with length L and half-width H 
arrowend = (end) 

leftX = endX - L * udX + H * perpX 
leftY = endY - L * udY + H * perpY 

rightX = endX - L * udX - H * perpX 
rightY = endY - L * udY - H * perpY 
関連する問題