为何画椭圆?
当时看到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