2017-04-03 4 views
0

私はこのコードに問題があります。四角形の頂点を作るのに4点(円です)が必要ですが、違いがどういうものであるべきかわかりませんそれらの頂点の間にある(変数 "変更")。私はこの変数を空のままにしておいてください、私にそこに挿入して理由を説明する価値がありますか?Python - Pygame: "sinusの正方形の座標"

ここでは、コードは次のとおり

import pygame 
from math import sin, cos 

pygame.init() 

screen = pygame.display.set_mode((800,600)) 

BLACK = (0,0,0) 
WHITE = (255,255,255) 
BLUE = (0,0,255) 
GRAY = (175,175,175) 

clock = pygame.time.Clock() 
Font = pygame.font.SysFont(None, 50) 

angle = 0 
angle_c = 0 
ex = False 

a = (0,0) 
b = (0,0) 
c = (0,0) 
d = (0,0) 

change = 

size = 95 

x_c = 400 
y_c = 200 

while not ex: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      ex = True 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       angle_c = 0.05 
      if event.key == pygame.K_RIGHT: 
       angle_c = -0.05 
     if event.type == pygame.KEYUP: 
      if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT: 
       angle_c = 0 

    angle += angle_c 

    a = (round(sin(angle)*size+x_c), round(cos(angle)*size+y_c)) 
    b = (round(sin(angle+change)*size+x_c), round(cos(angle+change)*size+y_c)) 
    c = (round(sin(angle+change*2)*size+x_c), round(cos(angle+change*2)*size+y_c)) 
    d = (round(sin(angle+change*3)*size+x_c), round(cos(angle+change*3)*size+y_c)) 

    screen.fill(WHITE) 

    pygame.draw.circle(screen, BLUE, (400,200), round(sin(360)*100), 3) 
    pygame.draw.circle(screen, BLUE, a, 10) 
    pygame.draw.circle(screen, WHITE, a, 8) 

    pygame.draw.circle(screen, BLUE, b, 10) 
    pygame.draw.circle(screen, WHITE, b, 8) 

    pygame.draw.circle(screen, BLUE, c, 10) 
    pygame.draw.circle(screen, WHITE, c, 8) 

    pygame.draw.circle(screen, BLUE, d, 10) 
    pygame.draw.circle(screen, WHITE, d, 8) 

    pygame.display.update() 

    clock.tick(50) 


pygame.quit() 
+2

ようこそStackOverflow。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [最小、完全で検証可能な例](http://stackoverflow.com/help/mcve)がここに適用されます。 MCVEコードを投稿して問題を正確に記述するまでは、効果的にお手伝いすることはできません。 具体的には、最適な試行と誤った出力を示します。 – Prune

答えて

1

正方形の頂点に正方形の中心からの角度が90度、又は(Pythonのsincos機能が期待する単位である)pi/2ラジアンだけ異なります。

だからmathモジュールからインポートする名前のリストにpiを追加した後)pi/2可能性がして、あなたのコードは、おそらく仕事とあなたのchange変数を設定することができます。

しかし、それは90度の回転が予測可能な方法でサインとコサイン値を変更すると、それよりも座標を計算するためにさらに簡単です:

  • sin(a + pi/2)cos(a)
  • cos(a + pi/2)-sin(a)です。

この変換を繰り返し適用すると、後続の回転後に正弦波と余弦がどのようになるべきかを把握できます。

sincosを一度呼び出すだけで、値を使用してすべての座標を見つけることができます。

y = round(sin(angle) * size) 
x = round(cos(angle) * size) 

a = (x + x_c, y + y_c) 
b = (-y + x_c, x + y_c) 
c = (-x + x_c, -y + y_c) 
d = (y + x_c, -x + y_c) 

コードで、私はあなたが最初に時計回りにされる正y - 軸(に向けて回転し始めると、正x - 軸と増加に沿ってゼロから始める角度数学的な規則を以下のよ上記のことに注意してくださいパイゲームの座標系)。あなたの以前のコードは、正の値のy軸からの角度を測定し、反対方向に増加するように見えました。これが本当に必要な場合は、最初の割り当てでとyを反転するだけです(コサインをyに、サインをxに割り当ててください)。

+0

ありがとうございます。私はすべてを理解するかどうかはわかりませんが、私はメインを理解しています;)。再度、感謝します –

関連する問題