所以我正在使用XNA / C#中的Risk类型游戏。我有一张类似this one的地图,我需要能够在每个区域(数字)上检测到鼠标悬停。如果这些区域是正方形,那将很容易,因为它们每个都可以用矩形表示。但是,它们是不同大小的多边形。是否存在类似于正方形的多边形形状?如果没有,我该怎么做呢?
答案 0 :(得分:4)
我觉得这个:为每个数字添加颜色,用这些颜色重新创建你的图片:每个形状都是特定的颜色。不要在屏幕上绘制它,仅将其用作参考地图。当用户点击鼠标或将鼠标移动到原始地图上时,您只需将鼠标坐标投影到颜色图中,检查鼠标下的像素颜色,并且因为每种颜色都与区域数相关联......
答案 1 :(得分: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 (在该页面上是另一种也适用于三角形的算法)
答案 2 :(得分:0)
对多边形进行测试并不是很难实现。如果地图很大,您可以使用KD树进行优化。否则为多边形找到一个简单的Contains
方法并使用它。我有一台在另一台电脑上。如果您喜欢,请告诉我。