Pygame:我如何使图像变亮并旋转以连接屏幕上的两个点?

时间:2019-09-26 05:25:24

标签: python pygame blit pygame-surface

这是一个测试程序。我从两个随机点和连接它们的线开始。现在,我想拍摄一个给定的图像(x,y尺寸为79 x 1080)并将其在参考线上方变白。我知道arctan会给我笛卡尔网格上的点之间的角度,但是由于y向后倾斜屏幕(x,y),因此我必须反转一些值。我对否定步骤感到困惑。

如果重复运行此命令,您将看到图像始终与直线平行,有时位于顶部,但不一致。

import math
import pygame
import random
pygame.init()
screen = pygame.display.set_mode((600,600))

#target = (126, 270)
#start = (234, 54)
target = (random.randrange(600), random.randrange(600))
start = (random.randrange(600), random.randrange(600))
BLACK = (0,0,0)
BLUE = (0,0,128)
GREEN = (0,128,0)

pygame.draw.circle(screen, GREEN, start, 15)
pygame.draw.circle(screen, BLUE, target, 15)
pygame.draw.line(screen, BLUE, start, target, 5)                        
route = pygame.Surface((79,1080))
route.set_colorkey(BLACK)
BMP = pygame.image.load('art/trade_route00.png').convert()
(bx, by, bwidth, bheight) = route.get_rect()
route.blit(BMP, (0,0), area=route.get_rect())
# get distance within screen in pixels
dist = math.sqrt((start[0] - target[0])**2 + (start[1] - target[1])**2)
# scale to fit: use distance between points, and make width extra skinny.
route = pygame.transform.scale(route, (int(bwidth * dist/bwidth * 0.05), int( bheight * dist/bheight)))
# and rotate... (invert, as negative is for clockwise)
angle = math.degrees(math.atan2(-1*(target[1]-start[1]), target[0]-start[0]))
route = pygame.transform.rotate(route, angle + 90 )
position = route.get_rect()
HERE = (abs(target[0] - position[2]), target[1]) # - position[3]/2)
print(HERE)
screen.blit(route, HERE)
pygame.display.update()
print(start, target, dist, angle, position)

enter image description here

1 个答案:

答案 0 :(得分:2)

主要问题

错误并非是由于旋转时的y坐标倒数(顶部为0,底部为max)引起的。那部分是正确的。错误在这里:

HERE = (abs(target[0] - position[2]), target[1]) # - position[3]/2)

HERE必须是矩形的左上角的坐标,该坐标上刻有由蓝线连接的绿色和蓝色点。在这些坐标处,需要在重新缩放后放置表面route

您可以通过执行以下操作获得此顶点:

HERE = (min(start[0], target[0]), min(start[1], target[1])) 

这应该可以解决问题,并且您的彩色圆点应该位于蓝线上。

旁注

您可能希望修复的另一件事是route的缩放参数:

route = pygame.transform.scale(route, (int(bwidth * dist/bwidth * 0.05), int( bheight * dist/bheight)))

如果我的猜测是正确的,并且您想在重新缩放后的route中保留原始的宽度/高度比(因为您的原始图像不是正方形),则应该为:

route = pygame.transform.scale(route, (int(dist* bwidth/bheight), int(dist)))

假设您希望将高度(原件中较大的尺寸)缩放为dist。因此,您可能不需要0.05,或者可以使用其他收缩参数(可能0.05会使其收缩太多)。