我还带着另一个假问题回来,因为我是新手。我在c中编写了一个代码,用Bresenham的算法填充2D数组。代码用连续的圆填充2D数组:
#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);
}
这些是正常的,但主要问题是数组中未填充的元素。有些元素仍为零值。我想用适当的值填充这些值。请注意,代码的速度对我来说很重要,所以任何其他建议都是好的。有什么想法吗? 我附上了我从文本文件中观察到的无花果
深蓝色像素(主要是黑色)是数组
中未填充的元素答案 0 :(得分:1)
不优雅的方式是为每个可能的半径绘制2个(或者如果需要3个)不同的圆,但是稍微不同的中心点(一个用于x,y用于x + 1, Y)。 - 在这种情况下,你的数组必须足够大才能处理移位的圆(有一个额外的列)。
一个更好解决方案根本不是绘制圆圈。只需迭代像素,得到它们与中心的距离(使用已经在代码中使用的毕达哥拉斯定理),然后根据距离计算颜色。 - 您可以优化此选项,仅占该区域的四分之一。并进一步优化只做八分之一。