2009-07-28 139 views
1

否则称为硬边缘,这是鼠标无法穿过的线条。在游戏等中很有用。实现鼠标边界的边缘

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

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

我不喜欢这样的一对夫妇的原因:

  • 由于缓慢的更新时间或出于某种原因,我有时能打破开箱。然后将该位置作为safePoint存储在多边形之外。然后我的鼠标卡在这个位置。

  • 倾斜的边缘应该在斜坡方向上猛击鼠标。再次将鼠标向右推,一个“/”形墙应该在光标在右上角。但由于这种方法的性质,通过该行将重置光标到以前的位置。继续向右推只会继续重新设置光标,并且不会将其推上“斜坡”。

是否有任何其他方法来解决这个问题?我主要担心最后一个问题:这种斜率横向行为是我的程序的主要目标,我需要让它工作。即使我使用这种基本方法,对于特定行为的优化有什么想法?


编辑:

已经由Reed,我反而回到最接近当前出界外点的点建议。考虑到四边形的四个角点,我将如何找到形状中/上的最近点?

回答

0
  1. 查找使用的两个端点的边缘直线的方程。
  2. - (1 /斜率)给出了垂直线的斜率。
  3. 使用已知点跨越边缘(真实鼠标的位置)求解垂直线的线方程
  4. 求解边缘线与垂直线的交点。
  5. 将假光标置于该位置。
2

而是跟踪“还原点”,我会做到以下几点:

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

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

+0

嗯,好主意。现在我只需要弄清楚,考虑到四边界限制四边形,那么找到最近点的最佳/最简单的方法是什么? – cksubs 2009-07-28 01:42:00

+0

这里有一些适合你的算法:http://www.devmaster.net/forums/archive/index.php/t-103.html对于小多边形(取决于你的情况,但通常少于10个部分),只是强力搜索点 - >段通常是最快的方法。 – 2009-07-28 15:11:37

-1

最近的点:

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

// same for Y. 
2

如何限制点P一个多边形内部(非凸是有点困难)在2- d(假定顺时针缠绕顺序):

对于每个边缘(Pi,Pj)的多边形...

查找法线矢量边缘ñ(从单位矢量指向点Pj,旋转90度)

从边缘寻找位移d指向P沿ñd =(P - PI)点ñ

如果d是正(或负为逆时针缠绕顺序),然​​后P = - N * d

结束循环:)