如何用Pygame实现从大圆形到小圆形的多边形收敛过渡?
实现Pygame中从大到小圆形宽度的收敛线条效果
你当前的代码绘制的是等宽矩形线条加两个不同尺寸的圆,无法实现从大圆到小圆的渐变收敛效果。要达成目标,核心是把多边形改成梯形,让它的两个底边分别匹配两端圆形的直径,具体修改方案如下:
修改后的代码
def draw_tapered_line(surf, point_1, point_2, color, small_radius): # 定义两端圆形的半径:point1对应大圆,半径为小圆的2倍 radius_large = 2 * small_radius radius_small = small_radius # 转换为向量简化计算 p1 = pygame.math.Vector2(point_1) p2 = pygame.math.Vector2(point_2) # 计算线段的方向向量并归一化 line_dir = (p2 - p1).normalize() # 生成垂直于线段的法向量(用于确定线条上下边缘的偏移方向) normal = pygame.math.Vector2(-line_dir.y, line_dir.x) # 计算梯形的四个顶点:分别是两个端点的上下偏移点 top_p1 = p1 + normal * (radius_large / 2) top_p2 = p2 + normal * (radius_small / 2) bottom_p2 = p2 - normal * (radius_small / 2) bottom_p1 = p1 - normal * (radius_large / 2) # 按顺序绘制闭合梯形 pygame.draw.polygon(surf, color, [top_p1, top_p2, bottom_p2, bottom_p1]) # 绘制两端的圆形 pygame.draw.circle(surf, color, point_1, radius_large) pygame.draw.circle(surf, color, point_2, radius_small)
关键修改说明
- 不再使用统一的偏移量,而是给两个端点分别设置对应半径的偏移:大圆端点用
radius_large/2偏移,小圆端点用radius_small/2偏移,让多边形的两条侧边自然收敛 - 严格按「左上→右上→右下→左下」的顺序排列多边形顶点,确保Pygame能正确绘制闭合梯形
- 两端圆形的半径与多边形偏移量完全匹配,避免出现空隙或重叠
当前输出效果:等宽矩形线条两端连接大小圆,矩形与小圆衔接处存在明显空隙
期望输出效果:从大圆平滑收窄到小圆的锥形线条,线条与两端圆形完全贴合
内容的提问来源于stack exchange,提问作者3kstc
相关产品推荐
相关产品推荐

