1

如何使用 ImageMagick 按百分比绘制饼图?

例如:如果有一个像 45 这样的值作为百分比给出——我如何使用 Ruby 或 bash 命令绘制一个只有 45% 的饼图?

如果我使用 ImageMagick 的draw运算符,弧值需要如何设置?或者如何从整数值计算 acr 值?

例如:

convert -size 100x100 xc:none -fill white -stroke black/
-draw "path 'M 30,40   A 1,1  0  0,0 70,20 ....  ??

我试图阅读和理解这些例子,但弧计算对我来说是个谜。

4

1 回答 1

8

ImageMagick 的操作实现了此 W3C 文档draw中定义的 SVG“路径” 。

不支持通过给出简单的“度”角度参数进行绘制。您需要使用三角函数计算每个路径和涉及弧的子路径的端点坐标。(您必须使用与当前点相关的绝对值或相对值,具体取决于所使用的确切弧运算符;另请参见下面的示例。)

一般的

在 SVG(以及 ImageMagick)中,“路径”表示对象的轮廓。还支持绘制复合路径:复合路径是具有子路径的路径,其中每个子路径由单个moveto后跟一个或多个lineorcurve操作组成。

对象的轮廓可以通过以下操作来定义:

  • moveto : 设置一个新的当前点。
    用于M绝对运动和m相对运动。

  • lineto : 画一条直线。
    用于L绝对运动和l相对运动。

  • curveto : 绘制贝塞尔曲线。
    使用CcS绘制s三次贝塞尔曲线。(我们不需要这些饼图)。
    使用QqT绘制*quadratic Bezier曲线t。(我们不需要这些饼图)。

  • arc : 画椭圆或圆弧。
    使用Aa绘制椭圆弧对于ellipse == circle的特殊情况,我们需要这些饼图。

  • closepath : 通过在最后一个 moveto 上画一条线来关闭当前形状。 使用Zz;两者具有相同的效果:它们结束当前子路径并导致从当前点到当前子路径的初始点绘制一条自动直线。

    • 如果“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

结果:
红色饼状楔形

  1. 以下坐标系的原点是左上角。
  2. 路径的起点 ( M) 位于像素坐标(120/140)处。
  3. 第一行 ( L) 从那里垂直向上绘制到坐标(120/40)
  4. 从坐标(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.9848100*(1-cos(10°))=1.52,因此40+1.52=41.52
  5. 从弧的终点开始,路径是闭合的 ( 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

结果:
完整的饼图

于 2012-10-16T12:31:57.000 回答