//防止图像出界的函数
int clamp_s(int value, int m_min, int m_max)
{
int mm_ret = value;
if(value < m_min)
{
mm_ret = m_min;
}else if(value > m_max)
{
mm_ret = m_max;
}
return mm_ret;
}
此处给出两种画圆的方法
方法二:没有线条宽度的参数,默认是1,如果想实现线条宽度可以外部循环调用,半径r++,此处著名方法二画出的图像可能有像素点没画上,若要完善自行处理。
// data 图像数据
// width图像宽度
// height图像高度
// channel图像通道
// x0 圆心坐标x
// y0 圆心坐标y
// r 圆心半径
// shinner 线条宽度
// red 红色通道值
// gree红色通道值
// blue红色通道值
int LiDrewCircle_Source(unsigned char * data, int width, int height, int channel, int x, int y, int r, int shinner, unsigned char red, unsigned char gree, unsigned char blue)
{
unsigned char * tempUchar = data;
int i = 0;
int j = 0;
int k = 0;
int distance = 0;
unsigned char color[4] = {red, gree, blue, 0};
for(i = y - r; i <= y + r; i ++)
{
for(j = x - r; j <= x + r; j ++)
{
distance = (i - y) * (i - y) + (j - x) * (j - x);
if(distance <= r * r && distance >=(r - shinner) * (r - shinner))
{
for(k = 0; k < channel; k ++)
{
tempUchar[(clamp_s(i, 0, height - 1) * width + clamp_s(j, 0, width - 1)) * channel + k] = color[k];
}
}
}
}
return 0;
}
int LiDrewCircle_New(unsigned char * data, int width, int height, int channel, int x, int y, int r, unsigned char red, unsigned char gree, unsigned char blue)
{
float a = 0;
float b = 0;
int i = 0;
int j = 0;
int k = 0;
unsigned char color[4] = {red, gree, blue, 0};
int minx = 0;
int maxx = 0;
int miny = 0;
int maxy = 0;
float yy1 = 0.0f;
float yy2 = 0.0f;
int y1 = 0;
int y2 = 0;
float xx1 = 0.0f;
float xx2 = 0.0f;
int x1 = 0;
int x2 = 0;
float temp = 0.0f;
minx = x - r;
maxx = x + r;
miny = y - r;
maxy = y + r;
for(i = minx; i <= maxx; i ++)
{
temp = sqrtf(r * r - (i - x) * (i - x) * 1.0f);
yy1 = temp + y;
yy2 = y - temp;
y1 = round_s(yy1);
y2 = round_s(yy2);
if(y1 >= 0 && y1 < height)
{
for(k = 0; k < channel; k ++)
{
data[(y1 * width + i) * channel + k] = color[k];
}
}
if(y2 >= 0 && y2 < height)
{
for(k = 0; k < channel; k ++)
{
data[(y2 * width + i) * channel + k] = color[k];
}
}
}
for(i = miny; i <= maxy; i ++)
{
temp = sqrtf(r * r - (i - y) * (i - y) * 1.0f);
xx1 = temp + x;
xx2 = x - temp;
x1 = round_s(xx1);
x2 = round_s(xx2);
if(x1 >= 0 && x1 < width)
{
for(k = 0; k < channel; k ++)
{
data[(i * width + x1) * channel + k] = color[k];
}
}
if(x2 >= 0 && x2 < width)
{
for(k = 0; k < channel; k ++)
{
data[(i * width + x2) * channel + k] = color[k];
}
}
}
return 0;
}
在图像上画圆算法(c代码实现)
最新推荐文章于 2024-08-09 09:12:37 发布