真的很讨厌,数学不是太好,但是几何还好,纵使是这样,该忘了的还是忘了!满意以为随便搜搜都是一大堆,但是我真的想错了!
看结果图:
40条边数,获取每一个点的在实际地理中的坐标(经纬度)
原点(center)是=32.02103 : 118.763435
为了解决在百度API中缺少图形是否相交的判断,所以必须,要判断两个图形边缘的点,这下问题就来了,
网上搜一大片,全是绘制View的,找了很久,算了自己算吧!!
上代码:
1.获取圆形上的多个点集合
/**
*
* @param lineNum需要获取的正多边形书也可以认为是点的个数
* @param a需要的偏移量本项目中默认是50
* @param ll地理坐标的中心店
* @return实际地理范围的坐标店集合
*/
public static ArrayList<LatLng> logPoint(int lineNum, double a, LatLng ll) {
ArrayList<LatLng> lls = new ArrayList<LatLng>();
float angle = 360 / lineNum;
// 已知多边形的半径为50
double b, c;// 边长,a是圆半径固定是50,b是高(Y轴),C是长(X轴)
float A = 90, B, C;// 角度,设定B是向量-变化
for (int i = 0; i < lineNum; i++) {
float angleCenter = angle * i;
Log.i("zjs","当前角度 = "+angleCenter);
if(angleCenter <=180){
B = angleCenter;
C = 90 - B;
b=a * Math.sin(Math.toRadians(B));
c = a * Math.sin(Math.toRadians(C));
}else{
B = angleCenter-360;
C = 90 - B;
b=a * Math.sin(Math.toRadians(B));
c = a * Math.sin(Math.toRadians(C));
}
// 1.同一纬线上经度差一度,实际距离差多少
// 111km*cosφ (φ为当地纬度)
// 2.同一经线上纬度差一度,实际距离差多少
// 111km
// Log.d("zjs","b= "+b+" : c="+c);
b = b / (111000*Math.cos(ll.longitude)) + ll.longitude;
c = c / 111000 + ll.latitude;
Log.d("zjs","以地理坐标点为中心——第"+(i+1)+"个坐标点的位置是 = "+b+" : "+c);
lls.add(new LatLng(c, b));
}
return lls;
}
2.通过百度API判断是否相交
// TODO 获取正多边形(40边)的角点,(后面可以加入方位角,根据需求减少判断的方向)
ArrayList<LatLng> lls = logPoint(40, minlen, gps);
boolean inDistance = false;
for (int i = 0; i < lls.size(); i++) {
if (SpatialRelationUtil.isPolygonContainsPoint(list,
lls.get(i))) {
inDistance=true;
break;
}
}
铛铛铛:(需要注意的坑)
1.Java的Math.sin等调用的参数是弧度,我一度直接调用,到时结果莫名其妙,所以一定要转换成角度,不会再被坑了,
2.实际地理地图中的坐标和长度之间的转换,//能复制就复制,别敲错了
3.在角度和方向的问题,判断减少了,以180度为中心对半开。前面写的绕了
然后就可以妥妥来实现,google,高德都有的(图形相交的状态)功能了,
加油了,继续努力!!
谢谢你您的回复,根据您的回复我单独在底图上绘制出来
我也想明白你们为什么会是椭圆的,或者说椭圆都不算,是向个鸡蛋一样。
真的对此我还是不太了解…