Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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++_Rounding_Plane - Fatal编程技术网

C++ 相对于平面舍入三维点

C++ 相对于平面舍入三维点,c++,rounding,plane,C++,Rounding,Plane,我有一个平面类,n代表法线,q代表平面上的一个点。我还有另一个点p,也在那个平面上。我怎样才能把p四舍五入到那个平面上最近的单位呢。类似于将光标捕捉到三维栅格,但栅格可以是旋转平面 要解释的图像: 红色是当前点。绿色是我试图得到的圆点。实现这一点最简单的方法可能是通过平面定义旋转和移动的坐标系。这允许您构造矩阵,以便将全局坐标中的点转换为平面坐标并返回。一旦完成此操作,就可以简单地将点转换为平面坐标,以简单的方式执行舍入/投影,然后转换回世界坐标 当然,你提出问题的方式没有明确说明问题:你需要的

我有一个平面类,n代表法线,q代表平面上的一个点。我还有另一个点p,也在那个平面上。我怎样才能把p四舍五入到那个平面上最近的单位呢。类似于将光标捕捉到三维栅格,但栅格可以是旋转平面

要解释的图像:


红色是当前点。绿色是我试图得到的圆点。

实现这一点最简单的方法可能是通过平面定义旋转和移动的坐标系。这允许您构造矩阵,以便将全局坐标中的点转换为平面坐标并返回。一旦完成此操作,就可以简单地将点转换为平面坐标,以简单的方式执行舍入/投影,然后转换回世界坐标

当然,你提出问题的方式没有明确说明问题:你需要的变换有六个自由度,你的平面方程只产生三个约束。因此,您需要添加更多信息:原点在平面内的位置,以及栅格围绕平面法线的旋转

就我个人而言,我将首先导出参数形式的平面描述:

xVec = alpha*direction1 + beta*direction2 + x0
当然,这样的描述包含九个变量(三个向量),但您可以规范化两个方向向量,并且可以将两个方向向量约束为正交,从而将自由度减少回六个


两个规格化方向向量以及规格化法线是旋转坐标系的基本向量,因此,您可以通过将这三个向量放在一起,简单地构造旋转矩阵。要获得逆旋转,只需转置得到的矩阵。在旋转的适当一侧添加平移/反平移,您就完成了。

我将如何进行此操作?理论不是我的强项。那取决于你如何准确地操纵这些物体。你在用图书馆吗?你没有指定我们可以用来帮助你的任何东西。我用GSL表示矩阵和向量,但我不知道如何设置旋转矩阵。我想你可以对垂直于整个物体的平面求反,这样你就可以得到你所需要的二维表示,你可以用简单的算术将点X和Y捕捉到最近的点,然后再次应用平面法线。是的,但是如何应用/否定平面法线呢。这些只是对我说的话,谷歌今天并不友好。