10

I am new to python and still learning the ropes but I am hoping someone with more experience can help me out.

I am trying to write a python script that:

  1. creates four points
  2. creates four rectangles
  3. check if each of the point is in any of the rectangles then write out the results to a output file.

The problem involves two data structures Point and Rectangle class. I have already started to create the Point class and Rectangle classes. Rectangle class should hold relevant data sets created from random module’s random method. As you can tell from my attempts that I am kind of all over the place but I have used #comments to try to get what I am trying to do.

Specific questions I have are:
1) how can I get this script working?
2) What variables or functions am I missing to generate random rectangles and see if specific points are in those rectangles?

## 1. Declare the Point class class Point: def __init__(self,x = 0.0, y = 0.0): self.x = x self.y = y pass ## 2. Declare the Rectangle class class Rectangle: def __int__(self): ## A rectangle can be determined aby (minX, maxX) (minY, maxY) self.minX = self.minY = 0.0 self.maxX = self.maxY = 1.0 def contains(self, point): ## add code to check if a point is within a rectangle """Return true if a point is inside the rectangle.""" # Determine if a point is inside a given polygon or not # Polygon is a list of (x,y) pairs. This function # returns True or False. def point_in_poly(x,y,poly): n = len(poly) inside = False p1x,p1y = poly[0] for i in range(n+1): p2x,p2y = poly[i % n] if y > min(p1y,p2y): if y <= max(p1y,p2y): if x <= max(p1x,p2x): if p1y != p2y: xints = (y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x if p1x == p2x or x <= xints: inside = not inside p1x,p1y = p2x,p2y return inside ## 3. Generate four points ##define a Point list to keep four points points = [] ##add codes to generate four points and append to the points list polygon = [(0,10),(10,10),(10,0),(0,0)] point_x = 5 point_y = 5 ## 4. Generate four rectangles ##define a Rectangle list rects = [] for i in range(4): rectangle = Rectangle() ## Generate x x1 = random.random() x2 = random.random() ## make sure minX != maxX while(x1 == x2): x1 = random.random() if x1<x2: rectangle.minX=x1 rectangle.maxX=x2 elif x1>x2: rectangle.minX=x2 rectangle.maxX=x1 rects.append(rectangle) ## Develop codes to generate y values below ## make sure minY != maxY while(y1 == y2): y1 = random.random() if y1<y2: rectangle.minY=y1 rectangle.maxY=y2 elif y1>y2: recetangle.minY=y2 racetangle.maxY=y1 ## add to the list rects.append(rectangle) ## 5. Add code to check which point is in which rectangle resultList = [] ## And use a list to keep the results for i in range(4): for j in range(4): if points[i] in rectangle[j]: print i # write the results to file f=open('Code5_4_1_Results.txt','w') for result in resultList: f.write(result+'\n') f.close() 
3
  • Your question is too broad. As it stands it sounds like you're saying, "Please teach me!" which isn't great for question / answer format. Please edit to include specific questions. Optionally, place them in a bullet list to make them stand out individually. Commented Jul 9, 2015 at 15:32
  • Palu - being new to Python and Stackoverflow I am still learning the protocol for asking for help I guess. I combined some of the scripts that I have been learning how to do together into this one to try to figure out how I can create random rectangles and then see if those points fit into any of those rectangles. Right now I am getting the following error: Traceback (most recent call last): File "C:\Code5_4_1_Creating4PolyRectandCheckRelationships.py", line 62, in <module> while(y1 == y2): NameError: name 'y1' is not defined Commented Jul 10, 2015 at 13:36
  • That's fine. By improving your post, it makes it easier to help you, others who comes, and it gets you a better chance at being seen. I'm also no moderator (not even close) and also don't downvote unless someone is trying to be bad, so you have nothing to worry about from my suggestion. :) It's just here to assist with tips. Commented Jul 10, 2015 at 13:39

2 Answers 2

15

This is pretty simple math. Given an axis-aligned rectangle with points (x1,y1) and (x2,y2) and assuming x1 < x2 and y1 < y2 (if not, you can just swap them), a point (x,y) is within that rectangle if x1 < x < x2 and y1 < y < y2. Since Python comparison operators can be chained, this is even valid Python code which should produce the correct result (in other languages you'd have to write something like x1 < x and x < x2, etc).

If you want, you can use <= instead of <. Using <= means points on the boundary of the rectangle (eg, the point (x1,y1)) count as being inside it, while using < so means such points are outside it.

Sign up to request clarification or add additional context in comments.

8 Comments

Thank you Celticminstrel for explaining the rectangle class part of this script. That makes since. Now I and trying to make it flow with the rest of the script but I am getting this error: Traceback (most recent call last): File "C:\Code5_4_1_Creating4PolyRectandCheckRelationships.py", line 62, in <module> while(y1 == y2): NameError: name 'y1' is not defined
Ok I figured that out. now I am getting: Traceback (most recent call last): File "C:\Code5_4_1_Creating4PolyRectandCheckRelationships.py", line 80, in <module> if points[i] in rectangle[j]: IndexError: list index out of range
I'm not here to write your code for you, but if you're trying to use that to test if the point is in the rect, then change contains in your Rectangle class to __contains__. (Also, you have __int__ where you should have __init__.) If you still have problems, try things out and if you still can't solve it, I suggest asking a new question rather than commenting here.
It should be noted too that this answer assumes the rectangle is parallel to the coordinate axis.
it won't work if the rectangle isn't parallel to X&Y axes
|
6

It is better to write a separate function to do the job. Here's my function. You can just copy it if you want

def pointInRect(point,rect): x1, y1, w, h = rect x2, y2 = x1+w, y1+h x, y = point if (x1 < x and x < x2): if (y1 < y and y < y2): return True return False 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.