// 计算两个点的关系 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){ debugger; 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 + 2 ){ // 如果点数量小于3了 则已经是完成了 ringtem.push.apply(ringtem, ringArray.splice(i, Infinity) ); // if( ringtem.length < 3 ) { break; } // ringArray = 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,2],[2,2],[2,0]]) console.log(g);