3D 空间中三个 3D 点的线性插值
Linear interpolation of three 3D points in 3D space
我有三个3D点,如p1(x1,y1,z1)
,p2(x2,y2,z2)
,p3(x3,y3,z3)
。我还有另一个点,但我只知道x
,y
那个点的值,比如p4(x4,y4,Z)
,其中Z
是我喜欢计算的值。
我确信p4(x4,y4)
点在由p1(x1,y1)
、p2(x2,y2)
、p3(x3,y3)
通过德劳内三角测量方法核对形成的三角形内。如何计算点p4
Z
值?我喜欢在C编程中实现它。实际上,我正在尝试在MATLAB中实现griddata
。
谢谢
p1
、p2
、p3
定义一个平面。你可以用一个点和一个法线来表示它。例如,P=p1
、 N=(p2-P) x (p3-P)
(即 N = p1p2
和 p1p3
的叉积)。
现在,对于 p4 在同一平面上,它满足平面方程:
(p4-P) · N = 0 %// dot product
⇒ (x4-x1)*N.x + (y4-y1)*N.y + (z4-z1)*N.z = 0
重新排列:
z4 = z1 - ((x4-x1)*N.x + (y4-y1)*N.y)/ N.z
没有线性系统需要求解,你只需要一个叉积。
您可以在 P1P2P3 向量的基础上表示 P4 坐标。
x4 = x1 + A * (x2 - x1) + B * (x3 - x1)
y4 = y1 + A * (y2 - y1) + B * (y3 - y1)
这是易于求解的线性方程组。您必须找到 A 和 B 系数,然后使用它们来计算 z 坐标
z4 = z1 + A * (z2 - z1) + B * (z3 - z1)
这是为了支持MBo和Konstantin的答案。请不要接受这个问题,而是接受其他问题之一。
以下是在 MATLAB 中实现解决方案的方式:
%// Your known 3 points
p1 = [ 1 10 0]';
p2 = [-1 10 10]';
p3 = [ 0 0 10]';
%// your 4th target point
p4 = [0 5 NaN]';
%// Difference matrix/vector
A = [p2-p1 p3-p1];
b = p4-p1;
%// Compute solution
p4(end) = p1(end) + A(3,:)*(A(1:2,:)b(1:2));
现在,在C++中,仅仅包含相关eigen
库这一事实就相当惊人地放大了可执行文件的大小。eigen
能够对这个简单的 2x2 系统完全矫枉过正。
所以我不会求助于eigen
,除非你有很多其他线性代数的事情要做。这是一个简单的 2x2 系统,很容易手动解决。
只要吻它;看看丹尼尔KO的答案:)
这里的数学问题是求解下面的方程组
p1 + a * (p2 - p1) + b * (p3 - p1) = (x4, y4, z4)
或等效
(x1,y1,z1) + a * (x2-x1, y2-y1, z2-z1) + b * (x3-x1, y3-y1, z3-z1) = (x4, y4, z4)
对于 A、B 和 Z4。
要在 C/C++ 中解决它,您可以实现高斯算法(另请参阅数值配方书,可在线获得),或使用线性代数库,如本征库或其他库。
备注:无论点(x4, y4)
是否位于三角形(x1, y1), (x2, y2), (x3, y3)
内,方法都是相同的。
- 无法将结构注册为增强几何体3D点
- OpenGL大的3D纹理(>2GB)非常慢
- 向量上的线性搜索
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 二叉搜索如何比线性搜索更快?
- 线性丢番图方程 - 求给定区间内的解数和解
- 查找自动生成键并具有线性内存消耗的小型关联数组
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 为什么字符串比较的 == 运算符相对于任一字符串长度线性时间(似乎)?
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 线性优化目标函数中的绝对值
- 如何从 3D 曲面网格中删除自相交三角形?
- CUDA 使用共享内存平铺 3D 卷积实现
- 检查框内的 3D 点
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- 犰狳C++:带有模量计算的线性组合
- Frank Luna 在他的书"使用 DirectX12 进行 3D 游戏编程"的介绍中盒子示例的问题
- 3D 空间中三个 3D 点的线性插值
- 从cuda 3D内存复制到线性内存:复制的数据不是我所期望的