3D项目中用到的一些算法

判断点是否在多边形内部(冬奥)
(1)面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。
(2)夹角和判别法:判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部。
(3)引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。
判断点是否在四边形内部(冬奥)

pointInRect(areaVertex, pos){// 四边形内的点都在顺时针(逆时针)向量的同一边,即夹角小于90o,向量积同向。
		var A = areaVertex[0], B = areaVertex[1], C = areaVertex[2], D = areaVertex[3];
		var x = pos.x, y = pos.z;
		var a = (B[0] - A[0])*(y - A[1]) - (B[1] - A[1])*(x - A[0]);
		var b = (C[0] - B[0])*(y - B[1]) - (C[1] - B[1])*(x - B[0]);
		var c = (D[0] - C[0])*(y - C[1]) - (D[1] - C[1])*(x - C[0]);
		var d = (A[0] - D[0])*(y - D[1]) - (A[1] - D[1])*(x - D[0]);
		if((a > 0 && b > 0 && c > 0 && d > 0) || (a < 0 && b < 0 && c < 0 && d < 0)) {
			return true;
		}
		return false; 
	}

计算点到直线的距离(冬奥)

pointToLine(line, point){// 计算点到直线的最短距离;
		let p1 = line[0], p2 = line[1], p3 = point;
		var A = (p1[1] - p2[1]) / (p1[0] - p2[0]);
		var B = p1[1] - A * p1[0];
		return Math.abs((A * p3.x + B - p3.z) / Math.sqrt(A * A + 1));
	}

计算点到线段的最短距离(冬奥)

已知当前绕Y轴的角度值(绕x,z角度均为0),求解方向向量(x,y,z)

let modR = mod.transform.rotationEuler.y / 180 * Math.PI;
let x = -Math.sin(modR);
let z = -Math.cos(modR);
this.rigidBody.move(new Laya.Vector3(x / 100 * this.speed * this.devSpeed, 0, z / 100 * this.speed * this.devSpeed));

已知向量a,b,求解a,b向量的夹角,及a在b向量的顺时针方向还是逆时针方向

let cosAlpha = Laya.Vector3.dot(aV,bV) / (Laya.Vector3.scalarLength(aV) * Laya.Vector3.scalarLength(bV));
let alpha = Math.acos(cosAlpha);// 此值始终大于0小于Math.PI;
let cross = (aV.x * bV.z - bV.x * aV.z);
let g = cross > 0 ? -0.03 : 0.03;// aV在bV的逆时针方向为-0.03;aV在bV的顺时针方向为0.03;

已知两点a,b,计算两点延长线上的某一点(延长距离为dis)(灯笼)
var c = a - b;
c.normalize();
a + c*dis;

圆方程(摇杆)
x平方 + y平方 = z平方

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值