如何找到一个点是否是另一个点javascript的楔形

时间:2017-08-15 10:32:41

标签: javascript canvas

我有画布,我画了2分。 我必须从每个点画出两条直线。然后我们必须检查点 u 是否看到点 v ,反之亦然。

要知道,有必要查看点 v 是否位于 u 点的 wedge 中,反之亦然:

- Here V is the wedge of U, so V sees U but U don't see V

- Here V sees U and U sees V

如果2个点位于每个点的楔形中,则在2个点之间绘制一个线段。

如何在画布javascript中进行这种楔形?

1 个答案:

答案 0 :(得分:1)

两个载体的交叉产物。

使用直线(x1,y1,x2,y2)的叉积a a向量(x2-x1,y2-y1)和从该行开始的向量x,y(x - x1,y) - y1)将给出一个数字,如果该点位于该行的左侧则为负数,如果该点位于该行,则为零;如果该点位于该行的右侧,则为正数。

因此,对于V视图中的一个点,它必须位于V左臂的右侧和V的右臂的左侧。

V描述如下

const v = {
    lx : ?,  // point on left V
    ly : ?, 
    x : ?,  // point of V
    y : ?,
    rx : ?,
    ry : ?,
}

如果V1可以看到V2其中v1v2是如上所述的对象,则以下函数将返回true。

function canSee(v1,v2){
    const lx = v1.lx - v1.x;  // get vector from center to left line end
    const ly = v1.ly - v1.y;
    const cx = v2.x  - v1.x;  // get vector from center to v2's center
    const cy = v2.y  - v1.y;
    const rx = v1.rx - v1.x;  // get vector from center to right line end
    const ry = v1.ry - v1.y;

    // get the cross product of left and right arms to the other V's center
    const lc = lx * cy - ly * cx;
    const rc = rx * cy - ry * cx;

    return (lc > 0 && rc < 0);  // return true if V2 center is right of
                                // left arm and left of arm.
                                // else return false;
}

使用该功能,您可以看出两者是否可以按如下方式看到对方。

if(canSee(v1, v2) && canSee(v2, v1)){ } // both can see each other
else { } //one or none can see the other

重要的是这些点位于正确的一侧。当站在一线开始并朝向线端

时,定义左和右