根据直线上已知的两点A(xa,ya),B(xb,yb),求出该直线上距A点长度为L的点 // 根据直线上已知的两点A(xa,ya),B(xb,yb),求出该直线上距A点长度为L的点// @param xa 第一个点的横坐标// @param ya 第一
// 根据直线上已知的两点A(xa,ya),B(xb,yb),求出该直线上距A点长度为L的点 // @param xa 第一个点的横坐标 // @param ya 第一个点的纵坐标 // @param xb 第二个点的横坐标 // @param yb 第二个点的纵坐标 // @param L 距离第一个点的距离,不能小于0 // @param direction 返回的点是与AB向量的正方向还是返回向的,1:负方向(默认),0:正方向 function calculatePoint(xa, ya, xb, yb, L, direction) { if(xa == "undefined" || xb == "undefined" || ya == "undefined" ||yb == "undefined" ){ return {}; } direction = direction == 0 ? direction : 1; if (L <= 0) { return {}; } // 两个所求的点 var pointArr = calculateLinePoints(xa, ya, xb, yb, L); if(pointArr.length == 0) { return {}; } // 要返回的点 var point = null; // 向量AB的x坐标 var vectorAB_X = xb - xa; // 向量AB的y坐标 var vectorAB_Y = yb - ya; for (var i = 0; i < pointArr.length; i++) { // 求向量AO的x坐标 var vectorAO_X = pointArr[i].x - xa; // 求向量AO的y坐标 var vectorAO_Y = pointArr[i].y - ya; // 判断两个向量方向 var positive = vectorAB_X * vectorAO_X + vectorAB_Y * vectorAO_Y; if (direction == 0) { // 大于0说明同向,小于0返向,等于0垂直 if (positive > 0) { point = pointArr[i]; }else{ continue; } }else{ if (positive < 0) { point = pointArr[i]; }else{ continue; } } } return point; }根据直线上已知的两点A(xa,ya),B(xb,yb),求出该直线上距A点长度为L的两个点
// 根据直线上已知的两点A(xa,ya),B(xb,yb),求出该直线上距A点长度为L的两个点。返回数组长度为0时,说明无解 function calculateLinePoints(xa, ya, xb, yb, L) { var k = calculateK(xa, ya, xb, yb); var p1 = {}; var p2 = {}; // 直线AB与x轴垂直 if (k == null) { p1.x = xa; p1.y = ya + L; p2.x = xa; p2.y = ya - L; return [ p1, p2 ]; } // 直线AB与y轴垂直 if (k == 0) { p1.x = xa - L; p1.y = ya; p2.x = xa + L; p2.y = ya; return [ p1, p2 ]; } // 其他情况 var bVal = calculateB(xa, ya, k); // 由AB直线函数y=kx+b、距离L,及两个坐标点可推导出如下数据 var a = k * k + 1; var b = 2 * k * bVal - 2*xa - 2 * ya * k; var c = xa * xa + ya * ya + bVal * bVal - 2 * ya * bVal - L * L; // 以下涉及到曲线函数(二元一次方程)的求根公式 // b平方减去4ac小于0时,说明无解 var temp = b * b - 4 * a * c; if (temp < 0) { console.error("无解") return []; } var sqrtVal = Math.abs(Math.sqrt(temp)); p1.x = (-1*b + sqrtVal) / 2 * a; p1.y = k * p1.x + bVal; p2.x = (-1*b - sqrtVal) / 2 * a; p2.y = k * p2.x + bVal; return [ p1, p2 ]; } // 计算两点形的直线函数的斜率k(y=kx+b),两点连线与x轴垂直时返回null function calculateK(xa, ya, xb, yb) { if (xa == xb) { return null; } var k = (ya - yb) / (xa - xb) return k; } // 计算两点形的直线函数的常值b(y=kx+b) function calculateB(x, y, k) { if (k == null) { return null; } var b = y - k * x; return b; }