我正在使用XNA/C#开发一款风险类型的游戏。我有一个地图,类似于这个,我需要能够检测到每个领土(数字)上的鼠标悬停事件。如果这些区域是正方形,那么很容易,因为它们可以用矩形表示。然而,它们是不同大小的多边形。是否有类似于正方形的多边形形状?如果没有,我该如何处理?
这不是特定于C#的(因为我从未编写过任何语言的代码,所以不知道有哪些API),但是有两种算法可以用于检测点是否在多边形内部(可以用于检测鼠标指针是否悬停在另一个多边形/地图形状上)。
其中一种基于射线投射,您需要从(鼠标)点向“无限”方向(在此情况下是棋盘的边缘)发射一条射线,并计算它穿过多边形边缘的次数。如果是奇数,则该点位于多边形内部,如果是偶数,则该点位于多边形外部。
维基链接:http://en.wikipedia.org/wiki/Point_in_polygon#Ray_casting_algorithm
我记得另一种算法只适用于三角形,但我认为它可能更容易实现(快速浏览您的形状后,我认为它们可以轻松地分解成三角形,有些已经是三角形了)。它与检查点是否在三角形的所有边的相同(内部)“侧面”有关。要找出点相对于边的“侧面”,您需要创建两个向量,第一个向量是边本身(由2个点组成),另一个向量是该边的第一个点到输入点的距离,然后计算这两个向量的叉积。结果将为负或正,这可用于确定“方向”。在实时环境下,对多边形进行命中测试并不是很困难。如果地图非常大,可以使用KD-Tree进行优化。否则,找到一个简单的Contains
方法来处理多边形。我在另一台电脑上有这样的方法。如果需要,请告诉我。