首页 > 解决方案 > 甜甜圈图:计算外圆的坐标以获得切片之间的平行间隙

问题描述

我有一个自定义的 Dougnut 图表抽屉,可以像这样绘制甜甜圈:

在此处输入图像描述

我对此非常满意,但是我想对其进行微调,但我不知道正确的解决方案。

我想在切片之间有平行的间隙(填充)。

我提高了这些填充物以更好地了解我的目标。

这就是我目前绘制的方式:

double cx, cy; //center points of circle
double r1, r2; //radius of outer and inner circle
double pad = M_PI / 360 * 12; //12 degree pad
double alpha = -1 * M_PI / 2; //starting from up (noon)
double da = 0.0; // delta of current slice

for (ALL_SLICES) {
  calculate_da(&da); //calculate slice's delta

  // drawing
  move_pen(cx + r2 * cos(alpha + pad/2), cy + r2 * sin(alpha + pad/2)); //STEP1
  draw_arc(cx, cy, r1, alpha + pad/2, alpha + da - pad/2); //STEP2
  draw_negative_arc(cx, cy, r2, alpha + da - pad/2, alpha + pad/2); //STEP3
  fill();
  
  //update next alpha
  alpha += da;
}

绘图步骤:

在此处输入图像描述

所以这相当简单,但是要在切片之间有平行间隙,我必须为外端点和起点计算另一个角度:

在此处输入图像描述

我已经画了很多三角形,但我无法轻松解决这个问题。

同样:目标是在切片之间有平行的填充,即将这两个红点在圆周上靠得更近,以获得两个切片之间的精确平行线。

更新:

这就是来自@chux 答案的缩放填充的外观:

在此处输入图像描述

不幸的是,它并不完美,这些线并不平行:

在此处输入图像描述

标签: mathtrigonometry

解决方案


“垫应该是 12 度”--> 如果你想要平行线,内部填充角度和外部填充角度是不同的 - 不是都是 12°。

使用缩放填充。

给定外部填充角度为double pad = ...
像以前一样绘制第一条弧线。

draw_arc(cx, cy, r1, alpha + pad/2, alpha + da - pad/2); //STEP2

内部填充角成比例地更大。

double inner_pad = pad*r1/r2;
draw_negative_arc(cx, cy, r2, alpha + da - inner_pad/2, alpha + inner_pad/2); //STEP3

r_inner, r_outer提示:比.使用起来更容易混淆r2, r1


次要:填充计算看起来减少了 2 倍。

// double pad = M_PI / 360 * 12; //12 degree pad.
double pad = 2 * M_PI / 360 * 12; //12 degree pad.

推荐阅读