使用以下代码绘制圆圈(取自 Google Play 服务“地图”示例):
PolylineOptions options = new PolylineOptions();
int radius = 5; //What is that?
int numPoints = 100;
double phase = 2 * Math.PI / numPoints;
for (int i = 0; i <= numPoints; i++) {
options.add(new LatLng(SYDNEY.latitude + radius * Math.sin(i * phase),
SYDNEY.longitude + radius * Math.cos(i * phase)));
}
int color = Color.RED;
mMap.addPolyline(options
.color(color)
.width(2));
这是在世界不同地区绘制的:
如您所见,圆圈并不是真正的圆圈,甚至第二个基本上都是椭圆。
我猜圆的“抗锯齿”取决于int numPoints
变量中的点数。
int radius = 5
示例代码中的变量是什么?我的意思是它是什么度量?- 主要问题是用给定的半径(以米为单位)绘制漂亮的圆圈的正确方法是什么?类似于我们在 api v1 中的内容
canvas.drawCircle()
更新 - - - - - - - - - -
好的,改进数学后,我能够画出“正确”的圆圈:
private void addCircle(LatLng latLng, double radius)
{
double R = 6371d; // earth's mean radius in km
double d = radius/R; //radius given in km
double lat1 = Math.toRadians(latLng.latitude);
double lon1 = Math.toRadians(latLng.longitude);
PolylineOptions options = new PolylineOptions();
for (int x = 0; x <= 360; x++)
{
double brng = Math.toRadians(x);
double latitudeRad = Math.asin(Math.sin(lat1)*Math.cos(d) + Math.cos(lat1)*Math.sin(d)*Math.cos(brng));
double longitudeRad = (lon1 + Math.atan2(Math.sin(brng)*Math.sin(d)*Math.cos(lat1), Math.cos(d)-Math.sin(lat1)*Math.sin(latitudeRad)));
options.add(new LatLng(Math.toDegrees(latitudeRad), Math.toDegrees(longitudeRad)));
}
mMap.addPolyline(options.color(Color.BLACK).width(2));
}
但是我猜圆圈的抗锯齿有点无法控制,并且在某些缩放级别上,圆圈可能会变得丑陋: