【问题标题】:Get indexes for intersection获取交叉点的索引
【发布时间】:2012-10-03 11:42:08
【问题描述】:

我有问题。我正在使用下面的代码找到一个交叉点:

Envelope[][] extents = new Envelope[tilesCountX][tilesCountY];

// some code here to set "extents" values

var intersectedTiles =
    extents
    .SelectMany(es => es)
    .Where(e => EnvIntersects(e, bounds))
    .ToList();

private static bool EnvIntersects(Envelope e1, Envelope e2)
{
    return e1.MinX >= e2.MinX && e1.MaxX <= e2.MaxX && e1.MinY >= e2.MinY && e1.MaxY <= e2.MaxY;
}

它有效,但我想获取相交范围的索引。

例如
如果extents[2][7]是相交元素,我想得到27

是否可以通过修改我的代码来实现?

[编辑]

bounds 是一个 Envelope,其中包含 MinXMinYMaxXMaxY 属性。

Envelope bounds = new Envelope();
bounds.MinX = some_value_1;
bounds.MaxX = some_value_2;
bounds.MinY = some_value_3;
bounds.MaxY = some_value_4;

【问题讨论】:

  • “界限”从何而来? SelectMany 似乎不合适。
  • 您使用的是什么版本的 C#? Envelope[][] extents = new Envelope[tilesCountX][tilesCountY]; 在 .NET 4.0 中无法为我编译
  • 你的EnvIntersects 需要比我所谓的“交叉点”更严格的条件,顺便说一句。
  • @w0lf 我知道,但我写了tilesCountY 是为了告诉你Y-size 的价值。

标签: c# linq intersection set-intersection


【解决方案1】:

我认为这也可以满足您的需求:

var intersectedIndices =
    from x in Enumerable.Range(0, tilesCountX)
    from y in Enumerable.Range(0, tilesCountY)
    where EnvIntersects(extents[x, y], bounds)
    select new { x, y };

【讨论】:

    【解决方案2】:

    试试这个:

    var intersectedTiles =
    extents
    .SelectMany((es,i) => es.Select((x,j)=>new{I=i,J=j,Element = x}))
    .Where(e => EnvIntersects(e.Element, bounds))
    .ToList();
    

    对于 intersectedTiles 中的所有元素,这是正确的:

    intersectedTiles[x].Element == extents[intersectedTiles[x].I][intersectedTiles[x].J]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2021-08-29
      • 1970-01-01
      • 2020-09-05
      相关资源
      最近更新 更多