概述
之前用半圆弧拼接的方式求过胶囊形,在逐渐熟练使用Geometry2D
的过程中,发现通过线段求端点是圆角类型的偏移多边形,获得的就是胶囊形。
所以我们有了第二种胶囊形求法。
测试代码
@tool
extends Node2D## 横向宽度
@export var width:float = 100.0:set(val):width = valqueue_redraw()## 偏移半径
@export var r:int = 20:set(val):r = valqueue_redraw()func _draw() -> void:var half_x = width/2.0 - rvar points = [Vector2.LEFT * half_x,Vector2.RIGHT * half_x]var polygon = Geometry2D.offset_polygon(points,r,Geometry2D.JOIN_ROUND)[0]polygon.append(polygon[0]) # 闭合draw_polyline(polygon,Color.AQUAMARINE,1) # 绘制胶囊形draw_polyline(points,Color.WHITE,1) # 绘制线段
测试效果
总结函数
# 基于多边形偏移的胶囊形求取函数
func capsule(width:float,radius:float) ->PackedVector2Array:var half_x = width/2.0 - radiusvar points = [Vector2.LEFT * half_x,Vector2.RIGHT * half_x]var polygon = Geometry2D.offset_polygon(points,radius,Geometry2D.JOIN_ROUND)[0]polygon.append(polygon[0]) # 闭合return polygon
应用:胶囊链
通过将上面的胶囊形求法应用于链形结构,可以获得胶囊链的效果。
为了方便所有链结构使用,我为Chain
类型,添加了一个draw_capsules
方法,代码如下:
# 绘制胶囊
func draw_capsules(canvas:CanvasItem,r:=10.0,color:=Color.WHITE,fill:=true,border_width:=1.0) -> void:for i in range(points.size()-1):var seg = [points[i],points[i+1]]var len = lens[i]var capsule = Geometry2D.offset_polygon(seg,r,Geometry2D.JOIN_ROUND)[0]capsule.append(capsule[0]) # 闭合if fill:canvas.draw_colored_polygon(capsule,color)else:canvas.draw_polyline(capsule,color,border_width)
总结
这只是一个基于Geometry2D
改变特殊图形求取思路的案例之一,实际上通过偏移、布尔运算,你可以用几行代码求出一些原先用向量旋转、向量加减法以及线性变换思路弯弯绕半天的图形。