c - C中二维数组中的连续圆与Bresenham的圆算法

标签 c arrays

因为我是新手,所以我带着另一个虚拟问题回来了。我用 c 语言编写了一段代码,使用 Bresenham 算法填充二维数组。代码用连续的圆圈填充二维数组:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
    double *v;
    int i;
    v = (double*)malloc(101*101*sizeof(double));

    for(i=0;i<101*101;i++)
    {
        v[i]=0.0;
    }


    for(i=0;i<73;i++)
    {
        draw_circle(v, 101,101,51,51,i,(double)i);
    }
    write_arraya(v,"test.txt",101,101);
    free(v);
    
    return 1;
}

它使用了 Bresenham 算法

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void draw_circle (double *v, int m, int n, int xr, int yr, int radius, double value)
{
    int x, y;
    int l;

    l = (int) radius * cos (M_PI / 4);

    for (x = 0; x <= l; x++)
    {
        y = (int) sqrt ((double) (radius * radius) - (x * x));

        set_value (v, m, n, xr+x-1, yr+y-1, (double)value);
        set_value (v, m, n, xr+x-1, yr-y-1, (double)value);
        set_value (v, m, n, xr-x-1, yr+y-1, (double)value);
        set_value (v, m, n, xr-x-1, yr-y-1, (double)value);

        set_value (v, m, n, xr+y-1, yr+x-1, (double)value);
        set_value (v, m, n, xr+y-1, yr-x-1, (double)value);
        set_value (v, m, n, xr-y-1, yr+x-1, (double)value);
        set_value (v, m, n, xr-y-1, yr-x-1, (double)value);
        printf("x= %d, y=%d\n", x, y);
    }
}

并通过以下方式设置值:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void set_value (double *v, int m, int n, int i, int j, double value)
{
    if(i>=0 && i<m && j>=0 && j<n)
    {
        v[i*n+j]=(double)value;
    }
}

并将它们写入文本文件

#include <stdio.h>
#include <stdlib.h>
void write_arraya(double *v, char file_name[], int row, int col)
{
    FILE *fp;
    int i, j;

    fp = fopen(file_name, "w");

    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            fprintf(fp,"%e ",v[i*col+j]);
        }
        fprintf(fp,"\n");
    }

    fclose(fp);
}

这些都可以正常工作,但主要问题是数组中未填充的元素。有些元素仍然具有零值。我想用适当的值填充这些值。请注意,代码的速度对我来说很重要,因此欢迎提出任何其他建议。有什么想法吗? 我附上了我从文本文件中观察到的图

The filled 2D array

深蓝色像素(大部分为黑色)是数组中未填充的元素

最佳答案

一种不雅观的方法是为每个可能的半径绘制 2 个(或者如果需要的话 3 个)不同的圆,但中心点略有不同(一个用于 x,y,另一个用于 x+1, y)。 - 在这种情况下,您的数组必须足够大以处理移动的圆圈(有一个额外的列)。

一个更好的解决方案是根本不画圆圈。只需遍历像素,获取它们与中心的距离(使用毕达哥拉斯定理,它已在您的代码中使用),然后根据距离计算颜色。 - 你可以优化它只做四分之一的区域。并进一步优化只做八分之一。

关于c - C中二维数组中的连续圆与Bresenham的圆算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19075647/

相关文章:

python - 用两个 numpy 数组中的唯一值组合标记区域?

c - 如何使用表类型参数和表类型返回值从 Lua 调用 C 函数?

c - 将 MATLAB 与 C/C++ 程序连接起来

c - C中的限定符和修饰符有什么区别?

c - 为什么我的链接列表实现中的 Push() 函数显示这种行为?

c# - 我怎样才能避免这种潜在的 "run-time exception on write operation"?

c++ - Arduino 中的字符串提取问题

c - 如何在 C 中编写 getline 函数?

c++ - 如何在我的函数中返回一个二维数组?

python - 在数组中选择一个字符串变量 - Python