• 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; 
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    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));
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    已知当前绕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));
    
    • 1
    • 2
    • 3
    • 4

    已知向量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;
    
    • 1
    • 2
    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;
    
    • 1
    • 2

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

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

  • 相关阅读:
    Kafka - This server does not host this topic-partition
    Python3语法总结-数据转换②
    C++ 多态:(使用Shape类层次结构的多态性的屏幕管理器)开发一个基本图形软件包
    TaskManager的启动流程
    vue3笔记2
    c++day6
    标量、向量、矩阵、张量之间的区别和联系
    【Docker】软链接安装Docker到非系统盘(如D盘),并更改镜像位置
    Windows上的实用CMD命令
    【模板】最短路问题系列(Dijkstra、SPFA、A*等算法)
  • 原文地址:https://blog.csdn.net/qq_34568700/article/details/123371885