c - 获取圆内的 x,y

标签 c

我正在使用此页面上提供的算法(圆形和椭圆形):http://members.chello.at/easyfilter/bresenham.html

但是,这些只是计算圆的外部。如何确定哪些 x,y 在圆内?

算法是这样的:

void plotCircle(int xm, int ym, int r)
{
   int x = -r, y = 0, err = 2-2*r; /* II. Quadrant */ 
   do {
      setPixel(xm-x, ym+y); /*   I. Quadrant */
      setPixel(xm-y, ym-x); /*  II. Quadrant */
      setPixel(xm+x, ym-y); /* III. Quadrant */
      setPixel(xm+y, ym+x); /*  IV. Quadrant */
      r = err;
      if (r <= y) err += ++y*2+1;           /* e_xy+e_y < 0 */
      if (r > x || err > y) err += ++x*2+1; /* e_xy+e_x > 0 or no 2nd y-step */
   } while (x < 0);
}

椭圆算法是这样的:

void plotEllipseRect(int x0, int y0, int x1, int y1)
{
   int a = abs(x1-x0), b = abs(y1-y0), b1 = b&1; /* values of diameter */
   long dx = 4*(1-a)*b*b, dy = 4*(b1+1)*a*a; /* error increment */
   long err = dx+dy+b1*a*a, e2; /* error of 1.step */

   if (x0 > x1) { x0 = x1; x1 += a; } /* if called with swapped points */
   if (y0 > y1) y0 = y1; /* .. exchange them */
   y0 += (b+1)/2; y1 = y0-b1;   /* starting pixel */
   a *= 8*a; b1 = 8*b*b;

   do {
       setPixel(x1, y0); /*   I. Quadrant */
       setPixel(x0, y0); /*  II. Quadrant */
       setPixel(x0, y1); /* III. Quadrant */
       setPixel(x1, y1); /*  IV. Quadrant */
       e2 = 2*err;
       if (e2 <= dy) { y0++; y1--; err += dy += a; }  /* y step */ 
       if (e2 >= dx || 2*err > dy) { x0++; x1--; err += dx += b1; } /* x step */
   } while (x0 <= x1);

   while (y0-y1 < b) {  /* too early stop of flat ellipses a=1 */
       setPixel(x0-1, y0); /* -> finish tip of ellipse */
       setPixel(x1+1, y0++); 
       setPixel(x0-1, y1);
       setPixel(x1+1, y1--); 
   }
}

最佳答案

如果圆心位于 x0, y0,半径为 r,则点 x, y 位于圆的边缘内或上,当且仅当 (x - x0)(x - x0) + ( y - y0)(y - y0) 小于或等于 r 的平方。

您可以非常简单地在 C 和 C# 中实现此功能。

关于c - 获取圆内的 x,y,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27450678/

相关文章:

c - memcpy() 的使用

c - Node-ffi 调用 c DLL 返回指针

c - 我该怎么做才能使我的程序在 do while 循环中保持在开关中输入的最小数字?

c - 内存数据文件中的SQLite3

free() 函数可以在 c 中级联工作吗

c - 绘制两次相同的 Sprite 或绘制一个双倍大小的 Sprite 更好?

c - C 算法中的平方根问题

c - 字符串操作和内存分配 - C

c - 链表崩溃

c - execve() 和环境变量