2009-03-16 15 views
2

私は任意の2つのポイント間に線を描くためにパイゲームを使用しています。私はまた、ラインが移動している方向で外側に向いているラインの最後に矢印を追加したいと思います。エンドポイントに基づく回転

最後に矢印イメージを貼り付けるだけでも簡単ですが、矢印が正しい方向を向いているように回転角度を計算する方法がわかりません。

答えて

8

これを行うための完全なコードは次のとおりです。 pygameを使用するときは、y座標が上から測定されるので、数学関数を使用するときは負の値を取ることに注意してください。ただ、上記のコードに追加する

import pygame 
import math 
import random 
pygame.init() 

screen=pygame.display.set_mode((300,300)) 
screen.fill((255,255,255)) 

pos1=random.randrange(300), random.randrange(300) 
pos2=random.randrange(300), random.randrange(300) 

pygame.draw.line(screen, (0,0,0), pos1, pos2) 

arrow=pygame.Surface((50,50)) 
arrow.fill((255,255,255)) 
pygame.draw.line(arrow, (0,0,0), (0,0), (25,25)) 
pygame.draw.line(arrow, (0,0,0), (0,50), (25,25)) 
arrow.set_colorkey((255,255,255)) 

angle=math.atan2(-(pos1[1]-pos2[1]), pos1[0]-pos2[0]) 
##Note that in pygame y=0 represents the top of the screen 
##So it is necessary to invert the y coordinate when using math 
angle=math.degrees(angle) 

def drawAng(angle, pos): 
    nar=pygame.transform.rotate(arrow,angle) 
    nrect=nar.get_rect(center=pos) 
    screen.blit(nar, nrect) 

drawAng(angle, pos1) 
angle+=180 
drawAng(angle, pos2) 
pygame.display.flip() 
1

私は、使用する正確な関数を調べる必要がありますが、斜辺が問題の行であり、脚が軸に整列している直角三角形を作成し、いくつかの基本三角法を使って三角形の辺の長さに基づいた線ですか?もちろん、すでに軸合わせされている特別な行を持たなければなりませんが、それは簡単なものです。

また、this Wikipedia article on slopeにいくつかのアイデアがあります。

+0

これはIMO最善の解決策になります。私は間違っているかもしれませんが、IIRCの式はAngle = arctan(YDiff/XDiff)です。Angleは1つの矢印の回転を制御し、((Angle + 180)%360)は他の矢印の回転を制御します。 – Sukasa

2

0度は矢印が右を指していることを意味し、90度は真上を指し、180度は左を指すことを意味します。

これを行うにはいくつかの方法がありますが、最も簡単な方法はおそらくatan2関数を使用することです。 あなたの出発点がある(x1、y1)とエンドポイントは、2つの間の線の度で、その後の角度である(X2、Y2)の場合:

import math 
deg=math.degrees(math.atan2(y2-y1,x2-x1)) 

この意志あなたの範囲の角度 - 180から180になるので、0から360まで必要とするので、自分のことを世話しなければなりません。

0

それはすぐに終了しないように、あなたはおそらくイベントループをしたいと思います:

... 
clock = pygame.time.Clock() 
running = True 

while (running): 
    clock.tick() 
関連する問題