math - 甜甜圈图:计算外圆的坐标以获得切片之间的平行间隙
问题描述
我有一个自定义的 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 答案的缩放填充的外观:
不幸的是,它并不完美,这些线并不平行:
解决方案
“垫应该是 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.
推荐阅读
- c# - 如何删除 ASP.Net MVC 索引视图表中的重复条目
- javascript - 在不同时间重新加载多个 DIV
- angular - 根据前端状态的状态对 Angular 记录进行样式化
- c# - 在 .NET Core MVC 中使用 Ajax 处理会话超时
- python - 来自 Flask 应用程序的计划作业
- haskell - 在Haskell中找到给定集合A和通用集合U的补集
- php - 如何解决从 ms-access 到 mysql 的数据传输中的阿拉伯语编码问题?
- typescript - 从推断参数元组中删除项目
- wso2 - 如何从命令提示符运行 siddhi 应用程序?
- azure - 我们能否为在不同区域创建的所有 VMSS 提供一个应用程序网关?