也称为硬边,这是鼠标无法越过的线。在游戏等方面很有用。

目前,我有一个函数,如果我的鼠标光标位于屏幕上绘制的多边形中,则该函数会返回。如果不是,我将光标移动到多边形中最后存储的点。

    if (!PointInPolygon(local, polyGon))
    {
        Cursor.Position = safePoint;
    }
    else
    {
        safePoint = Cursor.Position;
    }

我不喜欢这个有几个原因:

  • 由于更新时间缓慢或出于某种原因,我有时能够打破常规。然后将该位置存储为多边形外部的安全点。然后我的鼠标就卡在这个位置了。

  • 倾斜的边缘应将鼠标推向倾斜方向。将鼠标向右推到“/”形墙壁上,光标最终应该位于右上角。但由于这种方法的性质,越过该线会将光标重置到之前的位置。继续向右推只会不断重置光标,而不会将其“推上斜坡”。

还有其他方法可以解决这个问题吗?我主要担心最后一个问题:这种斜坡横向行为是我的程序的主要目标,我需要让它发挥作用。即使我使用这种基本方法,对于优化该特定行为有什么想法吗?


编辑:

里德建议我返回到距离当前出界点最近的点。给定四边形的 4 个角点,我如何找到形状中/形状上最近的点?

有帮助吗?

解决方案 3

  1. 使用两个端点找到边缘线的方程。
  2. -(1/斜率) 给出垂直线的斜率。
  3. 使用穿过边缘的已知点(真实鼠标的位置)求解垂直线的直线方程
  4. 求解边缘线和垂直线的交点。
  5. 将假光标放在该位置。

其他提示

我不会跟踪“safePoint”,而是执行以下操作:

如果您发现多边形的外部,则不要恢复到最后一个已知的安全点,而是将鼠标放在多边形上/多边形中距离当前鼠标位置最近的点。这也将有助于感觉,因为光标将倾向于(缓慢地)跟随多边形边缘的斜坡等。

它还消除了在调用之间保存状态的需要(安全点)。

如何约束点 里面一个 凸的 二维多边形(非凸有点难)(假设顺时针缠绕顺序):

对于每条边 (Pi、Pj) 多边形的...

求法向量 边缘的(单位向量指向 圆周率Pj, ,旋转 90 度)

求位移 D 从边缘到点 沿着 ( D = (P - Pi) 点 N )

如果 D 为正(或为逆时针缠绕顺序为负),则 P = P - N*D

结束循环:)

最近点:

if(mouse.x > maxX) 
    mouse.x = maxX;
else if(mouse.x < minX)
    mouse.x = minX;

// same for Y.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top