C# 检测矩形是否与地理坐标中的其他矩形相交

C# 检测矩形是否与地理坐标中的其他矩形相交,c#,math,.net-core,geo,C#,Math,.net Core,Geo,我有两个矩形,想检测这个矩形是否和地理坐标中的其他矩形相交。我的实际代码仅适用于正地理坐标值 if (rect1.MaxLongitude < rect2.MinLongitude || rect2.MaxLongitude < rect1.MinLongitude || rect1.MaxLatitude < rect2.MinLatitude || rect2.MaxLatitude < rect1.MinLatitude) { return false; }

我有两个矩形,想检测这个矩形是否和地理坐标中的其他矩形相交。我的实际代码仅适用于正地理坐标值

if (rect1.MaxLongitude < rect2.MinLongitude || rect2.MaxLongitude < rect1.MinLongitude || rect1.MaxLatitude < rect2.MinLatitude || rect2.MaxLatitude < rect1.MinLatitude)
{
    return false;
}
else
{
    return true;
}
if(rect1.maxLength

如何在地理坐标系中检测正负值(即使在一个坐标系中)?

矩形是否可以自由旋转,或者直线是否严格水平和垂直?前者的难度稍高一些。后者由您的代码暗示

假设是后者,我希望您的代码即使对负数也能工作

                0
                |   
 LON(-)/LAT(+)  |  LON(+)/LAT(+) 
                |   
 ---------------+-----------------0
                |   
 LON(-)/LAT(-)  |  LON(+)/LAT(-) 
                |
除了顺序很重要。如果这两个比较中的任何一个为真,则您的算法在某些情况下会中断:

rect1.minLon > rect2.minLon
rect1.maxLon > rect2.maxLon
让我们通过您的算法获取一些示例矩形:

两个相交的正矩形: rect1{(1,1)-(4,4)}rect2{(2,2)-(6,6)}

返回false,因为我们只需要一个真值

rect1.MaxLongitude(4) < rect2.MinLongitude(2) false
rect2.MaxLongitude(6) < rect1.MinLongitude(1) false
rect1.MaxLatitude(4) < rect2.MinLatitude(2)   **true**
rect2.MaxLatitude(6) < rect1.MinLatitude(1)   false
rect1.MaxLongitude(4)
如果它们不相交,但rect2在地图上的位置低于rect1,会发生什么情况: 矩形{(10,10)-(40,40)}矩形{(2,2)-(6-6)}

这也会返回false,但三角形不相交:

rect1.MaxLongitude(40) < rect2.MinLongitude(2) false
rect2.MaxLongitude(6) < rect1.MinLongitude(10) **true**
rect1.MaxLatitude(40) < rect2.MinLatitude(2)   false
rect2.MaxLatitude(6) < rect1.MinLatitude(20)   **true**
rect1.MaxLongitude(40)
这是算法的一个边情况问题,其中:(rect1.minLon>rect2.minLon&&rect1.minLat>rect2.minLat)。确保算法在这两种情况下工作的一种方法是确保比较rect1始终较低的位置和rect2的左侧(西部)。但是仍然存在一个问题,因为您仍然不允许以下操作:(rect1.minLon>rect2.minLon&&rect1.minLat 我已经没有动力了,实际上不会为您解决问题,但是您可以通过将问题分为4种情况来处理问题:

scenario 1 : (rect1.minLon > rect2.minLon && rect1.maxLon > rect2.maxLon) 
scenario 2 : (rect1.minLon < rect2.minLon && rect1.maxLon < rect2.maxLon) 
scenario 3 : (rect1.minLon < rect2.minLon && rect1.maxLon > rect2.maxLon)
scenario 4 : (rect1.minLon > rect2.minLon && rect1.maxLon< rect2.maxLon) 
场景1:(rect1.minLon>rect2.minLon&&rect1.maxLon>rect2.maxLon)
场景2:(rect1.minLonrect2.maxLon)
场景4:(rect1.minLon>rect2.minLon&&rect1.maxLon

每个都有一个单独的方法,每个方法都有一个与当前算法一样简单的解决方案,但它们实际上并不相同。我认为你的算法解决了场景2。可能应该是第一个。

.NET参考源可能会有所帮助@托弗:你会怎么做?你可以在每个值上加一个大于180的数字?不管是使用long/lat还是X/Y。代码还是一样的。因此作为dup关闭。