C++ 布雷森汉姆球?

C++ 布雷森汉姆球?,c++,c,algorithm,graphics,3d,C++,C,Algorithm,Graphics,3d,我正在写一个简单的软件渲染器,它 工作非常好,(使用三角形和球体/圆) 原语)但我有一些深度缓冲区的问题 实现-我需要一个版本的Bresenham's circle 使用正确3d值的算法 (需要填充深度缓冲区)。简单的“平面”2d圆形版本 void FillCircleWithDepth(int x1, int y1, float z, int radius, unsigned color) { int left = x1-radius-1; int

我正在写一个简单的软件渲染器,它 工作非常好,(使用三角形和球体/圆) 原语)但我有一些深度缓冲区的问题 实现-我需要一个版本的Bresenham's circle 使用正确3d值的算法 (需要填充深度缓冲区)。简单的“平面”2d圆形版本

    void FillCircleWithDepth(int x1, int y1, float z, int radius, unsigned color)
    {


     int left   = x1-radius-1;
     int right  = x1+radius+1;
     int up     = y1-radius-1;
     int down   = y1+radius+1;


     if(!_rectanglesOverlap(0, 0, CLIENT_X, CLIENT_Y,
                    left, up, right, down ) )
         return;


     int x  = 0;                   //0
     int y  = radius;              //1
     int d1 = 3 - (2 * radius);

     do
    {
     if (d1 < 0)      d1 += (x<<2) + 6;
     else             d1 += ((x-(y--))<<2) + 10;

     drawScanlineWithDepth(y1+x, x1-y, x1+y, z, color);
     drawScanlineWithDepth(y1-x, x1-y, x1+y, z, color);
     drawScanlineWithDepth(y1+y, x1-x, x1+x, z, color);
     drawScanlineWithDepth(y1-y, x1-x, x1+x, z, color);
     x++;
   }
   while(x<y);
 }
void FillCircleWithDepth(整数x1、整数y1、浮点z、整数半径、无符号颜色)
{
int left=x1-radius-1;
int right=x1+半径+1;
int up=y1-半径-1;
向下整数=y1+半径+1;
如果(!\u矩形映射(0,0,客户端X,客户端Y,
左、上、右、下)
返回;
int x=0;//0
int y=半径;//1
int d1=3-(2*半径);
做
{

如果(d1<0)d1+=(x就像三维投影下的三角形一样,1/z的倒数表现为线性;对于每个运动x+=dx或y+=dy,都涉及到与z倒数的线性差关系:rec_z(x+dx,y+dy)=rec_z(x,y)+a*dx+b*dy,其中a和b IIRC几乎与平面的法向量无关

这就引出了另一点:法向量有三个分量。虽然从绘制三角形看不太明显,但在透视校正下绘制圆并不是简单地缩放x和y,而是有更多的自由度


()--出于版权原因,它是一个链接,而不是嵌入的。

您是想画一个球体,还是想给人一个透视效果(离得越远的物体越小)到2D圆?如果你想获得透视效果,只需将
半径
按比例缩放到
z
就足够了,尽管它不会给你正常的透视失真。不要担心透视效果-只需要球体光栅化算法(接近我上面写的)这也会给出绘制的eaxh(x,y)的z坐标,这将是某种“双布列森厄姆”