我使用的语言没有内置的能力来创建任何类型的图表。我发现以下代码here。这是非常古老的c ++代码。
圆心(原点)=(h,k)
Radius = r
...
void Circular_arc(constint h, constint k, constint r, constint start_angle, constint end_angle)
{
int color = getcolor();
float angle = (((start_angle <= end_angle) ? start_angle : end_angle)*(M_PI / 180));
float range = (((end_angle > start_angle) ? end_angle : start_angle)*(M_PI / 180));
float x = (r*cos(angle));
float y = (r*sin(angle));
do
{
putpixel((int)(h + x + 0.5), (int)(k - y + 0.5), color);
angle += 0.001;
x = (r*cos(angle));
y = (r*sin(angle));
} while (angle <= range);
}
...
我将它转换为我正在使用的语言。我把它放在一个循环中运行。
代码的问题是切片始终从同一位置开始并绘制先前绘制的内容。
最终结果如下:
您可以从屏幕上不同颜色的数字中看到有3个其他弧被遮盖。首先画出黑弧。然后红了。然后绿色。黄色的那个。绘制弧线时,它们会覆盖先前绘制的弧线。我颠倒了角度的长度,表明实际上有4个弧形。再次,首先绘制黑色,然后绘制红色,然后绘制绿色,然后绘制黄色。
有没有办法在当前饼图片的末尾开始下一个饼图?
答案 0 :(得分:0)
因为我真的不明白Turbo C ++我不能肯定地说。但我认为这是你的解决方案:
void Circular_arc(constint h, constint k, constint r, constint start_angle, constint end_angle)
{
static int offset = 0;
start_angle = (start_angle + offset) % 360;
end_angle = (end_angle + offset) % 360;
offset = end_angle;
int color = getcolor();
float angle = (((start_angle <= end_angle) ? start_angle : end_angle)*(M_PI / 180));
float range = (((end_angle > start_angle) ? end_angle : start_angle)*(M_PI / 180));
float x = (r*cos(angle));
float y = (r*sin(angle));
do
{
putpixel((int)(h + x + 0.5), (int)(k - y + 0.5), color);
angle += 0.001;
x = (r*cos(angle));
y = (r*sin(angle));
} while (angle <= range);
}
我还要说,这是一个可怕的解决方案,因为它绝不是面向对象的。但它似乎是没有重新开始你可以做的最好的(你应该这样做。)
答案 1 :(得分:0)
我已经对此进行了修改并创建了一种方法。我做了以下修复我的问题。首先,我通过创建另一个仅将结束角度转换为弧度的函数,摆脱了将开始和结束角度从度数转换为弧度的过程。调用Circular_arc后,我将start_angle设置为等于end_angle的值。编写/使用更少的代码。其次,我删除了第一个找到x,y的计算,并将第二个计算移动到循环中的第一个。这不是必需品,但我非常喜欢尽可能少编写代码。我这样懒。 OP的第三大部分和全部原因首先是开始当前弧和前一弧的结束。为此,我创建了一个变量并将其设置为等于start_angle的值。然后,我将do-while
循环中的参数设置为while (start_angle <= (end_angle+angle))
。这会在上一弧结束时开始当前弧。
以下是我将代码转换为C ++的尝试。如果有错误,请告诉我,我会尽力解决。我希望这有助于将来的某个人!
...
void Circular_arc(constint h, constint k, constint r, constint start_angle, constint end_angle)
{
float angle
angle = start_angle
do
{
x = (r*cos(start_angle));
y = (r*sin(start_angle));
putpixel((int)(h + x + 0.5), (int)(k - y + 0.5), getcolor());
angle += 0.001;
} while (start_angle <= (end_angle+angle));
}
...
这是饼图到目前为止的样子......