1. 矢量图绘制的核心原理:路径与填充
在图形设计领域,矢量图与位图的本质区别在于其数学表达方式。矢量图形通过路径(Path)和数学公式来定义形状,而不是像位图那样记录每个像素的颜色值。当我们谈论"画一个圆"时,实际上是在创建一个由贝塞尔曲线构成的闭合路径。
路径数据(Path Data) 是矢量图形的骨架,它定义了形状的轮廓。以SVG(可缩放矢量图形)为例,一个简单的圆形路径可能如下表示:
xml复制<path d="M 100,100 m -75,0 a 75,75 0 1,0 150,0 a 75,75 0 1,0 -150,0" />
这段代码描述了一个圆心在(100,100),半径75的圆形路径。但请注意:这仅仅定义了轮廓,还没有涉及填充属性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 填充规则:实心与空心的关键
填充规则(FillType) 决定了如何对闭合路径围成的区域进行着色。主要有两种规则:
2.1 Non-Zero规则(非零环绕规则)
这是大多数矢量编辑软件的默认设置。其算法原理是:
- 从待判断点向任意方向发出一条射线
- 统计路径与射线的所有交点
- 路径从左向右穿过射线时计数+1,反之-1
- 最终结果不为零则填充该区域
2.2 Even-Odd规则(奇偶规则)
更简单的判断方式:
- 同样发射射线并统计交点数量
- 如果交点数量为奇数则填充,偶数则不填充
在Android的VectorDrawable中,这两种规则分别对应:
xml复制android:fillType="nonZero" <!-- 默认值 -->
android:fillType="evenOdd"
3. 创建空心圆的正确方法
要实现真正的空心圆(圆环),必须遵循以下步骤:
3.1 路径构造
需要两个同心圆路径:
- 外圆定义整体边界(例如半径100)
- 内圆定义挖空区域(例如半径60)
xml复制<path
android:pathData="M100,100a100,100 0 1,1 -0.01,0 M100,100a60,60 0 1,1 -0.01,0"
android:fillType="evenOdd"/>
