arcgis three渲染 之 面转三角算法

// 计算两个点的关系
		 
		let point1 = [1,1]
		let point2 = [0,0]
		let point3 = [0,1]
		let point4 = [1,2]
		 
		let line1 = [point1, point2]
		let line2 = [point3, point4]
		 
		// 判断两条直线是否相交
		let getInter = function(line1, line2){
		    // 首先将线段二分为2两个点
		    let p1 = line2[0]
		    let p2 = line2[1]
		 
		    let p3 = line1[0]
		    let p4 = line1[1]
		    // 首先分析点1和险段1定点1的角度
		    let an1 = toAngle(p1, p3);
		    let an2 = toAngle(p1, p4);
		    let an3 = toAngle(p1, p2);
		    // console.log("1:",an1);
		    // console.log("2:",an2);
		    // console.log("3:",an3);
		    // console.log("max:",Math.max(an1, an2))
		    // console.log("min:",Math.min(an1, an2))
		    // 只要角度an3的度数不再1 和 2范围内
		    return an3 < Math.max(an1, an2) && an3 > Math.min(an1, an2)
		}
		 
		// 计算坐标点和坐标点之间的正像角度
		let toAngle = function (p1, p2){
		    // 获取x轴的数值
		    let x = p1[0] - p2[0];
		    // 获取y轴的数值
		    let y = p1[1] - p2[1];
		    if( x == 0 && y == 0 ) return 0;
		    // 根据tan获取角度信息
		    let an = 0;
		    // 获取象限位置
		    let quadrant = getQuadrant(p1,p2);
		    if( quadrant == 1 ){
		        // 如果是1象限
		        an = Math.atan(Math.abs(x / y)) * 180 / Math.PI;
		    }else if( quadrant == 2 ){
		        an = Math.atan(Math.abs(y / x)) * 180 / Math.PI + 270;
		    }else if( quadrant == 3 ){
		        an = Math.atan(Math.abs(x / y)) * 180 / Math.PI + 180;
		    }else if( quadrant == 4 ){
		        an = Math.atan(Math.abs(y / x)) * 180 / Math.PI + 90;
		    }
		    return an;
		}
		 
		// 根据点与点之间的象限问题
		let getQuadrant = function (p1, p2){
		    if( p1[0] > p2[0] ){
		        // 如果x轴大于  则默认在二三象限
		        if( p1[1] > p2[1] ){
		            // 如果默认y轴大于  则确定为三象限
		            return 3
		        }else{
		            return 2;
		        }
		    }else{
		        // 如果x轴大于  则默认在二三象限
		        if( p1[1] > p2[1] ){
		            // 如果默认y轴大于  则确定为三象限
		            return 4
		        }else{
		            return 1;
		        }
		    }
		}
		 
		// console.log(getInter(line1, line2));
		 
		// 开始计算面转三角组合
		let getTriangleByPolygon = function (rings){
		    let ringArray = rings.map((e,i)=>{ e.push(i);return e; }).concat();
		    let ringtem = [];
		    let a , b , c, line, i = 0, inds = [];
		     
		    for( var ii = 100; ringArray.length !== 0 || ii <= 0 ; ii-- ){
		        a = ringArray[i];
		        b = ringArray[i+1];
		        c = ringArray[i+2];
		 
		        // 获得链接的线段
		        line = [a,c];
		        // 判断这个线段是否与几何相交
		        if( getInterByRings( ringArray, line ) ){
		            // 如果是相交的则直接保留点位,开始进入下一个点进行计算
		            i+=1;
		            ringtem.push(a,b);
		        }else{
		            i+=2;
		            inds.push([a , b, c ]);
		            ringtem.push(a)
		        };
		 
		        if( ringArray.length <= i + 3 ){
		            // 如果点数量小于3了 则已经是完成了
		            ringtem.push.apply(ringtem, ringArray.splice(i, Infinity) );
		            //
		            if( ringtem.length < 3 ) {
		                break;
		            }
		            //
		            ringArray = ringtem;
					
					ringtem = [];
		            // 重制下标
		            i = 0;
		        }
		    }
		 
		    return {
		        inds: inds
		    }
		}
		 
		// 求直线和几何边线数组是否相交
		let getInterByRings = function(rings, line){
		    for( var i = 0; i < rings.length - 1; i++ ){
		        var linenew = [rings[i], rings[i+1]];
		        if( getInter(linenew, line) ){
		            return true;
		        };
		    }
		    return false;
		}
		 
		let g = getTriangleByPolygon([[0,0],[0,1],[1,1],[1,0]])
		 
		console.log(g);

  

posted @ 2021-09-13 01:29  blurs  阅读(81)  评论(0编辑  收藏  举报