首页 > 解决方案 > 如何确定一个点是否在其他两个点之间?

问题描述

我做了一个不太正确的小功能......

function isPointbetweenTwoOthers (pA, pB, pToCheck) {
    var pApB = new THREE.Vector3();
    pApB.subVectors(pA,pB).normalize();

    var pBpA = new THREE.Vector3();
    pBpA.subVectors(pB,pA).normalize();

    var pA_pToCheck = new THREE.Vector3();
    pA_pToCheck.subVectors(pA,pToCheck).normalize();

    var pB_pToCheck = new THREE.Vector3();
    pB_pToCheck.subVectors(pB,pToCheck).normalize();

    if(pA_pToCheck.dot(pApB) <0 || pB_pToCheck.dot(pBpA) <0)
    return false
    else return true
}

在此处输入图像描述 我究竟做错了什么?根据我的函数的输出,左上方的点位于右侧的两者之间

@Pete 新功能:

function isPointBetweenTwoOthers (pA, pB, pToCheck) {
    var pApB = new THREE.Vector3();
    pApB.subVectors(pA,pB)
    var pApB_length = pApB.length()

    var pBpA = new THREE.Vector3();
    pBpA.subVectors(pB,pA)
    var pBpA_length = pBpA.length()
    var pA_pToCheck = new THREE.Vector3();
    pA_pToCheck.subVectors(pA,pToCheck)

    var pB_pToCheck = new THREE.Vector3();
    pB_pToCheck.subVectors(pB,pToCheck)

    var pToCheck_pA = new THREE.Vector3();
    pToCheck_pA.subVectors(pToCheck,pA)
    var pToCheck_pA_length = pToCheck_pA.length()

    if(pToCheck_pA_length > pBpA_length)
    {return false}
        else if(pToCheck_pA.dot(pBpA) > 0.999999 *pToCheck_pA.x*pBpA.x + pToCheck_pA.y*pBpA.y + pToCheck_pA.z*pBpA.z) 
        {return true}
        else {return false}
}

现在(下图中的暗球是 C 点)只要我添加 0.999999 ,它就会输出这种情况为真。没有它,在这种情况下它可以正常工作...... 在此处输入图像描述 但在没有 0.9999 的另一种情况下,它告诉我 C 不在 A 和 B 之间,使用以下几点......

var t1 = new THREE.Vector3(1,1,1); //A
var t2 = new THREE.Vector3(-1,1,1); //B
var t3 = new THREE.Vector3(-0.3999999999999999,1,1);  //C

在此处输入图像描述

标签: javascriptmaththree.jsgeometry

解决方案


要检查 C 是否在 A 和 B 之间,计算例如向量差u=subVectors(pB,pA)v=subVectors(pC,pA)。分别计算向量lu和的长度lv。如果lv>lu,则返回 false,因为 C 离 A 比 B 更远。如果不是这种情况,请检查u和的点积是否v等于lu*lv(或者如果它大于0.9999*lu*lv具有一定的数值​​容差)并在这种情况下返回 true,否则返回 false。解释:如果 C 距离 A 不比 B 远,并且从 A 到 B 和从 A 到 C 的向量是平行的(但不是反平行的),则点积为lu*lv( cos(0°)=1 ,而 cos (180 度,反平行情况)=-1 ),C 位于 A 和 B 之间。


推荐阅读