質問

pygameを使用して、2つの任意のポイント間に線を引きます。また、線が移動する方向で外側を向く線の端に矢印を追加します。

最後に矢印画像を貼り付けるのは簡単ですが、矢印が正しい方向を指すように回転の角度を計算する方法はわかりません。

役に立ちましたか?

解決

これを行うための完全なコードを次に示します。 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()

他のヒント

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

これを行うにはいくつかの方法がありますが、おそらく最も簡単なのはatan2関数を使用することです。 開始点が(x1、y1)で終了点が(x2、y2)の場合、2つの間の線の角度は次のとおりです。

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

これは-180から180の範囲の角度になるので、0から360の角度が必要です。あなたは自分の世話をする必要があります。

使用する正確な関数を調べる必要がありますが、斜辺が問題の線で、脚が軸に沿った直角三角形を作成し、いくつかの基本的な三角法を使用して線の角度を計算する方法はどうですか三角形の辺の長さに基づいて?もちろん、すでに軸揃えされている特別な場合の行が必要になりますが、それは簡単なはずです。

また、斜面に関するこのウィキペディアの記事は、あなたにいくつかのアイデアを与えるかもしれません。

上記のコードに追加するだけで、すぐに終了しないようにイベントループが必要になる可能性があります。

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

while (running):
    clock.tick()
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top