当前位置 : 主页 > 网络编程 > JavaScript >

根据直线上已知的两点A(xa,ya),B(xb,yb),求出该直线上距A点长度为L的点。最重要

来源:互联网 收集:自由互联 发布时间:2021-06-28
根据直线上已知的两点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的点
// 根据直线上已知的两点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;
	}
网友评论