Bounding Box Collision – python

A python program using PIL (pillow) to place a letter randomly on the canvas of fixed dimension. Uses AABB – AABB bounding box collision detection for letter-letter collision.
Ref: Real-time Collision Detection by Christer Ericson

"""
April 30, 2019
A program to palce letter a letter randomly on the canvas. 
Letter Bounding Box Collision Test
Author: jithesh Kuyyalil https://jitheshkuyyalil.com
Date: April 26, 2019
"""
from PIL import Image, ImageDraw, ImageFont
import numpy as np
from random import randint

img = Image.new("L", (500, 500))
word = "b"
font_size = 100
font_path = 'DroidSansMono.ttf'
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(font_path, font_size)
box_coord = []  # save bounding box co-ordinates [[(), ()], [(), ()]]
for i in range(100):
    # x, y, where the word/letter is placed
    x = randint(0, 500)  # 110 400
    y = randint(0, 500)  # 110 400
    print('xrand, yrand', x, y)
    (x1, y1, x2, y2) = font.getmask(word).getbbox()
    (width, baseline), (offset_x, offset_y) = font.font.getsize(word)
    rect_1 = (x1 + x + offset_x, y1 + y + offset_y)   # top left corner
    rect_2 = (x2 + x + offset_x -1, y2 + y + offset_y) # bottom right corner \
            # don't know -1 ? \
            # Rectangle fits well with -1.
    intersect = False  # both letter-boundary, letter-letter collision
    # boundary collision testing - boundary (0,0), (500,500)
    if not (rect_2[0] < 500 and rect_2[1] < 500): # hitting the boundary
        intersect = True
    if intersect == False: # only if letter doesn't hit boundary
        # checking for collision
        if box_coord != []:
            print(box_coord)
            for box in box_coord:
                if (rect_1[0] > box[1][0]) or (rect_2[0] < box[0][0]): # not \ 
                    # intersecting
                    continue 
                if (rect_1[1] > box[1][1]) or (rect_2[1] < box[0][1]): # not \
                        # interesecting
                    continue
                intersect = True
                break # interesecting; find new x, y

    if not intersect :            
        #draw.rectangle([rect_1, rect_2], outline='white')
        draw.text((x, y), word, fill='white', font=font) # 175, 90
        box_coord.append([rect_1, rect_2])
img.show()

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s