C#在3d网格空间内从中心(x,y,z)到最外面(x,y,z)绘制完美的球体

时间:2010-12-16 15:31:44

标签: c# math 3d geometry

我有以下变量的值::

x0,y0,z0 =第一个选择的坐标(意图是球体的中心)

x1,y1,z1 =第二次选择的坐标(意图是球体的最外点)

ishollow =布尔值,表示球体是否应该是空心的

结果必须画出最好的,一个完美的球体。这是一个例子:

  • 3D空间为100x100x100
  • 首先选择50,50,50点(即x0 = 50; y0 = 50,z0 = 50)
  • 第76,67,84点被选中(即x1 = 76; y1 = 67,z1 = 84)
  • 以第一个点作为中心和第二个点绘制球体,作为球体中任何点距离中心的最大距离
  • 球体必须由用函数markpointt(x,y,z,hollowmark)绘制的点组成
  • 如果ishollow = true,
  • 球体必须是空心的。为了使它空心,我需要指定空心标记是否为真,如果是这样,仍然需要放置该点,但它会覆盖任何带有黑点的现有点

我不确定从哪里开始,你能指出我的方向来确定编码这样一个过程的数学函数吗?感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

点之间的距离=球半径。

(中心位置)& (Sphere Radius)就是您所需要的。如果一个点在距离中心的距离小于半径的范围内,则可以检查该点是否在球体内。

答案 1 :(得分:1)

您必须计算的第一个数量是球体的半径。这很简单,使用您的符号radius = sqrt((x1-x0)^2+(y1-yo)^2+(z1-z0)^2)

接下来,要在整个球体中“着色”,您可以简单地遍历100 x 100 x 100空间中的每个体素,并测试它是否在球体内,相应地着色。有许多方法可以使此操作更有效,例如,您可以首先找出球体的轴对齐边界框,并且只迭代该框中的点。您可以在空间的一个八分圆中进行所有计算,然后使用反射在其他八分圆中着色。

绘制一个空心球体将更具挑战性,球体的半径通常是一个实数,而不是一个整数,所以在中心周围没有一个很好地排列的体素厚的体素壳。相反,最天真的算法(测试体素正好在距球体中心指定的距离处)可能导致壳体中不包含体素。在测试中,您必须允许一些公差,以确定体素是在壳体内,体内还是体外。我希望你会发现定义公差是非常棘手的,这样你就不会在任何点上都有两个体素厚,而在其他点同时是零体素。

如果您发现所有这些概念化都有点弯曲,那么在处理第三维之前,将其全部用于2D圆形。