【原创】已知四个坐标点求其两条直线交点坐标
//判断第一个点 与 第四个点所连直线 与 第2个点和第3个点 所连直线的交点 是否在 第2个和第3个点的线段上 function getCrossPoint(point1, point2, point3, point4) { var pD_x = point1.split(',')[0]; var pD_y = point1.split(',')[1]; var pA_x = point2.split(',')[0]; var pA_y = point2.split(',')[1]; var pC_x = point3.split(',')[0]; var pC_y = point3.split(',')[1]; var pB_x = point4.split(',')[0]; var pB_y = point4.split(',')[1]; var k_y = (pB_x * pC_y * pD_y - pD_x * pB_y * pC_y - pA_y * pB_x * pD_y + pD_x * pB_y * pA_y + pC_x * pA_y * pD_y - pA_x * pC_y * pD_y - pC_x * pB_y * pA_y + pA_x * pB_y * pC_y) / (pD_y * pC_x - pA_x * pD_y - pB_y * pC_x + pA_x * pB_y + pB_x * pC_y - pD_x * pC_y - pA_y * pB_x + pA_y * pD_x); var k_x = (pD_y * (pC_x - pA_x) * (pB_x - pD_x) - pA_y * (pC_x - pA_x) * (pB_x - pD_x) + pA_x * (pC_y - pA_y) * (pB_x - pD_x) + pD_x * (pD_y - pB_y) * (pC_x - pA_x)) / ((pC_y - pA_y) * (pB_x - pD_x) + (pD_y - pB_y) * (pC_x - pA_x)); return k_x + ',' + k_y; }
//判断 随机产生的点 和点X 的连线 与地图上已知的两点(给出的坐标中连续的两点)之间的连线 的 交点 是否在 已知的两点的线段之上 如果在之上:那么点X的顺序应该调整到已知的两点中间 function CrosspointIsOnTheLine(point1, point2, point3, point4) { var crossPoint = getCrossPoint(point1, point2, point3, point4);//交点坐标 var result = { online: false,//是否在线段上 nearP2: undefined//如果不在线段上,是否近p2,否则近p3 }; //交点分别到 第2点 和 第3点 之间的距离 等于 第2点到第3点的距离 那么 交点在线段上 var cp_xy = crossPoint.split(','); var p2_xy = point2.split(','); var p3_xy = point3.split(','); var cp_p2_length = getLength(cp_xy[0], cp_xy[1], p2_xy[0], p2_xy[1]);//交点到p2的距离 var cp_p3_length = getLength(cp_xy[0], cp_xy[1], p3_xy[0], p3_xy[1]);//交点到p3的距离 var p2_p3_length = getLength(p2_xy[0], p2_xy[1], p3_xy[0], p3_xy[1]);//p2到p3的距离 //由于线段的长度本身存在精度的问题 ,所以这么比较 交点到 p2和p3的距离 同时小于 p2到p3的距离 说明 交点在 p2到p3的线段上 if (cp_p2_length <= p2_p3_length && cp_p3_length <= p2_p3_length) { result.online = true; } else { //if (cp_p2_length > p2_p3_length) { // result.nearP2 = false; //} //else if (cp_p3_length > p2_p3_length) { // result.nearP2 = true; //} } return result; }
getLength()函数见下一篇
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?