// 计算两个点的关系
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);