假设我有以下内容:
我如何确定:
我正在寻找一个完整的公式/算法,而不是数学课程本身。
答案 0 :(得分:3)
答案 1 :(得分:3)
使用Stereographic projection。所有圆圈(特别是纬度,经度和圆圈)都映射到平面中的圆(或线)。现在只是关于平面几何中的圆和线的问题(更好的是,所有的长度都是0到0的线,所有的纬度都是0左右的圆)。
答案 2 :(得分:2)
这个怎么样?
找到将矩形中心(点v
)连接到圆心的矢量Cr
。找到i
与v
相交的点||i-Cr|| + r > ||v||
。如果v
则它们相交。
换句话说,矩形内的线段长度加上圆内线段的长度应该大于总长度(i
,中心连接线段)。
寻找点{{1}}应该是一个棘手的部分,特别是如果它落在经度边缘,但你应该能够提供比我更快的东西。
编辑:此方法无法判断圆是否完全在矩形内。您需要找到从中心到矩形边缘的四个边缘的距离。
编辑:以上内容不正确。有些情况,正如Federico Ramponi建议的那样,即使在欧几里德几何中它也不起作用。我会发布另一个答案。请不要接受这个并随意投票。我很快就会删除它。
答案 3 :(得分:2)
假设:
第一次检查是微不足道的。第二次检查只需要找到四个距离。第三项检查只需要找到从圆心到(最近的盒子纬度,圆心 - 经度)的距离。
第四项检查需要找到最接近圆心的边界框的经度线。然后找到距离圆心最远的经度线所在的大圆的中心。找到从圆心到大圆心的初始方位。从该轴承的圆心中找出圆弧半径。如果该点位于距离圆心最近的经度线的另一侧,则圆和边界框在该边相交。
在我看来应该有一个缺陷,但我找不到它。
我似乎无法解决的真正问题是找到完美包含圆圈的边界框(对于不包含极点的圆圈)。纬度最小值/最大值的方位似乎是圆心和圆半径/(球面周长/ 4)的纬度的函数。在赤道附近,它落到pi / 2(东)或3 * pi / 2(西)。随着中心接近极点并且半径接近球面周长/ 4,轴承接近零(北)或pi(南)。
答案 4 :(得分:1)
再试一次......
我认为解决方案是测试一组积分,正如Jason S建议的那样,但我不同意他选择的积分,我认为这在数学上是错误的。
您需要找到lat / long框两侧的点,其中到圆心的距离是局部最小值或最大值。将这些点添加到角集,然后上面的算法应该是正确的。
即,让经度为x维度,纬度为y维度,让每个维度 对于o <= t <= 1.0,框的边是参数曲线P(t)= P0 + t(P1-P0),其中 P0和P1是两个相邻的角。
设f(P)= f(P.x,P.y)是距圆心的距离。
然后f(P0 + t(P1-P0))是t:g(t)的距离函数。找到距离函数的导数为零的所有点:g'(t)== 0.(丢弃解决方案超出域0&lt; = t&lt; = 1.0,当然)
不幸的是,这需要找到超越表达式的零,因此没有封闭形式的解决方案。这种类型的方程只能通过Newton-Raphson迭代求解。
好的,我意识到你需要代码,而不是数学。但数学就是我所拥有的。
答案 5 :(得分:1)
这适用于地球上的任何一点。如果要将其更改为不同大小的球体,只需将kEarchRadiusKms更改为球体所需的半径。
此方法用于计算纬度和离子点之间的距离。
我从这里得到了这个距离公式: http://www.codeproject.com/csharp/distancebetweenlocations.asp
public static double Calc(double Lat1, double Long1, double Lat2, double Long2)
{
double dDistance = Double.MinValue;
double dLat1InRad = Lat1 * (Math.PI / 180.0);
double dLong1InRad = Long1 * (Math.PI / 180.0);
double dLat2InRad = Lat2 * (Math.PI / 180.0);
double dLong2InRad = Long2 * (Math.PI / 180.0);
double dLongitude = dLong2InRad - dLong1InRad;
double dLatitude = dLat2InRad - dLat1InRad;
// Intermediate result a.
double a = Math.Pow(Math.Sin(dLatitude / 2.0), 2.0) +
Math.Cos(dLat1InRad) * Math.Cos(dLat2InRad) *
Math.Pow(Math.Sin(dLongitude / 2.0), 2.0);
// Intermediate result c (great circle distance in Radians).
double c = 2.0 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1.0 - a));
// Distance.
// const Double kEarthRadiusMiles = 3956.0;
const Double kEarthRadiusKms = 6376.5;
dDistance = kEarthRadiusKms * c;
return dDistance;
}
如果矩形的任何顶点之间的距离小于圆的半径距离,则圆和矩形重叠。如果圆心和所有顶点之间的距离大于圆的半径,并且所有这些距离都比矩形的宽度和高度短,那么圆应该在矩形内部。
如果您发现问题,请随意更正我的代码,因为我确信有一些我没想过的情况。
此外,我不确定这是否适用于跨越半球末端的矩形,因为距离方程可能会崩溃。
public string Test(double cLat,
double cLon,
double cRadius,
double rlat1,
double rlon1,
double rlat2,
double rlon2,
double rlat3,
double rlon3,
double rlat4,
double rlon4)
{
double d1 = Calc(cLat, cLon, rlat1, rlon1);
double d2 = Calc(cLat, cLon, rlat2, rlon2);
double d3 = Calc(cLat, cLon, rlat3, rlon3);
double d4 = Calc(cLat, cLon, rlat4, rlon4);
if (d1 <= cRadius ||
d2 <= cRadius ||
d3 <= cRadius ||
d4 <= cRadius)
{
return "Circle and Rectangle intersect...";
}
double width = Calc(rlat1, rlon1, rlat2, rlon2);
double height = Calc(rlat1, rlon1, rlat4, rlon4);
if (d1 >= cRadius &&
d2 >= cRadius &&
d3 >= cRadius &&
d4 >= cRadius &&
width >= d1 &&
width >= d2 &&
width >= d3 &&
width >= d4 &&
height >= d1 &&
height >= d2 &&
height >= d3 &&
height >= d4)
{
return "Circle is Inside of Rectangle!";
}
return "NO!";
}
答案 6 :(得分:-1)
有关欧几里德几何答案,请参阅:Circle-Rectangle collision detection (intersection)