簡體   English   中英

Pygame:如何blit和旋轉圖像以連接屏幕上的兩個點?

[英]Pygame: How do I blit and rotate an image to connect two points on the screen?

這是一個測試程序。 我從兩個隨機點和連接它們的線開始。 現在,我想拍攝一個給定的圖像(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)

在此處輸入圖像描述

主要問題

錯誤不是由於您似乎認為的旋轉時的逆 y 坐標(頂部為 0,底部為最大值)造成的。 那部分是正確的。 錯誤在這里:

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

HERE必須是矩形左上角的坐標,其中包含由藍線連接的綠色和藍色點。 在這些坐標處,您需要在重新縮放后放置 Surface 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 會收縮太多)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM