83 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import cairo
 | |
| 
 | |
| from typing import Iterable
 | |
| 
 | |
| from hexagram.path import Path
 | |
| 
 | |
| class Pattern(Path):
 | |
|     pass
 | |
| 
 | |
| class HexagonPattern(Pattern):
 | |
|     WIDTH        = 100
 | |
|     HEIGHT       = 87
 | |
|     COLOR        = (0.3, 0.1, 0.3)
 | |
|     MATRIX       = (0.21213203, 0.21213203, 0.21213203, -0.21213203, 1, 1)
 | |
|     MATRIX_SCALE = (3, 3)
 | |
| 
 | |
|     COMMANDS = [
 | |
|         ['M', [23.246093,  0,
 | |
|                 0,        13.382812]],
 | |
|         ['V', [44.689453]],
 | |
|         ['L', [0.0839844, 44.640625,
 | |
|                24.033203, 58.505859,
 | |
|                24.001953, 86.332031,
 | |
|                22.841796, 87]],
 | |
|         ['h', [4.478516]],
 | |
|         ['L', [26.068359, 86.275391,
 | |
|                26.099609, 58.449219,
 | |
|                50.083984, 44.640625,
 | |
|                74.033203, 58.505859,
 | |
|                74.001953, 86.332031,
 | |
|                72.841796, 87]],
 | |
|         ['h', [4.478516]],
 | |
|         ['L', [ 76.068359, 86.275391,
 | |
|                 76.099609, 58.449219,
 | |
|                100,        44.689453]],
 | |
|         ['V', [13.365234]],
 | |
|         ['L', [76.919921, 0]],
 | |
|         ['H', [73.246093]],
 | |
|         ['L', [50.015625, 13.373047,
 | |
|                26.919921,  0]],
 | |
|         ['Z', []],
 | |
|         ['M', [25.083984,   1.25,
 | |
|                49.033203,  15.115234,
 | |
|                49.001953,  42.941406,
 | |
|                25.017578,  56.75,
 | |
|                 1.0019531, 42.845703]],
 | |
|         ['l', [ 0.033203, -27.75]],
 | |
|         ['z', []],
 | |
|         ['m', [50, 0,
 | |
|                24.017576, 13.904297,
 | |
|                -0.0352,   27.75]],
 | |
|         ['L', [75.017578, 56.75,
 | |
|                51.068359, 42.884766,
 | |
|                51.099609, 15.058594]],
 | |
|         ['Z', []]
 | |
|     ]
 | |
| 
 | |
|     def __init__(self):
 | |
|         super().__init__(self.COMMANDS)
 | |
| 
 | |
|     def to_surface(self) -> cairo.ImageSurface:
 | |
|         surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, self.WIDTH, self.HEIGHT)
 | |
| 
 | |
|         cr = cairo.Context(surface)
 | |
|         cr.set_source_rgb(*self.COLOR)
 | |
| 
 | |
|         self.draw(cr)
 | |
|         cr.stroke()
 | |
| 
 | |
|         return surface
 | |
| 
 | |
|     def fill(self, cr: cairo.Context):
 | |
|         matrix = cairo.Matrix(*self.MATRIX)
 | |
|         matrix.scale(*self.MATRIX_SCALE)
 | |
| 
 | |
|         surface = self.to_surface()
 | |
|         cr.set_source_surface(surface, 0, 0)
 | |
| 
 | |
|         source = cr.get_source()
 | |
|         source.set_matrix(matrix)
 | |
|         source.set_extend(cairo.EXTEND_REPEAT)
 | |
| 
 | |
|         cr.fill()
 |