ImageMagick 的操作实现了此 W3C 文档draw
中定义的 SVG“路径” 。
不支持通过给出简单的“度”角度参数进行绘制。您需要使用三角函数计算每个路径和涉及弧的子路径的端点坐标。(您必须使用与当前点相关的绝对值或相对值,具体取决于所使用的确切弧运算符;另请参见下面的示例。)
一般的
在 SVG(以及 ImageMagick)中,“路径”表示对象的轮廓。还支持绘制复合路径:复合路径是具有子路径的路径,其中每个子路径由单个moveto
后跟一个或多个line
orcurve
操作组成。
对象的轮廓可以通过以下操作来定义:
moveto :
设置一个新的当前点。
用于M
绝对运动和m
相对运动。
lineto :
画一条直线。
用于L
绝对运动和l
相对运动。
curveto :
绘制贝塞尔曲线。
使用C
、c
和S
绘制s
三次贝塞尔曲线。(我们不需要这些饼图)。
使用Q
、q
和T
绘制*quadratic Bezier曲线t
。(我们不需要这些饼图)。
arc :
画椭圆或圆弧。
使用A
和a
绘制椭圆弧。对于ellipse == circle的特殊情况,我们需要这些饼图。
closepath :
通过在最后一个 moveto 上画一条线来关闭当前形状。
使用Z
或z
;两者具有相同的效果:它们结束当前子路径并导致从当前点到当前子路径的初始点绘制一条自动直线。
- 如果“closepath”之后紧跟“moveto”,则“moveto”标识下一个子路径的起点。
- 如果任何其他命令紧跟在“closepath”之后,则下一个子路径从与当前子路径相同的初始点开始。
单个饼图楔形示例
这意味着,您可以使用以下命令使用黄色背景在 280x280 画布内绘制一个带有黑色边框的红色饼图楔形:
convert \
-size 280x280 xc:yellow \
-stroke black \
-fill blue \
-draw "path 'M 120,140 L 120,40 A 100,100 0 0,1 137.36,41.52 Z'" \
red-pie-wedge.jpg
结果:
- 以下坐标系的原点是左上角。
- 路径的起点 (
M
) 位于像素坐标(120/140)处。
- 第一行 (
L
) 从那里垂直向上绘制到坐标(120/40)。
- 从坐标(120/40)
A
开始,半径为100的圆弧 ( )到达坐标(137.36/41.52)。
我将把它留给读者来计算导致坐标(137.36/41.52)作为弧的终点的三角计算。提示:
- 楔形的角度是 10°,并且100*sin(10°)=17.36因为这个例子中的半径是100,因此120+17.36=137.36;
- cos(10°)=0.9848和100*(1-cos(10°))=1.52,因此40+1.52=41.52。
- 从弧的终点开始,路径是闭合的 (
Z
),直线返回路径的起点。
完整的饼图示例
您总是需要做一些三角数学来计算绘制所有饼楔所需的任何圆弧的端点。
这是一个完整的饼图示例,其中包括上面的蓝色饼楔:
convert \
-size 280x280 xc:yellow \
-stroke black \
-fill blue -draw "path 'M 120,140 L 120.00,40.00 A 100,100 0 0,1 137.36,41.52 Z'" \
-fill silver -draw "path 'M 120,140 L 137.36,41.52 A 100,100 0 0,1 154.20,46.00 Z'" \
-fill red -draw "path 'M 136,130 L 170.20,36.00 A 100,100 0 0,1 236.00,130.00 Z'" \
-fill green -draw "path 'M 120,140 L 220.00,140.00 A 100,100 0 1,1 120.00,40.00 Z'" \
-fill black -stroke none -pointsize 10 \
-draw "text 119,37 '10' text 142,41 '10' text 182,36 '70' text 226,156 '270'" \
piechart.jpg
结果: