我试图找出一个点(鼠标点击)是否在框的边界内,基于框的左上角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:
示例2:
答案 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
}
对于其余部分,您的代码似乎应该有效。然后,point
,topLeft
和bottomRight
的值的分配可能存在问题。
答案 3 :(得分:0)
我相信你在Y
支票上使用了错误的标志。
如果你的topleft是50, 100
而右下角是100, 50
,那么80
(y)仍然必须介于50
和100
之间,这没关系只要您同时反映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
的定义,即使是负数,您的原始代码也是正确的。