我想要编写一个程序,能够交互地创建一组矩形并进行2D变换的代码
时间: 2024-04-29 11:23:11 浏览: 21
以下是一个示例程序,可以交互地创建矩形并进行平移、旋转和缩放变换:
```python
import pygame
import math
# 初始化pygame
pygame.init()
# 设置窗口尺寸和标题
size = (800, 600)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Interactive Rectangles Transform")
# 定义颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
# 定义矩形类
class Rectangle:
def __init__(self, pos, size):
self.pos = pos
self.size = size
self.angle = 0
self.scale = 1
def draw(self, surface):
# 计算矩形的四个顶点坐标
vertices = [
(self.pos[0] - self.size[0] / 2, self.pos[1] - self.size[1] / 2),
(self.pos[0] + self.size[0] / 2, self.pos[1] - self.size[1] / 2),
(self.pos[0] + self.size[0] / 2, self.pos[1] + self.size[1] / 2),
(self.pos[0] - self.size[0] / 2, self.pos[1] + self.size[1] / 2)
]
# 将四个顶点坐标按照当前角度和缩放比例进行变换
vertices = [self._rotate_and_scale_vertex(v) for v in vertices]
# 绘制矩形
pygame.draw.polygon(surface, RED, vertices)
def translate(self, dx, dy):
# 平移矩形
self.pos = (self.pos[0] + dx, self.pos[1] + dy)
def rotate(self, angle):
# 旋转矩形
self.angle += angle
def scale_up(self):
# 放大矩形
self.scale *= 1.1
def scale_down(self):
# 缩小矩形
self.scale /= 1.1
def _rotate_and_scale_vertex(self, vertex):
# 将一个顶点进行旋转和缩放变换
dx = vertex[0] - self.pos[0]
dy = vertex[1] - self.pos[1]
r = math.sqrt(dx**2 + dy**2)
theta = math.atan2(dy, dx) + math.radians(self.angle)
x = self.pos[0] + r * math.cos(theta) * self.scale
y = self.pos[1] + r * math.sin(theta) * self.scale
return (x, y)
# 创建一个矩形列表
rectangles = []
# 运行主循环
done = False
while not done:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
elif event.type == pygame.MOUSEBUTTONDOWN:
# 创建一个新矩形并添加到列表中
pos = pygame.mouse.get_pos()
size = (50, 50)
rectangles.append(Rectangle(pos, size))
elif event.type == pygame.KEYDOWN:
# 对所有矩形进行变换
if event.key == pygame.K_UP:
for rectangle in rectangles:
rectangle.translate(0, -10)
elif event.key == pygame.K_DOWN:
for rectangle in rectangles:
rectangle.translate(0, 10)
elif event.key == pygame.K_LEFT:
for rectangle in rectangles:
rectangle.translate(-10, 0)
elif event.key == pygame.K_RIGHT:
for rectangle in rectangles:
rectangle.translate(10, 0)
elif event.key == pygame.K_r:
for rectangle in rectangles:
rectangle.rotate(10)
elif event.key == pygame.K_s:
for rectangle in rectangles:
rectangle.scale_up()
elif event.key == pygame.K_a:
for rectangle in rectangles:
rectangle.scale_down()
# 绘制背景和所有矩形
screen.fill(WHITE)
for rectangle in rectangles:
rectangle.draw(screen)
# 更新屏幕
pygame.display.update()
# 退出pygame
pygame.quit()
```
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)