否则称为硬边缘,这是鼠标无法穿过的线。在游戏等中很有用。
目前,我有一个函数,如果我的鼠标光标位于屏幕上绘制的多边形中,则返回该函数。如果不是,我将光标移动到多边形中的最后一个存储点。
if (!PointInPolygon(local, polyGon))
{
Cursor.Position = safePoint;
}
else
{
safePoint = Cursor.Position;
}
我不喜欢这个有几个原因:
由于更新时间较慢或出于某种原因,我有时可以突破。然后,将该位置存储为多边形外部的safePoint。然后我的鼠标卡在这个位置。
倾斜边缘应使鼠标沿倾斜方向移动。再向右推动鼠标,“/”形状的墙应该以光标位于右上角。但由于这种方法的性质,越过该行将光标重置为以前的位置。继续向右推动只会继续重置光标,并且不会“向上推”。
还有其他方法可以解决这个问题吗?我主要担心的是最后一个问题:这个斜坡横向行为是我的程序的主要目标,我需要让它工作。即使我使用这个基本方法,任何优化特定行为的想法?
编辑:
Reed已经建议我返回CLOSEST到当前越界点的点。给定四边形的4个角点,我如何找到形状中/上的最近点?
答案 0 :(得分:2)
我会执行以下操作,而不是跟踪“safePoint”:
如果找到多边形的外部,而不是恢复到最后已知的安全点,请将鼠标放在多边形上/中最近的点到当前鼠标位置。这也有助于感受,因为光标将倾向于(缓慢地)跟随多边形边缘的斜坡等。
它还消除了在调用之间保存状态的需要(安全点)。
答案 1 :(得分:2)
如何在2-D(假设顺时针缠绕顺序)中约束凸多边形内的点 P (非凸面有点难):
对于多边形的每条边(Pi,Pj)
找到边缘的法线向量 N (单位向量从 Pi 指向 Pj ,旋转90度)
沿着 N ( D =(P-Pi)点N <从边缘到 P 找到位移 D < / strong>)
如果 D 为正(或逆时针缠绕顺序为负),则 P = P - N * D
结束循环:)
答案 2 :(得分:0)
答案 3 :(得分:-1)
最近点:
if(mouse.x > maxX)
mouse.x = maxX;
else if(mouse.x < minX)
mouse.x = minX;
// same for Y.