2017-04-03 7 views
0

J'ai un problème avec ce code, parce que je veux 4 points, (qui sont des cercles) pour faire le sommet du carré, mais je ne sais pas quelle devrait être la différence être entre ces vertex (variable "change"). J'ai laissé cette variable vide, s'il vous plaît, pouvez-vous me donner la valeur que je devrais insérer là et expliquer pourquoi?Python - Pygame: "Coordonnées du carré sur le sinus"

Voici le code:

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

Bienvenue dans StackOverflow. Veuillez lire et suivre les consignes de publication dans la documentation d'aide. [Exemple minimal, complet, vérifiable] (http://stackoverflow.com/help/mcve) s'applique ici. Nous ne pouvons pas vous aider efficacement tant que vous n'afficherez pas votre code MCVE et que vous ne décrivez pas précisément le problème. Spécifiquement, affichez votre meilleure tentative et la sortie incorrecte. – Prune

Répondre

1

Les angles du centre d'un carré pour les sommets de carrés diffèrent de 90 degrés, ou pi/2 radians (qui est l'unité attendue par les fonctions de python sin et cos).

Vous pourrait définir la variable change pourrait être à pi/2 (après avoir ajouté pi à la liste des noms à importer à partir du module math) et votre code fonctionnerait probablement.

Mais il est encore plus facile de calculer les coordonnées que cela, comme la rotation de 90 degrés modifier les valeurs de sinus et cosinus de manière prévisible:

  • sin(a + pi/2) est cos(a)
  • cos(a + pi/2) est -sin(a).

L'application répétée de cette transformation vous permet de déterminer les sinus et les cosinus après d'autres rotations.

Vous devez seulement appeler sin et cos une fois chacun, puis vous pouvez utiliser les valeurs pour trouver toutes les coordonnées.

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) 

Notez que dans le code ci-dessus que je suis la convention mathématique que les angles commencent à zéro le long des x positifs et -axis que vous commencez à augmenter d'abord tourner vers les y positives -axis (qui sera dans le sens horaire le système de coordonnées de pygame). Votre code précédent semblait mesurer les angles de l'axe positif y et augmenter dans la direction opposée. Si c'est ce que vous voulez vraiment, vous pouvez simplement inverser x et y dans les affectations initiales (affecter le cosinus à y et le sinus à x).

+0

Merci beaucoup. Bien que je ne suis pas sûr si je comprends tout, mais je comprends le principal;). Merci encore –