You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.3 KiB
Python
69 lines
1.3 KiB
Python
3 years ago
|
import math
|
||
|
import random
|
||
|
|
||
|
words = [
|
||
|
(8, ' AAA '),
|
||
|
(6, ' BBB '),
|
||
|
(8, ' CCC '),
|
||
|
(8, ' DDD '),
|
||
|
(3, ' EEE '),
|
||
|
(8, ' FFF '),
|
||
|
(2, ' GGG '),
|
||
|
]
|
||
|
|
||
|
height = 30
|
||
|
width = 40
|
||
|
|
||
|
middle = (20, 15)
|
||
|
|
||
|
grid = [[] for x in range(height + 1)]
|
||
|
|
||
|
grid[middle[1]].append((middle[0] * 2, (middle[0] * 2 + 1), 'X'))
|
||
|
|
||
|
def space_available (grid, start, end, line):
|
||
|
other_words = grid[line]
|
||
|
|
||
|
for other_start, other_end, _ in other_words:
|
||
|
if start < other_end and end > other_start:
|
||
|
return False
|
||
|
|
||
|
return True
|
||
|
|
||
|
for distance, word in words:
|
||
|
placed = False
|
||
|
|
||
|
angle = random.random() * math.pi * 2
|
||
|
step = 0
|
||
|
steps = 20
|
||
|
while (not placed) and step < steps:
|
||
|
|
||
|
x = int(round(math.cos(angle) * distance) + middle[0]) * 2
|
||
|
y = int(round(math.sin(angle) * distance) + middle[1])
|
||
|
|
||
|
start = x - max(0, int(math.floor(len(word) / 2)))
|
||
|
end = start + len(word)
|
||
|
|
||
|
if space_available(grid, start, end, y):
|
||
|
grid[y].append((start, end, word))
|
||
|
placed = True
|
||
|
|
||
|
angle += (math.pi * 2 / steps)
|
||
|
|
||
|
# print(angle, x, y)
|
||
|
|
||
|
print(grid)
|
||
|
|
||
|
for row in grid:
|
||
|
# Sort by first key of the tuples, start of the word
|
||
|
row = sorted(row, key=lambda r: r[0])
|
||
|
|
||
|
if not len(row):
|
||
|
print (width * ' ')
|
||
|
else:
|
||
|
line = ''
|
||
|
for start, _, word in row:
|
||
|
line += (start - len(line)) * ' ' + word
|
||
|
|
||
|
line += (width - len(line)) * ' '
|
||
|
|
||
|
print(line)
|