判断点是否在多边形内部(冬奥)
(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平方