101 lines
4.5 KiB
Python
101 lines
4.5 KiB
Python
|
#!/usr/bin/env python
|
||
|
# -*- coding: utf-8 -*-
|
||
|
"""
|
||
|
Generates QR Code placement path figure
|
||
|
|
||
|
(C) 2022 Louis Heredero louis.heredero@edu.vs.ch
|
||
|
"""
|
||
|
|
||
|
import pygame
|
||
|
import numpy as np
|
||
|
|
||
|
WIDTH, HEIGHT = 580, 580
|
||
|
|
||
|
matrix = np.array([
|
||
|
[ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
|
||
|
[ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||
|
[ 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0],
|
||
|
[ 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0],
|
||
|
[ 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0],
|
||
|
[ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
|
||
|
[ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
|
||
|
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||
|
[-0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 1.0, -0.5, -0.5, -1.0, -1.0, -1.0, -1.0, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5],
|
||
|
[-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 0.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0],
|
||
|
[-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0],
|
||
|
[-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 0.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0],
|
||
|
[-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0],
|
||
|
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0],
|
||
|
[ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0],
|
||
|
[ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0],
|
||
|
[ 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0],
|
||
|
[ 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0],
|
||
|
[ 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0],
|
||
|
[ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0],
|
||
|
[ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0]
|
||
|
])
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
pygame.init()
|
||
|
|
||
|
surf = pygame.Surface([WIDTH, HEIGHT])
|
||
|
W, H = WIDTH/(matrix.shape[1]+8), HEIGHT/(matrix.shape[0]+8)
|
||
|
hW, hH = W/2, H/2
|
||
|
|
||
|
surf.fill((255,255,255))
|
||
|
|
||
|
m = ((matrix.copy()+2)%3)*127
|
||
|
mat = np.ones((m.shape[0]+8, m.shape[1]+8))*255
|
||
|
mat[4:-4, 4:-4] = m
|
||
|
|
||
|
for y in range(mat.shape[0]):
|
||
|
for x in range(mat.shape[1]):
|
||
|
col = mat[y, x]
|
||
|
col = (col, col, col)
|
||
|
pygame.draw.rect(surf, col, [x*W, y*H, W, H])
|
||
|
|
||
|
points = []
|
||
|
all_points = []
|
||
|
|
||
|
#Place data
|
||
|
dir_ = -1 #-1 = up | 1 = down
|
||
|
x, y = matrix.shape[1]-1, matrix.shape[0]-1
|
||
|
zigzag = 0
|
||
|
|
||
|
while x >= 0:
|
||
|
all_points.append([(x+4)*W+hW, (y+4)*H+hH])
|
||
|
if matrix[y,x] == -1:
|
||
|
points.append([(x+4)*W+hW, (y+4)*H+hH])
|
||
|
|
||
|
if ((dir_+1)/2 + zigzag)%2 == 0:
|
||
|
x -= 1
|
||
|
|
||
|
else:
|
||
|
y += dir_
|
||
|
x += 1
|
||
|
|
||
|
if y == -1 or y == matrix.shape[0]:
|
||
|
all_points.append([(x+4)*W+hW, (y+4)*H+hH])
|
||
|
dir_ = -dir_
|
||
|
y += dir_
|
||
|
x -= 2
|
||
|
|
||
|
else:
|
||
|
zigzag = 1-zigzag
|
||
|
|
||
|
#Vertical timing pattern
|
||
|
if x == 6:
|
||
|
x -= 1
|
||
|
all_points.append([(x+4)*W+hW, (y+4)*H+hH])
|
||
|
|
||
|
for p in all_points:
|
||
|
pygame.draw.circle(surf, (255,0,0), p, 3)
|
||
|
|
||
|
pygame.draw.lines(surf, (255,0,0), False, all_points)
|
||
|
|
||
|
|
||
|
for p in points:
|
||
|
pygame.draw.circle(surf, (255,255,255), p, 3)
|
||
|
|
||
|
pygame.draw.lines(surf, (255,255,255), False, points)
|
||
|
pygame.image.save(surf, "qr_plcmt_path.png")
|