2017-04-03 230 views
0

我有這個代碼的問題,因爲我想要4個點(圓圈)來製作正方形的頂點,但我不知道區別應該是什麼在這些頂點之間(變量「變化」)。我把這個變量留空了,請你給我值,我應該插入並解釋爲什麼?Python - Pygame:「座標上的正方形的座標」

下面的代碼:

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度,或pi/2弧度(其是由Python的sincos功能所期望的單元)不同。

所以,你可以設置change變量可能是pi/2(後增加至pi名稱列表,從math模塊導入),你的代碼可能會工作。

但它更容易計算比座標,如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) 

注意,在上面的代碼,我認爲以下角度開始在沿正x軸零,隨着您最初開始朝着積極y軸旋轉(這將是順時針的數學約定pygame的座標系)。你以前的代碼似乎從正面y軸測量角度,並在相反的方向上增加。如果這是您真正想要的,您可以在初始分配中簡單地反轉xy(將餘弦分配給y,將正弦分配給x)。

+0

非常感謝。儘管我不確定我是否瞭解所有內容,但我明白主要內容;)。再次感謝 –