C# 检测图像非方形部分的鼠标悬停

C# 检测图像非方形部分的鼠标悬停,c#,xna,shapes,C#,Xna,Shapes,因此,我正在XNA/C#中开发一款风险型游戏。我有一张类似的地图,我需要能够在每个区域(编号)检测鼠标。如果这些区域是正方形,这将很容易,因为它们可以用一个矩形来表示。但是,它们是不同大小的多边形。是否有一个多边形形状的行为类似于正方形?如果没有,我该怎么做呢?我的建议是:给每个数字添加颜色,用这些颜色重新创建图片:每个形状都有其特定的颜色。不要在屏幕上画,只作为参考地图使用。当用户在原始地图上单击或移动鼠标时,只需将鼠标坐标投影到颜色地图中,检查鼠标下像素的颜色,因为每个颜色都与区域的数量关联

因此,我正在XNA/C#中开发一款风险型游戏。我有一张类似的地图,我需要能够在每个区域(编号)检测鼠标。如果这些区域是正方形,这将很容易,因为它们可以用一个矩形来表示。但是,它们是不同大小的多边形。是否有一个多边形形状的行为类似于正方形?如果没有,我该怎么做呢?

我的建议是:给每个数字添加颜色,用这些颜色重新创建图片:每个形状都有其特定的颜色。不要在屏幕上画,只作为参考地图使用。当用户在原始地图上单击或移动鼠标时,只需将鼠标坐标投影到颜色地图中,检查鼠标下像素的颜色,因为每个颜色都与区域的数量关联…

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

一种是基于光线投射,从(鼠标)点向“无限”(本例中为板的边缘)的1个方向投射光线,并计算光线穿过多边形边缘的次数。如果光线投射为奇数,则该点位于多边形内部;如果光线投射为偶数,则该点位于多边形外部

指向它的wiki链接:

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

链接到它:
(该页面上还有另一个算法,也可以用于三角形)

在多边形上进行命中测试并不难实时完成。如果贴图很大,可以使用KD树进行优化。否则,找到一个简单的
包含多边形的方法并使用它。我在另一台计算机上有一个方法。如果您喜欢,请告诉我。

我不确定。使用存储在Texture2D中的位图时,它就像所以:Texture2D tex;Color[]texColors=新颜色[height*width];tex.GetData(texColors);这听起来很容易思考,但对计算机来说并不理想。请确保不要使用反走样绘制。就个人而言,我会选择空间的数学模型,而不是位图。数学方法很复杂,但也可能太复杂了。参考颜色贴图本身并没有绘制,我认为反走样将不要弄乱它或干扰它。