JS:求点与线段的最短距离,并返回该最短距离在线段上的坐标。

直接上代码:

function PointToLineDistance (xx, yy, x1, y1, x2, y2) {

let ang1, ang2, ang, m;

let result = 0;

// 分别计算三条边的长度

 

const a = Math.sqrt((x1 - xx) * (x1 - xx) + (y1 - yy) * (y1 - yy));

 

if (a === 0) {

return [0, { x: x1,

y: y1 }];

}

const b = Math.sqrt((x2 - xx) * (x2 - xx) + (y2 - yy) * (y2 - yy));

 

if (b === 0) {

return [0, { x: x2,

y: y2 }];

}

const c = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));

// 如果线段是一个点则退出函数并返回距离

 

if (c === 0) {

result = a;

 

return [result, { x: x1,

y: y1 }];

}

// 如果点(xx,yy到点x1,y1)这条边短

if (a < b) {

// 如果直线段AB是水平线。得到直线段AB的弧度

if (y1 === y2) {

if (x1 < x2) {

ang1 = 0;

} else {

ang1 = Math.PI;

}

} else {

m = (x2 - x1) / c;

if (m - 1 > 0.00001) {

m = 1;

}

ang1 = Math.acos(m);

if (y1 > y2) {

ang1 = Math.PI * 2 - ang1;

}// 直线(x1,y1)-(x2,y2)与折X轴正向夹角的弧度

}

m = (xx - x1) / a;

if (m - 1 > 0.00001) {

m = 1;

}

ang2 = Math.acos(m);

if (y1 > yy) {

ang2 = Math.PI * 2 - ang2;

}// 直线(x1,y1)-(xx,yy)与折X轴正向夹角的弧度

 

ang = ang2 - ang1;

if (ang < 0) {

ang = -ang;

}

 

if (ang > Math.PI) {

ang = Math.PI * 2 - ang;

}

// 如果是钝角则直接返回距离

if (ang > Math.PI / 2) {

return [a, { x: x1,

y: y1 }];

}

 

// 返回距离并且求得当前距离所在线段的坐标

if (x1 === x2) {

return [b * Math.sin(ang), { x: x1,

y: yy }];

} else if (y1 === y2) {

return [b * Math.sin(ang), { x: xx,

y: y1 }];

}

// 直线的斜率存在且不为0的情况下

let x = 0,

y = 0;

const k1 = ((y2 - y1) / x2 - x1);

const kk = -1 / k1;

const bb = yy - xx * kk;

const b1 = y2 - x2 * k1;

 

x = (b1 - bb) / (kk - k1);

y = kk * x + bb;

 

return [a * Math.sin(ang), { x,

y }];

}

 

// 如果两个点的纵坐标相同,则直接得到直线斜率的弧度

if (y1 === y2) {

if (x1 < x2) {

ang1 = Math.PI;

} else {

ang1 = 0;

}

} else {

m = (x1 - x2) / c;

if (m - 1 > 0.00001) {

m = 1;

}

ang1 = Math.acos(m);

if (y2 > y1) {

ang1 = Math.PI * 2 - ang1;

}

}

m = (xx - x2) / b;

if (m - 1 > 0.00001) {

m = 1;

}

ang2 = Math.acos(m);// 直线(x2-x1)-(xx,yy)斜率的弧度

if (y2 > yy) {

ang2 = Math.PI * 2 - ang2;

}

ang = ang2 - ang1;

if (ang < 0) {

ang = -ang;

}

if (ang > Math.PI) {

ang = Math.PI * 2 - ang;

}// 交角的大小

// 如果是对角则直接返回距离

if (ang > Math.PI / 2) {

return [b, { x: x2,

y: y2 }];

}

 

// 如果是锐角,返回计算得到的距离,并计算出相应的坐标

if (x1 === x2) {

return [b * Math.sin(ang), { x: x1,

y: yy }];

} else if (y1 === y2) {

return [b * Math.sin(ang), { x: xx,

y: y1 }];

}

// 直线的斜率存在且不为0的情况下

let x = 0,

y = 0;

const k1 = ((y2 - y1) / x2 - x1);

const kk = -1 / k1;

const bb = yy - xx * kk;

const b1 = y2 - x2 * k1;

 

x = (b1 - bb) / (kk - k1);

y = kk * x + bb;

 

return [b * Math.sin(ang), { x,

y }];

 

}

 

在C++中,计算多段线各个之间的最短距离通常涉及到计算线段之间的距离,并找到所有可能的最小距离组合。这个问题可以分解为以下几个步骤: 1. 输入多段线坐标:首先,你需要从用户那里获取多段线上的所有坐标。这些坐标可以存储在一个向量或者其他容器中。 2. 构造线段:从序列中,你将构造出多段线的每一段,每个线段由两个连续的定义。 3. 计算距离:对于多段线上的每一对线段,你需要计算它们之间可能形成的距离。这些距离可能包括线段之间的端到端距离、端线段的最短距离到直线距离)。 4. 找出最小值:在所有计算出的距离中,找出最小的值,这个值就是多段线坐标之间的最短距离。 这是一个涉及数学和计算几何的问题,实际编码过程中需要考虑效率和准确性。下面是一个简化的代码示例框架,用于说明如何组织代码来处理这个问题: ```cpp #include <iostream> #include <vector> #include <cmath> #include <limits> // 定义一个的结构体 struct Point { double x, y; }; // 计算之间的距离 double calculateDistance(const Point& p1, const Point& p2) { return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2)); } // 计算线段的最短距离线段投影上的垂足到距离) double pointToLineSegmentDistance(const Point& point, const Point& lineStart, const Point& lineEnd) { // 你的实现代码... } // 主函数 int main() { // 输入坐标 std::vector<Point> points; // 你的输入代码... // 构造线段计算短距离 double minDistance = std::numeric_limits<double>::max(); // 你的距离计算代码... // 输出最小距离 std::cout << "最短距离是: " << minDistance << std::endl; return 0; } ``` 在上述代码中,我们定义了一个`Point`结构体来表示坐标,并提供了计算之间距离的函数`calculateDistance`,还预留了计算线段距离的函数`pointToLineSegmentDistance`。在`main`函数中,你需要完成坐标的输入,并实现计算多段线上各个之间的最短距离的逻辑。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bricke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值