-
19-09-2019 - |
题
也称为硬边,这是鼠标无法越过的线。在游戏等方面很有用。
目前,我有一个函数,如果我的鼠标光标位于屏幕上绘制的多边形中,则该函数会返回。如果不是,我将光标移动到多边形中最后存储的点。
if (!PointInPolygon(local, polyGon))
{
Cursor.Position = safePoint;
}
else
{
safePoint = Cursor.Position;
}
我不喜欢这个有几个原因:
由于更新时间缓慢或出于某种原因,我有时能够打破常规。然后将该位置存储为多边形外部的安全点。然后我的鼠标就卡在这个位置了。
倾斜的边缘应将鼠标推向倾斜方向。将鼠标向右推到“/”形墙壁上,光标最终应该位于右上角。但由于这种方法的性质,越过该线会将光标重置到之前的位置。继续向右推只会不断重置光标,而不会将其“推上斜坡”。
还有其他方法可以解决这个问题吗?我主要担心最后一个问题:这种斜坡横向行为是我的程序的主要目标,我需要让它发挥作用。即使我使用这种基本方法,对于优化该特定行为有什么想法吗?
编辑:
里德建议我返回到距离当前出界点最近的点。给定四边形的 4 个角点,我如何找到形状中/形状上最近的点?
解决方案 3
- 使用两个端点找到边缘线的方程。
- -(1/斜率) 给出垂直线的斜率。
- 使用穿过边缘的已知点(真实鼠标的位置)求解垂直线的直线方程
- 求解边缘线和垂直线的交点。
- 将假光标放在该位置。
其他提示
我不会跟踪“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.
不隶属于 StackOverflow