找到在二维中获取点到三角形距离的最佳解决方案



我想在2D中找到点和三角形之间的距离
我想到的唯一解决方案是找到每一边的距离,取最小的
所以我做了一个点到每个边平面的平移,并使用勾股定理:

function getAngle(from, to) {
return Math.atan2(to.y - from.y, to.x - from.x);
}
function getDistance(from, to) {
let a = from.x - to.x;
let b = from.y - to.y;
return Math.sqrt(a*a + b*b);
}
function getDistanceToTriangle(from, triangle) {
function getDistanceToSide(sideX, sideY, sideAngle, sideWidth) {
let angle = getAngle({x:sideX, y:sideY}, from) - sideAngle;
let distance = getDistance({x:sideX, y:sideY}, from);
let fromX = Math.cos(angle) * distance + sideX;
let fromY = Math.sin(angle) * distance + sideY;
let a = fromX - Math.max(Math.min(fromX, sideX + sideWidth), sideX);
let b = fromY - sideY;              
return Math.sqrt(a*a + b*b);
}
let abDistance = getDistanceToSide(triangle.ax, triangle.ay, triangle.abAngle, triangle.abWidth);
let bcDistance = getDistanceToSide(triangle.bx, triangle.by, triangle.bcAngle, triangle.bcWidth);
let caDistance = getDistanceToSide(triangle.cx, triangle.cy, triangle.caAngle, triangle.caWidth);
return Math.min(Math.min(abDistance, bcDistance), caDistance);
}

有更好/更快的解决方案来解决这个问题吗?

好。我试图从axic向我指出的wiki中实现解决方案,是的,现在它似乎更高效了:

function getDistanceToTriangle(from, triangle) {
function getDistanceToSide(x1, y1, x2, y2, sideWidth) {
return ((y2 - y1) * from.x - (x2 - x1) * from.y + x2 * y1 - y2 * x1) / sideWidth;
}
let abDistance = getDistanceToSide(triangle.ax, triangle.ay, triangle.bx, triangle.by, triangle.abWidth);
let bcDistance = getDistanceToSide(triangle.bx, triangle.by, triangle.cx, triangle.cy, triangle.bcWidth);
let caDistance = getDistanceToSide(triangle.cx, triangle.cy, triangle.ax, triangle.ay, triangle.caWidth);
return Math.max(Math.max(abDistance, bcDistance), caDistance);
}

getDistance函数预先计算出三角形各边的sideWidth

function getDistance(from, to) {
let a = from.x - to.x;
let b = from.y - to.y;
return Math.sqrt(a*a + b*b);
}

为了提高效率,公式的某些部分也可以预先计算。

最新更新