Javascript 球面多边形三角剖分

Javascript 球面多边形三角剖分,javascript,html,css,three.js,Javascript,Html,Css,Three.js,填充所有多边形是真的吗。据我所知,ThreeGeoJSON不能填充多边形,只能填充轮廓。我也尝试过三角测量 drawThreeGeo(数据,半径,'sphere',{color:'yellow'//我想编辑土地的填充颜色,而不是轮廓颜色})您需要将每个国家分割成一个单独的几何体,用以找出鼠标位于哪个国家,然后更改其材质。颜色。在右下角,您可以看到光线投射正在运行,源代码可用。该示例中的关键行是: function onDocumentMouseMove( event ) { event.

填充所有多边形是真的吗。据我所知,ThreeGeoJSON不能填充多边形,只能填充轮廓。我也尝试过三角测量


drawThreeGeo(数据,半径,'sphere',{color:'yellow'//我想编辑土地的填充颜色,而不是轮廓颜色})
您需要将每个国家分割成一个单独的几何体,用以找出鼠标位于哪个国家,然后更改其
材质。颜色
。在右下角,您可以看到光线投射正在运行,源代码可用。该示例中的关键行是:

function onDocumentMouseMove( event ) {
    event.preventDefault();
    mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
    mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
}

function render() {
    // find intersections
    raycaster.setFromCamera( mouse, camera );
    var intersects = raycaster.intersectObjects( scene.children );
    if ( intersects.length > 0 ) {
        if ( INTERSECTED != intersects[ 0 ].object ) {
            if ( INTERSECTED ) INTERSECTED.material.emissive.setHex( INTERSECTED.currentHex );
            INTERSECTED = intersects[ 0 ].object;
            INTERSECTED.currentHex = INTERSECTED.material.emissive.getHex();
            INTERSECTED.material.emissive.setHex( 0xff0000 );
        }
    } else {
        if ( INTERSECTED ) INTERSECTED.material.emissive.setHex( INTERSECTED.currentHex );
        INTERSECTED = null;
    }
    renderer.render( scene, camera );
}

我建议您使用更好的地图:

对于每个形状,解决方案包括以下步骤:

  • 将顶点放在形状内部,这样在进行三角形剖分时,它可以绕地球弯曲
  • 运行以构建三角形网格
  • 第2步将在形状外部创建三角形,我们需要通过查看每个三角形来删除它们,并确定它是否属于形状
  • 使用
    convertCoordinates
  • 您可以测试我的JSFIDLE:

    警告:由于输入的详细程度很高,因此速度非常慢

    完整的解决方案:

    /*绘制GeoJSON
    遍历纬度和经度值,将值转换为XYZ坐标,并绘制geoJSON几何图形。
    */
    设三角剖分密度=5;//使其更小以获得更密集的网格
    函数数组(coords){
    let flat=[];
    for(设k=0;kmax.x){
    max.x=点数[点数][0];
    }
    如果(点数[点数][1]max.y){
    最大y=点数[点数][1];
    }
    }
    返回{
    敏:敏,,
    马克斯:马克斯
    };
    }
    函数isInside(点,vs){
    //基于遗传算法的光线投射算法
    // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
    var x=点[0],
    y=点[1];
    var内=假;
    对于(变量i=0,j=vs.length-1;iy)!=(yj>y))和&(x<(xj-xi)*(y-yi)/(yj-yi)+xi);
    如果(相交)内部=!内部;
    }
    返回内部;
    }
    功能GeninServers(点){
    设res=[];
    for(设k=0;k10)中断;
    if(json_geom[geom_num].type=='Point'){
    转换坐标(json_geom[geom_num]。坐标,半径);
    drawParticle(y_值[0],z_值[0],x_值[0],选项);
    }else if(json_geom[geom_num].type=='MultiPoint'){
    for(设point_num=0;point_num