Browse Source

Added a diagonal iterator

master
Raphael Roberts 6 years ago
parent
commit
ecfe2e6f3a
  1. 1
      .gitignore
  2. 0
      prim_wallpaper/pickers/__init__.py
  3. 56
      prim_wallpaper/pickers/diagonal.py
  4. 3
      test.py

1
.gitignore

@ -1,3 +1,4 @@
.dir-locals.el
__pycache__
*.png
*.csv

0
prim_wallpaper/pickers/__init__.py

56
prim_wallpaper/pickers/diagonal.py

@ -0,0 +1,56 @@
from math import sqrt
def get_row_num(i):
return int((sqrt(8 * i + 1) - 1) / 2)
def get_last_whole_i(row):
return (row * (row + 1)) // 2
class DiagonalCounter:
def __init__(self, table_size):
self.table_size = table_size
def diagonal(self, i):
row = get_row_num(i)
last_whole_i = get_last_whole_i(row)
if row < self.table_size:
y = i - last_whole_i
x = row - y
return x, y
else:
x, y = self.diagonal(self.table_size ** 2 - (1 + i))
return self.table_size - x - 1, self.table_size - y - 1
def diagonal_reversed(self, i):
y, x = self.diagonal(i)
return x, y
def diagonal_then_reversed(self, i):
row = get_row_num(i)
if row > self.table_size:
row += 1
if row % 2 != 0:
return self.diagonal(i)
else:
return self.diagonal_reversed(i)
if __name__ == "__main__":
import csv
d = DiagonalCounter(6)
for func in (d.diagonal, d.diagonal_reversed, d.diagonal_then_reversed):
output = list(
list(-1 for i in range(d.table_size)) for j in range(d.table_size)
)
indices = map(func, range(d.table_size ** 2))
for i, index in enumerate(indices):
x, y = index
output[y][x] = i
with open(func.__name__ + ".csv", "w", newline="") as file:
writer = csv.writer(file)
writer.writerows(output)

3
test.py

@ -0,0 +1,3 @@
from prim_wallpaper.make_wallpaper import make_wallpaper
i = make_wallpaper(3, 5, 6)
Loading…
Cancel
Save