I want to find whether a point lies inside a rectangle or not. The rectangle can be oriented in any way, and need not be axis aligned.
One method I could think of was to rotate the rectangle and point coordinates to make the rectangle axis aligned and then by simply testing the coordinates of point whether they lies within that of rectangle's or not.
The above method requires rotation and hence floating point operations. Is there any other efficient way to do this?
I just implemented AnT's Answer using c++. I used this code to check whether the pixel's coordination(X,Y) lies inside the shape or not.
How is the rectangle represented? Three points? Four points? Point, sides and angle? Two points and a side? Something else? Without knowing that, any attempts to answer your question will have only purely academic value.
In any case, for any convex polygon (including rectangle) the test is very simple: check each edge of the polygon, assuming each edge is oriented in counterclockwise direction, and test whether the point lies to the left of the edge (in the left-hand half-plane). If all edges pass the test - the point is inside. If at least one fails - the point is outside.
In order to test whether the point
(xp, yp)
lies on the left-hand side of the edge(x1, y1) - (x2, y2)
, you just need to calculateIf
D > 0
, the point is on the left-hand side. IfD < 0
, the point is on the right-hand side. IfD = 0
, the point is on the line.The previous version of this answer described a seemingly different version of left-hand side test (see below). But it can be easily shown that it calculates the same value.
... In order to test whether the point
(xp, yp)
lies on the left-hand side of the edge(x1, y1) - (x2, y2)
, you need to build the line equation for the line containing the edge. The equation is as followswhere
Now all you need to do is to calculate
If
D > 0
, the point is on the left-hand side. IfD < 0
, the point is on the right-hand side. IfD = 0
, the point is on the line.However, this test, again, works for any convex polygon, meaning that it might be too generic for a rectangle. A rectangle might allow a simpler test... For example, in a rectangle (or in any other parallelogram) the values of
A
andB
have the same magnitude but different signs for opposing (i.e. parallel) edges, which can be exploited to simplify the test.