python - Pygame:如何位图传输和旋转图像以连接屏幕上的两个点?

标签 python pygame blit pygame-surface

这是一个测试程序。我从两个随机点和连接它们的线开始。现在,我想拍摄给定的图像(x,y 尺寸为 79 x 1080)并将其位 block 传输到引导线的顶部。我知道 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

最佳答案

主要问题

该错误不是由于旋转时的逆 y 坐标(顶部为 0,底部为最大值)造成的,正如您所想的那样。那部分是正确的。错误在这里:

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

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

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

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 = pygame.transform.scale(route, (int(dist* bwidth/bheight), int(dist)))

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

关于python - Pygame:如何位图传输和旋转图像以连接屏幕上的两个点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58110076/

相关文章:

python - 类型错误 : object of type 'Tensor' has no len() when using a custom metric in Tensorflow

python - 在 ubuntu 16.04 中安装 Python 2.7.6

python - 您可以在 pygame 中重复打印整个矩形长度的图像吗?

c++ - Qt使用离屏渲染的例子

Python、QT 和 matplotlib 散点图与 blitting

python - 在 linux mint 中安装 WxPython 时出错

python - crontab 找不到 python 模块

python - 软件设计与开发专业 : Pygame Smudge Trails

python - PyGame 负色/表面

python - 在 Mac OS X 上使用 Python3 的 Pygame