2

私はpygameを使用して、2つの任意のポイントの間に線を引きます。また、線の進行方向に向かって外側を向く線の端に矢印を追加したいと思います。

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

4

4 に答える 4

9

これを行うための完全なコードは次のとおりです。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()
于 2009-03-16T16:12:37.380 に答える
2

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

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

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

これにより、-180 から 180 の範囲の角度が得られるため、0 から 360 の角度が必要になります。自分で処理する必要があります。

于 2009-03-16T15:14:25.570 に答える
1

使用する正確な関数を調べる必要がありますが、ハイポテヌスが問題の線であり、脚が軸に沿っている直角三角形を作成し、いくつかの基本的な三角法を使用して、に基づいて線の角度を計算するのはどうですか?三角形の辺の長さ?もちろん、すでに軸に位置合わせされている特殊なケースの線が必要になりますが、それは些細なことです。

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

于 2009-03-16T14:29:56.907 に答える