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){
    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);

 

上一篇:Three 之 Animation 初印象


下一篇:解决 three.js 模型颜色偏差问题