javascript - 如何确定一个点是否在其他两个点之间?
问题描述
我做了一个不太正确的小功能......
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
解决方案
要检查 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 之间。
推荐阅读
- python - 在 Python 中调用 Oracle 存储过程时出现错误“不支持 dict 类型的值”
- networking - 第一次自己配置cisco路由器 为什么上不了网?
- postgresql - WSL2 和 Docker 桌面上的 Postgres 卷挂载:PGDATA 文件夹上的权限被拒绝
- java - 创建一个接受数字和 + 作为第一个字符的正则表达式
- javascript - 错误:“无法实例化 firebase-storage - 请务必先加载 firebase-app.js”
- ssis - 如何多次运行 SSIS 包?
- javascript - 当 DOM style="display:block; 使用 selenium/js 时,有什么方法可以获取元素的文本
- crystal-reports - Crystal Report - 将页脚抑制到最后一页 - 在其他页面上创建空白区域
- python - Python/Flask:有没有办法生成密码提示而不是制作整个用户平台?
- python - Unity POST 到本地主机的请求