好的,所以我对在 Stack Overflow 上提问还是很陌生,所以请客气 :)
我有一个问题,我已经尝试解决了一个月,结果一次又一次地失败。我发现了各种与此有些相似的问题,但没有什么让我印象深刻的答案。
到目前为止,我发现的最接近的是: 将 GPS 坐标转换为坐标平面。
简而言之,我需要知道的是 GPS 坐标是在椭圆上还是在椭圆内。
知道:
- 椭圆的宽度(以米为单位)
- 椭圆的高度(以米为单位)
- 椭圆中心的 GPS 坐标(可能是坐标系上的 [0,0])
- 测试点GPS坐标
- 测试点角度
- 到测试点的距离
未知/需求:
- 椭圆上点的 GPS 坐标与测试点角度
- 到椭圆上的点与测试点角度的距离
出于某种原因,请提供帮助,我只是无法围绕这个数学思考。
更新: 为了添加更多信息,在宏伟的计划中,这些值都非常小。
例如:如果用户想知道另一个用户是否进入了某个公园/场地/地理围栏区域或某些其他类型的物理区域。在这种情况下,物理区域被设计为椭圆。
另外,这是用 Objective-C 编写的。下面,您将看到一个随机的“+90”度,这是因为当我希望它是 Unit-Circle "Normal" 时,底层机制将 0 度视为北(导航)。
与讨论相关的代码:
- (BOOL)isLocation:(CLLocation *)location withinEllipse:(Ellipse *)ellipse
{
BOOL locationIsWithinEllipse = NO;
double ellipseWidth = ellipse.width;
double ellipseHeight = ellipse.height;
CLLocationDegrees locationAngleDegrees = 360 - ((int)([self headingBetweenCoordinate1:location.coordinate coordinate2:ellipse.locationCenter.coordinate] + 90) % 360);//Invert Direction
double xOffsetInMeters = (ellipseWidth/2) * COS(DEGREES_TO_RADIANS(locationAngleDegrees));
double yOffsetInMeters = (ellipseHeight/2) * SIN(DEGREES_TO_RADIANS(locationAngleDegrees));
// The logic below will currently grab the Top-Right point as if it were a box, not the point on the Ellipse,
// This is where things are broken. I need this to be the GPS Coordinate of the Point on the Ellipse with angle (locationAngleDegrees)
// Grab the Coordinate on the Ellipse in the heading of the Test Point
CLLocationDegrees pointLat = [ellipse.locationCenter addToLocationDistanceInMeters:yOffsetInMeters withBearingInDegrees:0].coordinate.latitude;
CLLocationDegrees pointLong = [ellipse.locationCenter addToLocationDistanceInMeters:xOffsetInMeters withBearingInDegrees:90].coordinate.longitude;
CLLocation * testPointOnEllipseLocation = [[CLLocation alloc] initWithLatitude:pointLat longitude:pointLong];
// Just check if the Test Point is closer than the Distance of the Ellipse Point
if(ABS([location distanceFromLocation:ellipse.locationCenter]) <= ABS([testPointOnEllipseLocation distanceFromLocation:ellipse.locationCenter]))
{
locationIsWithinEllipse = YES;
}
return locationIsWithinEllipse;
}
更新:
我仍在努力使这个数学正确。我了解如何使用“学校数学”来完成它,但是如何将其应用于示例中的代码?另外,我真的不理解所有这些轮换的东西,因为我编写的所有代码都与任何轮换无关。我相信这一切都在 Apple 的低级定位中得到了处理。
有人可以帮忙吗?