检测非正方形图片部分的鼠标悬停

3

我正在使用XNA/C#开发一款风险类型的游戏。我有一个地图,类似于这个,我需要能够检测到每个领土(数字)上的鼠标悬停事件。如果这些区域是正方形,那么很容易,因为它们可以用矩形表示。然而,它们是不同大小的多边形。是否有类似于正方形的多边形形状?如果没有,我该如何处理?

3个回答

4
我建议这样做:为每个数字附上颜色,用这些颜色重新绘制你的图片:每个形状都有它特定的颜色。不要在屏幕上画出它,只把它作为参考地图。当用户点击或将鼠标移动到你的原始地图上时,你只需将鼠标坐标投影到颜色地图中,检查鼠标下方的像素颜色,因为你已经将每种颜色与领土编号关联起来...

1
我不确定。当使用存储在Texture2D中的位图时,代码如下:Texture2D tex;Color[] texColors = new Color[height * width]; tex.GetData(texColors); - Viktor Podlipský
1
这听起来很容易想到,但对于计算机来说并不理想。确保你不要使用反锯齿绘图。个人而言,我会选择一个空间的数学模型而不是位图。 - Drew Noakes
数学方法很复杂,但可能过于复杂了。参考色彩地图本身并没有绘制,我认为抗锯齿不会破坏或干扰它。 - Viktor Podlipský

1

这不是特定于C#的(因为我从未编写过任何语言的代码,所以不知道有哪些API),但是有两种算法可以用于检测点是否在多边形内部(可以用于检测鼠标指针是否悬停在另一个多边形/地图形状上)。

其中一种基于射线投射,您需要从(鼠标)点向“无限”方向(在此情况下是棋盘的边缘)发射一条射线,并计算它穿过多边形边缘的次数。如果是奇数,则该点位于多边形内部,如果是偶数,则该点位于多边形外部。

维基链接:http://en.wikipedia.org/wiki/Point_in_polygon#Ray_casting_algorithm

我记得另一种算法只适用于三角形,但我认为它可能更容易实现(快速浏览您的形状后,我认为它们可以轻松地分解成三角形,有些已经是三角形了)。它与检查点是否在三角形的所有边的相同(内部)“侧面”有关。要找出点相对于边的“侧面”,您需要创建两个向量,第一个向量是边本身(由2个点组成),另一个向量是该边的第一个点到输入点的距离,然后计算这两个向量的叉积。结果将为负或正,这可用于确定“方向”。
一个链接:http://www.blackpawn.com/texts/pointinpoly/default.html (该页面上还有另一种算法也适用于三角形)

0

在实时环境下,对多边形进行命中测试并不是很困难。如果地图非常大,可以使用KD-Tree进行优化。否则,找到一个简单的Contains方法来处理多边形。我在另一台电脑上有这样的方法。如果需要,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接