gpt4 book ai didi

android - 在谷歌地图android上的两个经纬度点之间绘制一条曲线(贝塞尔曲线)

转载 作者:搜寻专家 更新时间:2023-11-01 09:29:54 24 4
gpt4 key购买 nike

我想在两个经纬度点之间画一条曲线(Beizer 曲线)。目前我指的是this post (代码在 javascript 中)。

使用三次贝塞尔方程获取曲线点的代码

private void drawElementsOnMap(LatLng init, LatLng end) {

mMap.addMarker(new MarkerOptions().position(init));
mMap.addMarker(new MarkerOptions().position(end));

LatLngBounds.Builder bc = new LatLngBounds.Builder();
bc.include(init);
bc.include(end);

mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bc.build(), 100));

PolylineOptions line = new PolylineOptions();
line.add(init);
line.add(end);
mMap.addPolyline(line);

double distanceBetween = SphericalUtil.computeDistanceBetween(init, end);
double lineHeadingInit = SphericalUtil.computeHeading(init, end);
double lineHeadingEnd = bearing(end, init);*/

double lineHeading1, lineHeading2;
if (lineHeadingInit < 0) {
lineHeading1 = lineHeadingInit + 45;
lineHeading2 = lineHeadingInit + 135;
} else {
lineHeading1 = lineHeadingInit + -45;
lineHeading2 = lineHeadingInit + -135;
}

LatLng pA = SphericalUtil.computeOffset(init, distanceBetween / 2.5, lineHeading1);
LatLng pB = SphericalUtil.computeOffset(end, distanceBetween / 2.5, lineHeading2);

// Beizer curves with 4 points
gmapsCubicBezier(init, end, pA, pB);
}

private void gmapsCubicBezier(LatLng p1, LatLng p2, LatLng pA, LatLng pB) {

//Polyline options
PolylineOptions options = new PolylineOptions();

LatLng curveLatLng = null;
for (double t = 0.0; t < 1.01; t += 0.01) {
// P = (1−t)3P1 + 3(1−t)2tP2 +3(1−t)t2P3 + t3P4; for 4 points
double arcX = (1 - t) * (1 - t) * (1 - t) * p1.latitude
+ 3 * (1 - t) * (1 - t) * t * pA.latitude
+ 3 * (1 - t) * t * t * pB.latitude
+ t * t * t * p2.latitude;
double arcY = (1 - t) * (1 - t) * (1 - t) * p1.longitude
+ 3 * (1 - t) * (1 - t) * t * pA.longitude
+ 3 * (1 - t) * t * t * pB.longitude
+ t * t * t * p2.longitude;

curveLatLng = new LatLng(arcX, arcY);
options.add(curveLatLng);
//Draw polyline
mMap.addPolyline(options.width(5).color(Color.DKGRAY).geodesic(false));
}
mMap.addMarker(new MarkerOptions().position(curveLatLng));
}

以下是我尝试过的不同测试用例的图片。

案例 1:P1 - 孟买,P2 - 钦奈 case 1

案例 2:P1 - 法国,P2 - 新加坡 case 2

案例 3:P1 - 美国,P2 - 类加罗尔 case 3

案例 4:P1 - 美国,P2 - 新加坡 case 4

问题:

1)为什么算法只有在情况1下才能画出相当不错的曲线?

2) 为什么贝塞尔曲线在情况 2 中向一侧弯曲?

3) 为什么贝塞尔曲线在情况 3 和情况 4 中看起来不同(P1(情况 3)和 P2(情况 4)处的奇怪尖点)。有什么办法可以避免吗?

4) 为什么在情况 4 中折线的绘制方式不同(方向?)?

我无法理解绘制曲线的模式。如果我做错了什么,请告诉我。

最佳答案

这个答案有点推测性,但我建议您所看到的实际上没有任何错误,甚至是意外的。如您所知,地球是圆的,但谷歌地图(和计算机屏幕)本质上是平面的和二维的。我们开始创建平面 2D 地球 map 的方法是像这样雕刻一个地球仪:

enter image description here

在创建我们都习惯看到的世界的 2D map 的过程中,事情变得有些扭曲和倾斜。我没有数学来支持它,但很明显,连接全局大部分地区两个城市的 3D 曲线在将它们投影到 2D map 后也会扭曲和倾斜。而且我希望曲线越长,失真会越明显。

这也可以解释为什么从孟买到金奈的曲线对您来说看起来很正常。它位于相对较短的距离内,地球曲率造成的扭曲最小。

关于android - 在谷歌地图android上的两个经纬度点之间绘制一条曲线(贝塞尔曲线),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47950659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com