如何在 2D 中计算三乘积

How to compute triple product in 2D

提问人:TOOL 提问时间:6/29/2022 最后编辑:TOOL 更新时间:6/29/2022 访问量:161

问:

我正在阅读这篇关于如何编写用于碰撞检测的 GJK 算法的文章,但我不是在 3D 中进行,而是在 2D 中进行。

但是,在某一时刻有这段代码:

bool Line(
    Simplex& points,
    vector3& direction)
{
    vector3 a = points[0];
    vector3 b = points[1];

    vector3 ab = b - a;
    vector3 ao =   - a;
 
    if (SameDirection(ab, ao)) {
        direction = ab.cross(ao).cross(ab);
    }

    else {
        points = { a };
        direction = ao;
    }

    return false;
}

正如你所看到的,他将两个叉积链接起来以找到下一个方向,但是我怎么能在2D中做到这一点呢?

这是一张使这些向量更清晰的图片:

Graphic of the AB and AO vectors

数学 向量 语言不可知 2D 交叉乘积

评论

0赞 Spektre 6/30/2022
只是一个愚蠢的题外话,2D 中的交叉产品只有一个操作数......所以它不能用于组合更多的向量......您描述的是使用 2D 矢量的 3D 交叉积......例如......z=0.0
0赞 TOOL 6/30/2022
是的,我应该说得更清楚。由于双叉积的结果位于两个向量的同一平面上,因此它认为可以在“二维”中计算它。(这是约翰·阿莱克西乌的回答)
0赞 Spektre 6/30/2022
没有分析你真正在做什么(几何意义),但是的,这很可能是 2D 可计算的......最有可能使用产品将某些矢量投影到垂直或其他方向......您仍然可以使用 2D 交叉来获得法线...但是,有一些方法可以做到这一点dot
1赞 qrsngky 6/30/2022
对于单个叉积,结果不在两个向量的平面上。因此,在计算另一个叉积之前,您无论如何都需要假设 3D。

答:

3赞 John Alexiou 6/29/2022 #1

3D 中的矢量交叉三元积为

P = a×(b×c)

可以使用以下矩阵/向量积计算全展开

|px|   | -ay*by-az*bz     ay*bx        az*bx      | | cx |
|py| = |    ax*by      -ax*bx-az*bz    az*by      | | cy |
|pz|   |    ax*bx         ay*bz      -ax*bx-ay*by | | cz |

上述投影有多个 2D 投影,如果没有,则一个或两个向量 abc 不在平面外(z 分量不为零)。

在您的例子中,所有三个向量都在平面 (和 ) 中,这会产生以下结果az=0bz=0cz=0

|px|   | -ay*by   ay*bx               0 | | cx |   | ay*(bx*cy-by*cx) |
|py| = |  ax*by  -ax*bx               0 | | cy | = | ax*(by*cx-bx*cy) |
| 0|   |      0       0    -ax*bx-ay*by | |  0 |   |                0 |

所以你有它。上面的右侧是 2D 中 a×(b×c) 的结果。

评论

0赞 TOOL 6/29/2022
多谢!就我而言,对于 ab 将是 b,ao = c 和 ab = a 权利?还是 ab = a、ao = b 和 ab = c?ab.cross(ao).cross(ab);
1赞 TOOL 6/29/2022
啊,我想通了,因为 x (b x c) 等价于 (c x b) x a,所以在我的情况下,它将是 ab x (ao x ab)
1赞 John Alexiou 6/30/2022
@TOOL - 好点取决于如何解析二进制运算符的语言,但在这种情况下,它将是 .(ab.cross(ao)).cross(ab)