我有画布,我画了2分。 我必须从每个点画出两条直线。然后我们必须检查点 u 是否看到点 v ,反之亦然。
要知道,有必要查看点 v 是否位于 u 点的 wedge 中,反之亦然:
- Here V is the wedge of U, so V sees U but U don't see V
如果2个点位于每个点的楔形中,则在2个点之间绘制一个线段。
如何在画布javascript中进行这种楔形?
答案 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
其中v1
和v2
是如上所述的对象,则以下函数将返回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
重要的是这些点位于正确的一侧。当站在一线开始并朝向线端
时,定义左和右