You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pygame中如何调整旋转矩形的尺寸使其小于关联图片大小

Pygame旋转矩形缩小尺寸的问题修复

问题原因

Pygame的Rect对象所有坐标、尺寸属性是联动的:当你修改topleft属性后,Rect的宽度会自动变化,此时再修改topright属性会直接覆盖上一步的调整,最终尺寸会回弹到和原图一致的初始值,所以修改不生效。

解决方法

不要通过修改两个顶点的方式调整矩形尺寸,先直接修改Rect的宽高参数,再对齐中心即可。你可以把内边距做成可配置的参数,灵活调整矩形的缩小幅度。

修正后的核心函数

def draw_rect_angle(surf, rect, pivot, angle, padding=25):   
    # 先缩小矩形尺寸,padding是四周向内缩的距离
    shrinked_rect = pygame.Rect(
        rect.left + padding,
        rect.top + padding,
        rect.width - padding * 2,
        rect.height - padding * 2
    )
    # 再取四个顶点做旋转计算
    pts = [shrinked_rect.topleft, shrinked_rect.topright, shrinked_rect.bottomright, shrinked_rect.bottomleft]
    pts = [(pygame.math.Vector2(p) - pivot).rotate(-angle) + pivot for p in pts]
    pygame.draw.lines(surf, (255, 255, 0), True, pts, 3)

调用说明

调用函数时可以自定义padding参数调整缩进幅度,不传则默认使用25的缩进值:

# 主循环内调用示例,设置30像素缩进
draw_rect_angle(screen, rect, screen_center, angle, padding=30)

完整可运行代码

import pygame

pygame.init()
screen = pygame.display.set_mode((400, 400))
font = pygame.font.SysFont(None, 50)
clock = pygame.time.Clock()

#orig_image = font.render("rotated rectangle", True, (255, 0, 0))
angle =0
orig_image = pygame.image.load("Bilder/baum2.png")
rotated_image = pygame.transform.rotate(orig_image, angle)

def draw_rect_angle(surf, rect, pivot, angle, padding=25):   
    shrinked_rect = pygame.Rect(
        rect.left + padding,
        rect.top + padding,
        rect.width - padding * 2,
        rect.height - padding * 2
    )
    pts = [shrinked_rect.topleft, shrinked_rect.topright, shrinked_rect.bottomright, shrinked_rect.bottomleft]
    pts = [(pygame.math.Vector2(p) - pivot).rotate(-angle) + pivot for p in pts]
    pygame.draw.lines(surf, (255, 255, 0), True, pts, 3)

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False    

    screen.fill(0)
    screen_center = screen.get_rect().center
    screen.blit(rotated_image, rotated_image.get_rect(center = screen_center))
    rect = orig_image.get_rect(center = screen_center)
    draw_rect_angle(screen, rect, screen_center, angle)
    pygame.display.flip()

pygame.quit()
exit()

内容的提问来源于stack exchange,提问作者Joachim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:15:03