2012-07-26 29 views
1

我想写一个应用程序来绘制包含矩形,线条和圆形的示意图。现在我想添加另一个功能来将矩形拖到不同的位置。我面临的问题是检测我是否在矩形内点击过。我知道有一个功能,如Rectangle.Contains(Point)。要使用这种方法,我需要使用for循环来检查每个矩形。如果我有大量的矩形存在,那么使用这种方法并不明智。有没有其他的方式来完成这项任务。如何检测我的鼠标位置是否在矩形c#内?

回答

0

我会将显示区域划分为象限。 然后将矩形放置到左上角,右上角,左下角,右下角的网格中。 放置它们意味着,为每个象限创建一个列表,并在其中放置矩形。

点击该点后,确定它属于哪个区域并仅在那些矩形中搜索。这种方法将您的线性搜索减少了4倍。

请记住,您还需要注意重叠的地方可以属于许多矩形。这里矩形的z顺序很重要。因此,虽然列表是为象限维护的,但它应该按z顺序作为关键字进行排序。

希望这会有所帮助。

3

你需要计算机图形学教科书,经常讨论这个和类似的问题。

如果记忆为我服务,请确保该点位于矩形的顶部边缘之下,底部边缘之上,左边缘的左边缘和左边缘的右边之上。

关于测试循环中的一串矩形。考虑让每个矩形都有一个圆圈,一个边界圆。首先测试该点是否远离圆的起点,而不是圆的半径。如果是这样,则不需要测试矩形,它是一个小姐。好的,那是一个非常理论上的答案。实际上,计算从点到原点的距离可能是一个非常昂贵的计算,它涉及平方根,所以在矩形检查中进行四点比较可能会更快。再次,如果内存服务器我,我们并不在乎距离原点的距离只有大于半径。所以只需部分执行距离计算,省略最终的平方根,然后与半径的平方进行比较。当然,您仍然需要进行实验和配置文件,以确保此边界圆检查比矩形检查中的常规点更快,您需要确保您有足够的失误来抵消最终会做的点击边界圆和矩形都检查。

0

可能是这样的吗?

public bool isRectangelContainPoint(RectangleF rec, PointF pt) 
    { 
     if (pt.X >= rec.Left && pt.X <= rec.Right && pt.Y <= rec.Bottom && pt.Y >= rec.Top) 
      return true; 
     else 
      return false; 
    } 
0

您需要使用空间索引快速查找鼠标所在的矩形。我建议一个R树,这里的理论框架部分:

http://en.wikipedia.org/wiki/R-tree

和C#,执行:

http://sourceforge.net/projects/cspatialindexrt/

创建rtee,添加矩形,然后调用rtree.nearest方法用鼠标坐标来知道包含鼠标光标的矩形。您可以使用距离参数进行游戏。

希望它能帮助,

鞍本Panglose。

相关问题