简体   繁体   中英

Edge detection in Python

I am trying to write a program where a user enters a number, and it draws that many rectangles to the screen, however the triangles cannot overlap. I have had a problem with that last part, and I am looking for some help. I borrowed the edge detection methods from an Al Sweigart book, and the full program he wrote can be found here:

http://inventwithpython.com/chapter18.html

Here is the program I am working on:

http://pastebin.com/EQJVH6xr

import pygame, sys, random
from pygame.locals import *

def doRectsOverlap(rect1, rect2):
    for a, b in [(rect1, rect2)]:
        # Check if a's corners are inside b
        if ((isPointInsideRect(a.left, a.top, b)) or
            (isPointInsideRect(a.left, a.bottom, b)) or
            (isPointInsideRect(a.right, a.top, b)) or
            (isPointInsideRect(a.right, a.bottom, b))):
            return True

    return False

def isPointInsideRect(x, y, rect):
    if (x > rect.left) and (x < rect.right) and (y > rect.top) and (y < rect.bottom):
        return True
    else:
        return False

# set up pygame
pygame.init()

# set up the window
WINDOWWIDTH = 600
WINDOWHEIGHT = 600
windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
pygame.display.set_caption('Rectangles')

# set up the colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

from random import choice
foo = [BLACK, RED, GREEN, BLUE]

# draw the background
windowSurface.fill(WHITE)

print('Please enter a number:')
number = input()
x = 0
array = []
for i in array:

while int(number) > x:
    x = x+1
    x1 = random.randint(1, 400)
    y1 = random.randint(1, 400)
    x2 = random.randint(1, 400)
    y2 = random.randint(1, 400)
    x3 = random.randint(1, 400)
    y3 = random.randint(1, 400)
    x4 = random.randint(1, 400)
    y4 = random.randint(1, 400)
    box = pygame.draw.rect(windowSurface,random.choice(foo), (x1, y1, x2, y2))
    if doRectsOverlap(box, box) == False:
        box
    else:
        x = x-1

# draw the window onto the screen
pygame.display.update()

Any help would be greatly appreciated. Thank you!

Well as a general answer, you are going to have to plot four co ordinance for each rectangle.

There are a few ways you can do this:

1) Just have the rectangle randomly placed and test if any of the new rectangle's points are inside of any of the existing rectangles. If they are, just keep generating until they are not. This will be very slow and inefficient though.

2) You can number crunch by restricting all of your possible random's to only available positions. This is can be done a variety of ways, it will be semi slow and probably fairly difficult to implement.

3) You can have the rectangles generate like in option 1, but in the case that the co-ordinance of the 4 points overlap, you can push the points off. To do this you simply have to set the violating co-ordinance to the co-ordinance of one of the corners and then add say, (5,5) or subtract or whatever. If you don't want to skew the rectangles too much you can regenerate the violating rectangle based on the modified point, or push all of the points an equivalent distance as the violating point.

I think option 3 is probably the best unless you are very strict on your random principles.

If you want me to clarify any of the above options let me know specifically what you want me to explain and I will do so. I can not however explain all of the possibilities for each option because it would take to long and way too many lines.

Cheers

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM