Help with Functions PtInRect and OverlapRect

Monkey Forums/Monkey Programming/Help with Functions PtInRect and OverlapRect

Wagenheimer(Posted 2011) [#1]
Well... My functions PTInRect and OverlapRect is not working as expected! Anybody seens something wrong?

Thanks!

Class TRect
	Field Left:Int
	Field Top:Int
	Field Right:Int
	Field Bottom:Int
	Field Width:Int
	Field Height:Int
	
	Method New(aLeft:Int,aTop:Int,aRight:Int,aBottom:Int)
		Left=aLeft
		Right=aRight
		Top=aTop
		Bottom=aBottom
		Width=Right-Left
		Height=Bottom-Top
	End
	
	Function Bounds:TRect(aLeft:int,aTop:int,aWidth:int,aHeight:int)
		return New TRect(aLeft,aTop,aLeft+aWidth,aTop+aHeight)
	End
End

Function PTInRect:Bool(x1:Int,y1:Int,aRect:TRect)
	Return (y1>=aRect.Top) And (y1<aRect.Bottom) And (x1>=aRect.Left) And (x1<aRect.Right) 
End

Function OverlapRect:Bool(Rect1:TRect, Rect2: TRect)
	Local result : Bool
  
	result=PTInRect(Rect1.Left,Rect1.Top,Rect2)
    if Not result then result=PTInRect(Rect1.Right,Rect1.Top,Rect2)
    if Not result then result=PTInRect(Rect1.Left,Rect1.Bottom,Rect2)
    if Not result then result=PTInRect(Rect1.Right,Rect1.Bottom,Rect2)
	Return result

End



Wagenheimer(Posted 2011) [#2]
I found the problem! But There is a more efficient way of doing this with monkey?

Function OverlapRect:Bool(Rect1:TRect, Rect2: TRect)
	Local result : Bool
    result=false
	
	if Not result then result=PTInRect(Rect1.Left,Rect1.Top,Rect2)
    if Not result then result=PTInRect(Rect1.Right,Rect1.Top,Rect2)
    if Not result then result=PTInRect(Rect1.Left,Rect1.Bottom,Rect2)
    if Not result then result=PTInRect(Rect1.Right,Rect1.Bottom,Rect2)
	
	if Not result then result=PTInRect(Rect2.Left,Rect2.Top,Rect1)
    if Not result then result=PTInRect(Rect2.Right,Rect2.Top,Rect1)
    if Not result then result=PTInRect(Rect2.Left,Rect2.Bottom,Rect1)
    if Not result then result=PTInRect(Rect2.Right,Rect2.Bottom,Rect1)	
	return result

End



muddy_shoes(Posted 2011) [#3]
You'll have to do some timings if you want to check performance but it seems to me that you'd be better off avoiding all those point checks and just test the rect positions. Test if they're totally to the left or right or top or bottom of each other. If any of those are true then they aren't overlapping, if non of them are then they must be.

Something like:

Function OverlapRect:Bool(Rect1:TRect, Rect2: TRect)
If( Rect1.Left > Rect2.Right Or Rect2.Left > Rect1.Right )
Return False
End
If( Rect1.Top > Rect2.Bottom Or Rect2.Top > Rect1.Bottom )
Return False
End
Return True
End


Raz(Posted 2011) [#4]
You should always try to prove things false as quickly as possible for repetitive checks.

Function RectOverlap:Bool(x1#,y1#,x2#,y2#,x3#,y3#,x4#,y4#)
	if x2 < x3 Then return false
	if x1 > x4 Then return false
	if y2 < y3 Then return false
	if y1 > y4 Then return false
	return true
End Function

Where x1,y1,x2,y2 are the coordinates for the first rect and x3,y3,x4,y4 are the coordinates for the second rect.

Function PointInRect:Bool(px#,py#,x1#,y1#,x2#,y2#)
	if px < x1 Then return false
	if px > x2 Then return false
	if py < y1 Then return false
	if py > y2 Then return false
	return true
End Function


so to check two of your TRects you would do

Function CheckRects:Bool(Rect1:TRect,Rect2:TRect)
	return RectOverlap(Rect1.Left,Rect1.Top,Rect1.Right,Rect1.Bottom,Rect2.Left,Rect2.Top,Rect2.Right,Rect2.Bottom)
End


(well that's what I would do)


Wagenheimer(Posted 2011) [#5]
Thanks Raz and Muddy!

Muddy, I think there are still a small bug with your OverlapRect function!

Rect1=(-1,188,5,220)
Rect2=(0,0,320,480)
ReckRects(Rect1,Rect2)

I think it should return True in this case, but it is returning false!


Wagenheimer(Posted 2011) [#6]
Strange... I have made a Delphi version of your function and debuged it with the same values and it returns me true!

I will try to debug it someway in Monkey to see what is happening.

Let me ask you something else!

What does # do in the functions parameters? I haven't found anything in Monkey Docs.


Sledge(Posted 2011) [#7]
# = :Float


Wagenheimer(Posted 2011) [#8]
It was a bug with my engine!!! Thanks for all the help!