找到一个点是否在另一个Vector2中的最佳方法?

时间:2013-12-17 09:07:18

标签: c# vector coordinates

我试图找出一个点(鼠标点击)是否在框的边界内,基于框的左上角x / y和右下角x / y。这个职位可能是积极的,也可能是消当你向上移动时,y值增加,当你向下移动时,y 减少。当你向右移动时,x值会增加,当你向左移动时,x会减小。

Vector2的位置可能是负数或正数,具体取决于点击的位置。

我认为这只会起作用,但似乎不喜欢负数。有什么建议?在完成其他事情的整夜矢量运算后,我的大脑今晚被炸了。我希望我是一个似乎毫无疑问地理解这一点的人。 ;)

if(point.x >= topLeft.x && point.y <= topLeft.y && 
   point.x <= bottomRight.x && point.y >= bottomRight.y)
{
 // is within box
}

修改的 以下是计算左上角和右下角的方法。事实证明,问题不在于上述问题,而是我忘了将position.y添加到下面左上方的计算中。

Vector2 topLeft = new Vector2(transform.position.x - (transform.localScale.x/2),
                      transform.position.y + (transform.localScale.y/2));

Vector2 bottomRight = new Vector2(transform.position.x + (transform.localScale.x/2),
                          transform.position.y - (transform.localScale.y/2));

对于遇到此帖子的人来说,上述检查是正确的。

示例1:

Bounding Box

示例2:

Bounding Box 2

4 个答案:

答案 0 :(得分:1)

我认为你错误地颠倒了布尔表达式。检查点击是否在框外的所有情况都更容易。 从语义上讲,某个点在矩形之外,如果它是:

  • 高于矩形的最高点
  • 低于矩形的最低点
  • 比矩形左侧更左侧
  • 比矩形右侧更右边

如果其中一个是真的,它就在盒子外面。

if( 
    clickPosition.x < topLeft.x
       ||
    clickPosition.x > bottomRight.x
       ||
    clickPosition.y < bottomRight.y
       ||
    clickPosition.y > topLeft.y
    )
{
    //Now you're sure the click was outside the box.
}

答案 1 :(得分:0)

负数的问题是你的左上角不是你的左上角

如果你说

topY = max(corner1y, corner2y, corner3y)
bottomY = min (corner1y, corner2y, corner3y)

之后,您的支票将再次正常工作。

答案 2 :(得分:0)

为什么不使用Rectangle,然后检查它是否包含该点?

var rectangle = new Rectangle(-100,0,100,-100);
if(rectangle.Contains(-25,-25))
{
    // is within box
}

对于其余部分,您的代码似乎应该有效。然后,pointtopLeftbottomRight的值的分配可能存在问题。

答案 3 :(得分:0)

我相信你在Y支票上使用了错误的标志。 如果你的topleft是50, 100而右下角是100, 50,那么80(y)仍然必须介于50100之间,这没关系只要您同时反映Y的定义,top left相对于屏幕的移动方向。

if(point.x >= topLeft.x && point.y >= topLeft.y && //flipped sign in the second condition
   point.x <= bottomRight.x && point.y <= bottomRight.y)  //flipped sign in the second condition
{
 // is within box
}

如果您没有反映top left的定义,即使是负数,您的原始代码也是正确的。