根据直线上已知的两点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;
}
