百度地图开发之如何绘画椭圆

    xiaoxiao2021-04-19  99

    为何画椭圆?

    当时看到API上有画椭圆的代码,然后就秉承着拿来主义,直接就用了,然后发现根本用不了,和我的实际需求不符合,所以就自己写了这段代码,让大家知识共享

    如何画椭圆?

    详细过程我不再这里描述,我在代码中写了注释,大家看看就是

    下来看代码

    center 椭圆中心 long 长轴公里数 short 短轴公里数 angle 偏转角度 a^2=b^2+c^2 长短轴之间的关系 F1P+F2P=2a 椭圆上任意一点到两焦点之间的距离相等 x^2/a^2+y^2/b^2=1 x轴的椭圆标准方程 function ovalPoint(centre,long,short,angle){ var Point = new Array(); var pLng;//这个点的经度 var pLat;//这个点的纬度 //下面求椭圆方程 var a = long; var b = short; //单位米 var aPoint; var aPointLng; var A;//用于存储椭圆的长轴 //现在要实现在纬度上找到这个相应的点 在同一纬度下距离原点b米的经度 for(var i = 0.0000; i<parseFloat(180.0000)-centre.lng;i=parseFloat(i)+0.00001){ var aLng = centre.lng+i; aPoint = new BMap.Point(aLng,centre.lat); if( map.getDistance(centre,aPoint).toFixed(0) == a.toFixed(0)*1000 ){//在这个纬度下寻找距离为a的点 aPointLng=aLng;//找到这个点的经度 break; } } //然后相减就得到了椭圆中的a A=aPointLng-centre.lng;//短轴长度 是以地理坐标系的度为单位的 // alert("A"+A); //同样方法计算短轴 var bPoint; var bPointLat; var B; //用于存储椭圆的短轴 for(var i = 0.0000; i<parseFloat(90.0000)-centre.lat;i=parseFloat(i)+0.00001){ var bLat = centre.lat+i; bPoint = new BMap.Point(centre.lng,bLat); if(map.getDistance(centre,bPoint).toFixed(0) == b.toFixed(0)*1000){//在这个经度下寻找距离为b的点 bPointLat = bLat; break; } } B=bPointLat - centre.lat;//这里得到的是以地理坐标系中的度做单位的 // alert("B"+B); //得到C if (A>B) { var C = Math.sqrt(Math.pow(A,2) - Math.pow(B,2) ); }else{ var C = Math.sqrt(Math.pow(B,2) - Math.pow(A,2) ); } //alert("C"+C); if(!isNaN(B)){ getfocue(angle,C,centre); } //得到椭圆的点 //思路 如果我以一个斜率去画一条线与椭圆相交就可以得到两个点 //现在开始设那条线 的 K值 var kVar= new Array(); for(var i = 0; i<360;i++){ kVar.push( Math.tan( i*(2*Math.PI/360)) ); } //x^2/a^2+y^2/b^2=1 => x=根号下a^2*b^2/(b^2)+a^2*k^2 var assemble = new Array(); var onePoint; var twoPoint; var threePoint; for(var i = 0; i<359;i++){//在第一象限找这个点 if(i>=0 && i<=90){ x= Math.sqrt( (Math.pow(A,2)*Math.pow(B,2)) / ( Math.pow(B,2)+( Math.pow(A,2)*Math.pow(kVar[i],2) )) ); y= kVar[i]*x; onePoint = new BMap.Point(centre.lng + x,centre.lat+y); assemble.push(onePoint); }else if(i>=91 && i<=270){//在第二三象限找这个点 x=(-1)* Math.sqrt( (Math.pow(A,2)*Math.pow(B,2)) / ( Math.pow(B,2)+( Math.pow(A,2)*Math.pow(kVar[i],2) )) ); y= kVar[i]*x; twoPoint = new BMap.Point(centre.lng + x,centre.lat+y); assemble.push(twoPoint); }else if(i>270 && i<=359){//在第四象限找这个点 x= Math.sqrt( (Math.pow(A,2)*Math.pow(B,2)) / ( Math.pow(B,2)+( Math.pow(A,2)*Math.pow(kVar[i],2) )) ); y= kVar[i]*x; threePoint = new BMap.Point(centre.lng + x,centre.lat+y); assemble.push(threePoint); } } //计算倾斜角所用的变量 var lng; var lat; for(var i=0 ; i<assemble.length ; i++){//可用代码 向量法旋转椭圆 lng=assemble[i].lng-centre.lng;//与原点相差的经度 lat=assemble[i].lat-centre.lat;//与原点相差的纬度 var x=Math.abs( lng * Math.cos(angle)); var y=Math.abs( lng * Math.sin(angle)); if(i>=0&&i<90) { assemble[i].lng = assemble[i].lng + x; assemble[i].lat = assemble[i].lat + y; }else if(i>=90&&i<180){ assemble[i].lng=assemble[i].lng - x; assemble[i].lat=assemble[i].lat - y; }else if(i>=180&&i<270){ assemble[i].lng=assemble[i].lng - x; assemble[i].lat=assemble[i].lat - y; }else if(i>=270&&i<359){ assemble[i].lng=assemble[i].lng + x; assemble[i].lat=assemble[i].lat + y; } } return assemble; }这里也只是算出了360个椭圆的点,换可以偏转方向呦
    转载请注明原文地址: https://ju.6miu.com/read-676025.html

    最新回复(0)