首页 文章

三维空间中三个三维点的线性插值

提问于
浏览
1

我有三个3D点,如 p1(x1,y1,z1)p2(x2,y2,z2)p3(x3,y3,z3) . 我还有另外一点,但我只知道 xy 这一点的值,如 p4(x4,y4,Z) ,其中 Z 是我想要计算的值 .

我确信 p4(x4,y4) 点是在 p1(x1,y1)p2(x2,y2)p3(x3,y3) 形成的三角形内部,通过delaunay三角测量方法检查 . 如何计算点 p4Z 值?我喜欢在C编程中实现它 . 实际上我正在尝试在MATLAB中实现 griddata .

谢谢

4 回答

  • 1

    p1p2p3 定义一架飞机 . 您可以通过点和法线来表示它 . 例如, P=p1N=(p2-P) x (p3-P) (即,N = p1p2p1p3 的叉积) .

    现在让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
    

    没有线性系统要解决,你只需要一个交叉产品 .

  • 6

    您可以在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)
    
  • 0

    这里的数学问题是解决以下方程组

    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中解决它,你可以实现高斯算法(参见数字食谱书,它可在线获得),或使用线性代数库,如Eigen或其他 .

    备注:无论点 (x4, y4) 是否位于三角形 (x1, y1), (x2, y2), (x3, y3) 内,方法都是相同的 .

  • 4

    这是为了支持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系统,很容易手动解决 .

    只是KISS它;看DanielKO的回答:)

相关问题