How to rotate a triangle to a certain angle in pygame?

你离开我真会死。 提交于 2021-02-13 05:41:47

问题


I need to rotate a triangle (Not an image) around at the center of the screen. I have seen other people answer this question, but the triangle could not point upwards.

I have tried to use other peoples functions, but they see to only work partly, like the function I mentioned above.

import pygame
disp=pygame.display.set_mode((200,200))
import math
def rotate_triange(mouse_pos,triangle_pos):
    #The code here
import time
while True:
    time.sleep(1)
    pygame.Surface.fill(disp,(255,255,255))
    center = (100,100)
    radius = 10
    mouse_position = pygame.mouse.get_pos()
    for event in pygame.event.get():
            pass 
    points = rotate_triangle((100,100),mouse_position)
    pygame.draw.polygon(disp,(0,0,0),points)
    pygame.display.update()

回答1:


In pygame 2 dimensional vector arithmetic is implemented in pygame.math.Vector2.

Define a Vector2 object for the mouse position and the center of the triangle. Calculate the angle of vector form the center point to the mouse position (.angle_to()):

vMouse  = pygame.math.Vector2(mouse_pos)
vCenter = pygame.math.Vector2(center)
angle   = pygame.math.Vector2().angle_to(vMouse - vCenter)

Define the 3 points of the triangle around the (0, 0) and rotate them by the angle (.rotate())

points = [(-0.5, -0.866), (-0.5, 0.866), (2.0, 0.0)]
rotated_point = [pygame.math.Vector2(p).rotate(angle) for p in points]

To calculate the final points, the points have to b scaled and translated by the center of the triangle:

triangle_points = [(vCenter + p*scale) for p in rotated_point]

See the example:

import pygame
import math

def rotate_triangle(center, scale, mouse_pos):

    vMouse  = pygame.math.Vector2(mouse_pos)
    vCenter = pygame.math.Vector2(center)
    angle   = pygame.math.Vector2().angle_to(vMouse - vCenter)

    points = [(-0.5, -0.866), (-0.5, 0.866), (2.0, 0.0)]
    rotated_point = [pygame.math.Vector2(p).rotate(angle) for p in points]

    triangle_points = [(vCenter + p*scale) for p in rotated_point]
    return triangle_points

disp=pygame.display.set_mode((200,200))

run = True
while run:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    mouse_position = pygame.mouse.get_pos()
    points = rotate_triangle((100, 100), 10, mouse_position)

    pygame.Surface.fill(disp, (255,255,255))
    pygame.draw.polygon(disp, (0,0,0), points)
    pygame.display.update()

A version of the algorithm, without the use of pygame.math.Vector2, looks as follows:

def rotate_triangle(center, scale, mouse_pos):

    dx = mouse_pos[0] - center[0]
    dy = mouse_pos[1] - center[1]
    len = math.sqrt(dx*dx + dy*dy)
    dx, dy = (dx*scale/len, dy*scale/len) if len > 0 else (1, 0)

    pts = [(-0.5, -0.866), (-0.5, 0.866), (2.0, 0.0)]
    pts = [(center[0] + p[0]*dx + p[1]*dy, center[1] + p[0]*dy - p[1]*dx) for p in pts]
    return pts

Note this version is probably faster. It needs a math.sqrt operation, in compare to math.atan2 which is probably used by .angle_to() and math.sin respectively math.cos which is probably used by .rotate(), of the former algorithm. The result coordinates are the same.



来源:https://stackoverflow.com/questions/58100335/how-to-rotate-a-triangle-to-a-certain-angle-in-pygame

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!