Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取由三维多边形包围的点_C#_C++_Algorithm_3d - Fatal编程技术网

C# 获取由三维多边形包围的点

C# 获取由三维多边形包围的点,c#,c++,algorithm,3d,C#,C++,Algorithm,3d,我有一个位于三维平面上的多边形。我想得到这个多边形所包围的所有点。有人能帮我吗? 我可以通过将扫描线替换为平面来生成三维扫描线算法,并获得平面与多边形的交点,但我需要更快的解决方案。 提前感谢。我现在可以看到的一种方法是从要验证的每个点发射随机任意光线,并计算它与3d网格曲面相交的次数。如果多边形为奇数-内部,如果为偶数-外部。如果多边形为凸多边形,则可以使用以下方法: 多边形的每个面都是由方程ax+by+cz=d给出的平面的一部分。为所有面找到此方程式,根据描述多边形内部点的关系将其修改为d,

我有一个位于三维平面上的多边形。我想得到这个多边形所包围的所有点。有人能帮我吗? 我可以通过将扫描线替换为平面来生成三维扫描线算法,并获得平面与多边形的交点,但我需要更快的解决方案。
提前感谢。

我现在可以看到的一种方法是从要验证的每个点发射随机任意光线,并计算它与3d网格曲面相交的次数。如果多边形为奇数-内部,如果为偶数-外部。

如果多边形为凸多边形,则可以使用以下方法:


多边形的每个面都是由方程
ax+by+cz=d
给出的平面的一部分。为所有面找到此方程式,根据描述多边形内部点的关系将其修改为
>d
,然后求解此线性不等式组。这将为您提供一组只满足多边形内部点的x、y和z关系。

将多边形投影到(x、y)平面上。现在这是一个二维问题。二维投影内的每个点(x,y)表示三维多边形内的一个点(x,y,z)。
注意:如果平面垂直于(x,y)-平面,则此操作无效;如果它几乎是垂直的,你会失去精确度。因此,在实践中,您将投影到最不垂直于三维平面的坐标平面上。

我看到使用matplotlib/scipy/numpy实现了类似的功能。不过,我记不清该算法是否有用。

CygnusX1的答案是标准的多边形点测试,可以针对各种不同的系统进行修改(例如,我有一个用于处理球体的编码版本)。适应它的主要技巧是决定光线的方向Abitrary这个词比random好得多。对于二维欧几里德工作,我会在平行于一个轴的方向上拍摄(并垂直于另一个轴)。对于球体,使用其中一个极点。对于3d中的2d平面多边形,我会选择一条垂直于其中一个轴的线

或者我会变换坐标,使所有的计算都在平面上。这将大大简化多边形测试中的实际点。我认为这也会更快(对于大型多边形和许多测试而言,这一点尤为明显):每个多边形角点只需变换一次,但在多边形测试中,每个点将用于两次测试。

“是的,它是一个凸3p多边形,但它的所有点都位于同一平面上”

在这种情况下-只需将多边形和所有测试点转换为平面的二维局部坐标,并使用二维算法:

  • 2D射线拍摄:您仍然可以使用与我的3d建议类似的算法-从测试点拍摄2D射线,并计算您击中多边形边界的次数


  • 线性不等式:如果你的多边形是凸的,你可以遵循suszterpatt的方法,将你的多边形定义为半平面的交集
    ax+By是否有其他的假设?例如,您的网格是凸的(这将使问题更容易)哦,哦!也许我(和其他许多回应的人)误解了你。在三维空间的某个地方有二维多边形吗?但是如果是这样的话,那么问题可以在该平面的2D局部坐标空间中解决。是的,它是一个凸3p多边形,但它的所有点都位于同一平面上。这将只适用于假设3d网格是凸的!同意,“武断”是一个更好的词。更新。谢谢感谢天鹅座的帮助,但这是波尔贡测试的重点。。问题是我想得到这个多边形中的所有点,所以我不能限制生成的随机点的数量,我应该测试,你可以测试的点的数量没有限制。你只需要为你测试的每个点发射任意射线。通常你根据法线的最长分量在X,Y,Z上投影你的平面,也就是说,如果你的法向量n=(1,2,3),那么你应该在XY平面上投影它