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

为何画椭圆?

当时看到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个椭圆的点,换可以偏转方向呦

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值