繁体   English   中英

Python-Pygame:“窦上正方形的坐标”

[英]Python - Pygame: “Co-ordinates of square on sinus”

我的代码有问题,因为我想要4个点(是圆形)来形成正方形的顶点,但是我不知道这些顶点(变量“变化”)之间应该有什么区别。 我将此变量留空,请给我值,我应该在此插入并解释原因?

这是代码:

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()

从正方形中心到正方形顶点的角度相差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 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM