【问题标题】:Generating Sampling points on a 3D Triangle with the help of Straightforward sampling or Bresenham type sampling [duplicate]借助直接采样或 Bresenham 类型采样在 3D 三角形上生成采样点 [重复]
【发布时间】:2018-01-04 15:17:23
【问题描述】:

我有一个有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) -> 第一条边

(3,3,0),(4,1,0),(4,2,0),(5,0,0) ->第二条边

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

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

如果有人可以帮助我解决这个算法,我会很高兴。

提前致谢!

【问题讨论】:

  • 如果您不是绝对需要使用扫描线算法,那么this post 上的非常 简单的方法可能就是您所需要的。
  • 使用我链接的副本并添加z坐标。如果你想要体积渲染,唯一的区别是你不需要 Zbuffer if 条件,而不是 pixel[y][x]=col; depth[y][x]=z; 应该使用 voxel[z][y][x]=col;

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


【解决方案1】:

假设您不受常规网格的限制,您可以执行以下操作:

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

【讨论】:

  • 刚刚编辑了我的帖子..请看示例,我在上面写过。我只需要像简单的采样这样的东西来找到内部点。
  • 同样,这通常仅在您的三角形与 3 个轴之一对齐时才有效。可以保证是这样吗?
  • 不,在我的帖子中,我只是举了一个例子。可能有一种情况,我的三角形可能与任何轴都不对齐。
  • 嗨。在您的帖子中,您的三角形与 x-y 平面对齐(所有 z 坐标均为零)。
  • 嗨,我只是举了一个例子。我也可能有一个顶点为 (3,0,0) 的三角形; (0,3,0) 和 (0,0,3)。在这种情况下,请解释一些算法以生成特定分辨率的内部点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多