借助直接采样或Bresenham型采样,在3D三角形上生成采样点

时间:2018-01-04 15:17:23

标签: c# c++ 3d geometry bresenham

我有一个带有3个顶点的三角形,即:(x1,y1,z1); (x2,y2,z2)和(x3,y3,z3)。

我正在使用Bresenhams 3D Line算法,目前用于在三角形的两个顶点之间生成3D点,具体取决于分辨率大小(resSize)。

void Bresenham3Algo(float x0, float y0, float z0, float x1, float y1, float z1)
        {
            float dx = Math.Abs(x1 - x0);
            float sx = x0 < x1 ? resSize : -resSize;
            float dy = Math.Abs(y1 - y0);
            float sy = y0 < y1 ? resSize : -resSize;
            float dz = Math.Abs(z1 - z0);
            float sz = z0 < z1 ? resSize : -resSize;
            float dm = Math.Max(dx, Math.Max(dy, dz)), i = dm;
            x1 = y1 = z1 = dm / 2;

            for (; ; )
            {
                Console.WriteLine(x0,y0,z0); //Printing points here
                if (i <= 0) break;
                x1 -= dx; if (x1 < 0) { x1 += dm; x0 += sx; }
                y1 -= dy; if (y1 < 0) { y1 += dm; y0 += sy; }
                z1 -= dz; if (z1 < 0) { z1 += dm; z0 += sz; }
                i -= resSize;
            }
        }

所以,截至目前,我正在调用上述函数三次,以在三个三角边的边界上生成3D采样点。

Bresenham3Algo(x1,y1,z1,x2,y2,z2);
Bresenham3Algo(x2,y2,z2,x3,y3,z3);
Bresenham3Algo(x3,y3,z3,x1,y1,z1);

我发现很难找到位于三角形内部的内部采样点。

例如,如果我有顶点(0,0,0); (5,0,0)和(3,3,0),在上述功能的帮助下,我在三个三角形边上找到3D点,即

(0,0,0),(1,0,0),(2,0,0),(3,0,0),(4,0,0),(5,0,0) - &GT;第一个边缘

(3,3,0),(4,1,0),(4,2,0),(5,0,0) - &gt;第二边

(0,0,0),(1,1,0),(2,2,0),(3,3,0) - >第三边缘

现在,我需要找到位于三角形内部的内部3D采样点,即(2,1,0),(3,1,0),(3,2,0)

如果有人可以帮我解决这个问题,我会很高兴的。

提前致谢!

1 个答案:

答案 0 :(得分:0)

假设您没有被约束到常规网格,请执行以下操作:

  1. 将三角形旋转到x-y平面上。
  2. 使用您最喜欢的2D算法(例如Bresenham)绘制并填充三角形。
  3. 将z值(全零)添加到绘制的点
  4. 向后旋转至原始方向。