【问题标题】:Intersection - Envelope交叉口 - 信封
【发布时间】:2012-09-27 12:45:48
【问题描述】:

我有Envelope[][] extents = new Envelope[][]; 构造。每个信封具有MinXMaxXMinYMaxY 属性,并表示网格的一个图块(左下角和右上角点)。现在我有另一个Envelope bounds;,其中包含X-Y-axis 的最小值和最大值。我想从与bounds 相交的extents 获取瓷砖。

有没有使用Envelope.Intersect 的简单方法来做到这一点?

[编辑]
现在我是这样做的(蛮力xD):

List<Envelope> intersectedTiles = new List<Envelope>();
for (int i = 0; i < extents.LongLength; i++)
{
    for (int j = 0; j < extents.Length; j++)
    {
        if (extents[i][j].MinX >= bounds.MinX && extents[i][j].MaxX <= bounds.MaxX &&
            extents[i][j].MinY >= bounds.MinY && extents[i][j].MaxY <= bounds.MaxY)
        {
            intersectedTiles.Add(extents[i][j]);
        }
    }
}

【问题讨论】:

  • 你应该展示你尝试过的代码

标签: c# collections set intersection set-intersection


【解决方案1】:
private static bool Intersects(Envelope e1, Envelope e2)
{
    return e1.MinX >= e2.MinX && e1.MaxX <= e2.MaxX && e1.MinY >= e2.MinY && e1.MaxY <= e2.MaxY;
}

List<Envelope> intersectedTiles = extents.SelectMany(es => es)
    .Where(e => Intersects(e, bounds))
    .ToList();

【讨论】:

  • e in Where 子句是 nullIntersects 返回 NullReferenceException
  • @Nickon - 然后你在extents 的一个数组中的某处有一个空元素。您可以通过将条件更改为 Where(e =&gt; e != null &amp;&amp; Intersects(bounds, e)) 来忽略它们,尽管删除空值会更好。
  • 是的,你是对的......我的计算有问题,这就是出现null的原因:) 现在一切正常,但我不得不将Intersects(bounds, e)更改为Intersects(e, bounds) .谢谢
猜你喜欢
  • 2015-03-15
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 2017-07-05
相关资源
最近更新 更多