定位饼切片问题

时间:2014-12-04 19:16:34

标签: c++ charts pie-chart

我使用的语言没有内置的能力来创建任何类型的图表。我发现以下代码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);
}
...

我将它转换为我正在使用的语言。我把它放在一个循环中运行。

代码的问题是切片始终从同一位置开始并绘制先前绘制的内容。

最终结果如下:

enter image description here

您可以从屏幕上不同颜色的数字中看到有3个其他弧被遮盖。首先画出黑弧。然后红了。然后绿色。黄色的那个。绘制弧线时,它们会覆盖先前绘制的弧线。我颠倒了角度的长度,表明实际上有4个弧形。再次,首先绘制黑色,然后绘制红色,然后绘制绿色,然后绘制黄色。

enter image description here

有没有办法在当前饼图片的末尾开始下一个饼图?

2 个答案:

答案 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));
}
...

这是饼图到目前为止的样子......

enter image description here