您现在的位置是:首页 >技术交流 >3D项目中用到的一些算法网站首页技术交流
3D项目中用到的一些算法
简介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平方
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。