3

所以我正在用 XNA/C# 开发一个风险类型的游戏。我有一张类似于这张的地图,我需要能够检测每个区域(数字)上的鼠标悬停。如果这些区域是正方形,那就很容易了,因为它们每个都可以用一个矩形来表示。但是,它们是不同大小的多边形。是否存在类似于正方形的多边形?如果没有,我该怎么做呢?

4

3 回答 3

4

我建议这样做:为每个数字附加颜色,用这些颜色重新创建您的图片:每个形状都将具有其特定的颜色。不要在屏幕上绘制,仅用作参考地图。当用户在您的原始地图上单击或移动鼠标时,您只需将鼠标坐标投影到颜色地图中,检查鼠标下方像素的颜色,因为您将每种颜色与区域数相关联......

于 2012-12-26T01:08:40.307 回答
1

这不是 c# 特定的(因为我从来没有用这种语言写过任何东西,所以不知道有什么 api),尽管有两种算法可以用来检测一个点是否在多边形内(可以使用检测鼠标点是否在另一个多边形/地图形状上)。

一种是基于光线投射,您将光线从(鼠标)点沿 1 个方向投射到“无穷远”(在这种情况下为板的边缘),并计算它穿过多边形边缘的次数。如果是奇数,则该点在多边形内,如果是偶数,则该点在多边形外。

它的 wiki 链接:http ://en.wikipedia.org/wiki/Point_in_polygon#Ray_casting_algorithm

想到的另一种算法仅适用于我认为的三角形,但我认为它可以更简单地实现(快速浏览一下您的形状,我认为它们可以很容易地分解为三角形,有些已经是三角形)。这与检查该点是否位于三角形所有边的同一(内部)“边”有关。要找出一个点与边缘的“边”,您需要创建 2 个向量,第一个向量将是边缘本身(由 2 个点组成),另一个向量将是该边缘的第一个点到输入点,然后计算这两个向量的叉积。结果将是负数或正数,可用于确定“方向”。

指向它的链接:http: //www.blackpawn.com/texts/pointinpoly/default.html (在该页面上是另一种也适用于三角形的算法)

于 2012-12-26T01:17:33.007 回答
0

实时对多边形进行命中测试并不难。如果地图很大,您可以使用 KD-Tree 进行优化。否则Contains,为多边形找到一个简单的方法并使用它。我在另一台电脑上有一个。让我知道你是否愿意。

于 2012-12-26T13:27:28.327 回答