Skip to content
Snippets Groups Projects
Commit db577427 authored by Sebastian Böttger's avatar Sebastian Böttger
Browse files

Merge branch 'dev' into 'main'

Publish first version

See merge request sboettger/foto-puzzler!4
parents 629f1ab0 c904a75e
No related branches found
No related tags found
No related merge requests found
Showing
with 1269 additions and 27 deletions
# caching files
__pycache__/
__pycache__/*
# image files
/resources/*
!/resources/demo_images/
!/resources/test data/
!/resources/README.md
This diff is collapsed.
# Foto Puzzler
# Features
Goal of this project is to create a software, that can solve a puzzle based on a picture of all pieces
# Mario Jigsaw Genius
## Features
- Extract puzzle pieces from a photo
- Analyze a puzzle piece and convert them into a puzzle piece object
- Solve the puzzle
- Reassemble the puzzle pieces correctly
## Target
The project aims to implement an algorithm that makes it possible to complete a puzzle using a photo. To do this, the patterns and shapes of the puzzle pieces must be matched and placed together. In order to save unnecessary additional work in the post-processing of the puzzle pieces, an automatically processed photo should be used, which already contains brightness and distortion corrections (e.g. smartphone camera recording).
## Project structure
The project ist structured in three parts:
- Image Processing
- Extract puzzle pieces from photo
- Reassemble the puzzle pieces
- Image Analyzer
- Analyze a puzzle piece and convert them into a puzzle piece object
- Puzzle Solving
- Solve the puzzle
## Project status
Work in progress
All three parts working independently with test data.
The main script MarioJigsawGenius.py is currently not working
## Author
Jan Genders, Jessica Dreyer, Sebastian Böttger
## License
This project is licensed under the MIT License - see the LICENSE file for details.
\ No newline at end of file
This project is licensed under the GNU GPL V3 - see the LICENSE file for details.
\ No newline at end of file
<diagram program="umletino" version="15.1"><zoom_level>9</zoom_level><help_text>Space for diagram notes</help_text><element><id>UMLClass</id><coordinates><x>180</x><y>42</y><w>315</w><h>153</h></coordinates><panel_attributes>Puzzle
--
- size : int[ ]
- width : int
- height : int
- pieces : PuzzlePiece[ ]
--
+ set_piece(piece : PuzzlePiece, idx : int)
+ get_edge_pieces(is_sorted : bool) : PuzzlePiece[ ]
+ get_inner_pieces(is_sorted : bool) : PuzzlePiece[ ]
+ get_corners(is_sorted : bool) : PuzzlePiece[ ]</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLClass</id><coordinates><x>171</x><y>267</y><w>324</w><h>162</h></coordinates><panel_attributes>PuzzlePiece
--
- id : int
- category : Enum = {"EDGE", "CORNER", "INNER"}
- sides : Side [4]
- number_of_holes : int
- number_of_heads : int
- top_side : int = 0
- is_sorted : boolean
- image_path : String
--
+ rotate(top_side : int) : None
</panel_attributes><additional_attributes></additional_attributes></element><element><id>Relation</id><coordinates><x>324</x><y>186</y><w>36</w><h>99</h></coordinates><panel_attributes>lt=&lt;&lt;&lt;&lt;-
m1=1
m2=*</panel_attributes><additional_attributes>10;10;10;90</additional_attributes></element><element><id>UMLClass</id><coordinates><x>198</x><y>492</y><w>270</w><h>117</h></coordinates><panel_attributes>Side
--
- id : int
- side_type : Enum {"FLAT", "HOLE", "HEAD"}
- outline : np.array
- width : int
- height : int
- is_sorted : boolean</panel_attributes><additional_attributes></additional_attributes></element><element><id>Relation</id><coordinates><x>324</x><y>420</y><w>36</w><h>90</h></coordinates><panel_attributes>lt=&lt;&lt;&lt;&lt;&lt;-
m1=1
m2=4</panel_attributes><additional_attributes>10;10;10;80</additional_attributes></element><element><id>UMLClass</id><coordinates><x>0</x><y>537</y><w>153</w><h>72</h></coordinates><panel_attributes>MatchingCounterpiece
--
- piece : PuzzlePiece
- side : Side
- distance : int</panel_attributes><additional_attributes></additional_attributes></element><element><id>Relation</id><coordinates><x>126</x><y>339</y><w>63</w><h>216</h></coordinates><panel_attributes>lt=-</panel_attributes><additional_attributes>50;10;10;10;10;220</additional_attributes></element><element><id>Relation</id><coordinates><x>144</x><y>573</y><w>72</w><h>27</h></coordinates><panel_attributes>lt=-</panel_attributes><additional_attributes>10;10;60;10</additional_attributes></element><element><id>UMLClass</id><coordinates><x>522</x><y>42</y><w>684</w><h>90</h></coordinates><panel_attributes>PuzzleSolver
--
--
_+ get_compatible_side_type(side_type : SideType) : SideType_
_+ get_possible_sides(piece : PuzzlePiece, current_side : Side, idx_possible_side : int) : Side[ ]_
_+ find_compatible(current_piece : PuzzlePiece, current_side : Side, possible_pieces : PuzzlePiece[ ], idx_help : int) : (PuzzlePiece, Side)_
_+ solve(puzzle : Puzzle) : Puzzle_</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLClass</id><coordinates><x>522</x><y>159</y><w>540</w><h>450</h></coordinates><panel_attributes>ImageAnalyser
--
- image : np.ndarray
- piece_id : int
- high_spot_search_size : int
- angle_base_size : int
- corner_value : float
- max_hight_flat_side : int
- puzzle_piece : PuzzlePiece
--
+ __init__(
image : np.ndarray = np.zeros((10,10)),
piece_id : int = 0, high_spot_search_size : int = 50,
angle_base_size : int = 40, corner_value : float = 0.03,
max_hight_flat_side : int = 20)
+ analyse() : None
+ create_outline_image(image : np.ndarray) : None
+ convert_to_cart_path(outline_image : np.ndarray) : None
+ sort_by_diff(cart_path : np.ndarray) : np.ndarray
+ convert_to_pol_path(cart_path : np.ndarray) : None
+ get_center_point(cart_path : np.ndarray) : np.ndarray
+ find_high_spots_index(pol_path : np.ndarray, size : int = 20) : None
+ calculate_angle(index_high_spots : np.ndarray, size : int = 20) : None
+ calculate_gamma(points : np.ndarray) : np.ndarray
+ extract_corners(angles : np.ndarray, index_high_spots : np.ndarray, corner_value : float = 0.04) : None
+ split_sites(cart_path : np.ndarray, index_corners : np.ndarray) : None
+ normalize_sides() : None
+ calculate_straight_angle(side_path : np.ndarray) : None
+ rotate_side(side_path : np.ndarray, angle : float) : np.ndarray
+ polish_side_paths() : None
+ convert_to_binary_array(side_path : np.ndarray) : np.ndarray
+ create_puzzle_piece(sides_paths : List[np.ndarray]) : PuzzlePiece
+ determine_side_type(side_path : np.ndarray) : SideType
</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLClass</id><coordinates><x>1089</x><y>159</y><w>306</w><h>135</h></coordinates><panel_attributes>PuzzleConnector
--
- rows : int
- columns : int
- puzzle_pieces : List
--
+ __init__(rows : int, columns : int)
+ add_piece(piece : PuzzlePiece) : None
+ compose() : np.ndarray
+ rotate_pieces(puzzle : Puzzle) : None
</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLClass</id><coordinates><x>1089</x><y>312</y><w>306</w><h>90</h></coordinates><panel_attributes>PuzzleConnectorWithAnimation
--
- frames : List
--
+ __init__(rows : int, columns : int)
+ compose_with_animation() : None
+ animate_puzzle() : None</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLClass</id><coordinates><x>1089</x><y>411</y><w>594</w><h>198</h></coordinates><panel_attributes>PuzzlePieceExtractor
--
- threshold : int
- minimum_res : int
- clicked_point_background : Tuple
- clicked_point_shadow : Tuple
--
+ __init__(threshold : int, minimum_res : int)
+ get_color(event : cv2.EVENT, x : int, y : int, flags : Any, param : Any) : None
+ select_colors(image : np.ndarray) : Tuple
+ remove_background(image : np.ndarray, background_color : np.ndarray, shadow_color : np.ndarray) : np.ndarray
+ erode_n_dilate(image : np.ndarray) : np.ndarray
+ splitting(image : np.ndarray) : List
+ remove_border_artifacts(image_array : np.ndarray) : np.ndarray
+ generate_pieces(image : np.ndarray) : Tuple
</panel_attributes><additional_attributes></additional_attributes></element></diagram>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<diagram program="umlet" version="15.0.0">
<help_text>Space for diagram notes</help_text>
<zoom_level>9</zoom_level>
<element>
<id>UMLClass</id>
<coordinates>
<x>108</x>
<y>108</y>
<w>315</w>
<h>90</h>
</coordinates>
<panel_attributes>Puzzle
--
- size : int[ ]
- width : int
- height : int
- pieces : PuzzlePiece[ ]</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>99</x>
<y>270</y>
<w>324</w>
<h>144</h>
</coordinates>
<panel_attributes>PuzzlePiece
--
- id : int
- category : Enum = {"EDGE", "CORNER", "INNER"}
- sides : Side [4]
- number_of_holes : int
- number_of_heads : int
- top_side : int = 0
- is_sorted : boolean
- image_path : String
</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>252</x>
<y>189</y>
<w>36</w>
<h>99</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;&lt;&lt;-
m1=1
m2=*</panel_attributes>
<additional_attributes>10.0;10.0;10.0;90.0</additional_attributes>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>126</x>
<y>486</y>
<w>270</w>
<h>117</h>
</coordinates>
<panel_attributes>Side
--
- id : int
- side_type : Enum {"FLAT", "HOLE", "HEAD"}
- outline : np.array
- width : int
- height : int
- is_sorted : boolean</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>252</x>
<y>405</y>
<w>36</w>
<h>99</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;&lt;&lt;&lt;-
m1=1
m2=4</panel_attributes>
<additional_attributes>10.0;10.0;10.0;90.0</additional_attributes>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>504</x>
<y>414</y>
<w>153</w>
<h>72</h>
</coordinates>
<panel_attributes>MatchingCounterpiece
--
- piece : PuzzlePiece
- side : Side
- distance : int</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>414</x>
<y>342</y>
<w>108</w>
<h>117</h>
</coordinates>
<panel_attributes>lt=-</panel_attributes>
<additional_attributes>10.0;10.0;100.0;110.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>387</x>
<y>459</y>
<w>135</w>
<h>126</h>
</coordinates>
<panel_attributes>lt=-</panel_attributes>
<additional_attributes>130.0;10.0;10.0;120.0</additional_attributes>
</element>
</diagram>
# Resource space
This is the place for your images
\ No newline at end of file
resources/demo_images/all_mixed.jpg

3.88 MiB

resources/demo_images/all_sorted.jpg

4.61 MiB

resources/demo_images/binary_puzzle_piece.png

3.73 KiB

resources/demo_images/piece_1.png

150 KiB

resources/demo_images/piece_2.png

191 KiB

resources/demo_images/piece_3.png

191 KiB

resources/demo_images/piece_4.png

167 KiB

resources/demo_images/piece_5.png

249 KiB

resources/demo_images/piece_6.png

162 KiB

resources/demo_images/piece_7.png

245 KiB

resources/demo_images/piece_8.png

177 KiB

resources/demo_images/piece_9.png

194 KiB

resources/demo_images/puzzle_animation.gif

185 KiB

#%% imports
import sys
import numpy as np
sys.path.append('../../src/general')
from Puzzle import Puzzle
from PuzzlePiece import PuzzlePiece
from PuzzlePiece import Category
from Side import Side
from Side import SideType
#%% test data 2x2-puzzle
def get_puzzle_2x2():
piece1_side1_outline = np.array([ [0,0,0,1,1,1,0,0,0],
[0,0,1,0,0,0,1,0,0],
[0,0,1,0,0,0,1,0,0],
[0,0,0,1,0,1,0,0,0],
[1,1,1,1,0,1,1,1,1]])
piece1_side2_outline = np.ones(11)
piece1_side3_outline = np.ones(9)
piece1_side4_outline = np.array([ [0,0,0,0,1,1,0,0,0,0,0],
[0,0,0,1,0,0,1,0,0,0,0],
[0,0,1,0,0,0,0,1,0,0,0],
[0,0,1,0,0,0,0,1,0,0,0],
[0,0,0,1,0,0,0,1,0,0,0],
[1,1,1,1,1,0,1,1,1,1,1]])
piece2_side1_outline = np.array([ [0,0,0,0,1,1,0,0,0,0,0],
[0,0,0,1,0,0,1,0,0,0,0],
[0,0,1,0,0,0,0,1,0,0,0],
[0,0,1,0,0,0,0,1,0,0,0],
[0,0,0,1,0,0,0,1,0,0,0],
[1,1,1,1,1,0,1,1,1,1,1]])
piece2_side2_outline = np.ones(13)
piece2_side3_outline = np.ones(11)
piece2_side4_outline = np.array([ [0,0,0,1,1,1,1,1,0,0,0,0,0],
[0,0,1,0,0,0,0,0,1,0,0,0,0],
[0,0,1,0,0,0,0,0,1,0,0,0,0],
[0,0,0,1,0,0,0,1,0,0,0,0,0],
[1,1,1,1,0,0,0,1,1,1,1,1,1]])
piece3_side1_outline = np.array([ [0,0,0,1,1,1,0,0,0],
[0,0,1,0,0,0,1,0,0],
[0,0,1,0,0,0,1,0,0],
[0,0,0,1,0,1,0,0,0],
[1,1,1,1,0,1,1,1,1]])
piece3_side2_outline = np.array([ [0,0,0,0,0,0,0,0,0,1,1,0,0,0,0],
[0,0,0,0,0,0,0,0,1,0,0,1,0,0,0],
[0,0,0,0,0,0,0,1,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,0,1,0,0,1,0,0,0],
[1,1,1,1,1,1,1,1,1,0,1,1,1,1,1]])
piece3_side3_outline = np.ones(9)
piece3_side4_outline = np.ones(14)
piece4_side1_outline = np.ones(14)
piece4_side2_outline = np.ones(13)
piece4_side3_outline = np.array([ [0,0,0,0,0,0,0,0,0,1,1,0,0,0,0],
[0,0,0,0,0,0,0,0,1,0,0,1,0,0,0],
[0,0,0,0,0,0,0,1,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,0,1,0,0,1,0,0,0],
[1,1,1,1,1,1,1,1,1,0,1,1,1,1,1]])
piece4_side4_outline = np.array([ [0,0,0,1,1,1,1,1,0,0,0,0,0],
[0,0,1,0,0,0,0,0,1,0,0,0,0],
[0,0,1,0,0,0,0,0,1,0,0,0,0],
[0,0,0,1,0,0,0,1,0,0,0,0,0],
[1,1,1,1,0,0,0,1,1,1,1,1,1]])
piece1_side1 = Side(0, SideType.HEAD, piece1_side1_outline, 9, 5)
piece1_side2 = Side(1, SideType.FLAT, piece1_side2_outline, 11, 1)
piece1_side3 = Side(2, SideType.FLAT, piece1_side3_outline, 9, 1)
piece1_side4 = Side(3, SideType.HEAD, piece1_side4_outline, 11, 6)
piece2_side1 = Side(0, SideType.HOLE, piece2_side1_outline, 11, 6)
piece2_side2 = Side(1, SideType.FLAT, piece2_side2_outline, 13, 1)
piece2_side3 = Side(2, SideType.FLAT, piece2_side3_outline, 11, 1)
piece2_side4 = Side(3, SideType.HEAD, piece2_side4_outline, 13, 5)
piece3_side1 = Side(0, SideType.HOLE, piece3_side1_outline, 9, 5)
piece3_side2 = Side(1, SideType.HOLE, piece3_side2_outline, 14, 5)
piece3_side3 = Side(2, SideType.FLAT, piece3_side3_outline, 9, 1)
piece3_side4 = Side(3, SideType.FLAT, piece3_side4_outline, 14, 1)
piece4_side1 = Side(0, SideType.FLAT, piece4_side1_outline, 14, 1)
piece4_side2 = Side(1, SideType.FLAT, piece4_side2_outline, 13, 1)
piece4_side3 = Side(2, SideType.HEAD, piece4_side3_outline, 14, 5)
piece4_side4 = Side(3, SideType.HOLE, piece4_side4_outline, 13, 5)
sides_piece1 = np.array([piece1_side1, piece1_side2, piece1_side3, piece1_side4])
sides_piece2 = np.array([piece2_side1, piece2_side2, piece2_side3, piece2_side4])
sides_piece3 = np.array([piece3_side1, piece3_side2, piece3_side3, piece3_side4])
sides_piece4 = np.array([piece4_side1, piece4_side2, piece4_side3, piece4_side4])
piece1 = PuzzlePiece(0, Category.CORNER, 0, 2, '', sides_piece1)
piece2 = PuzzlePiece(1, Category.CORNER, 1, 1, '', sides_piece2)
piece3 = PuzzlePiece(2, Category.CORNER, 2, 0, '', sides_piece3)
piece4 = PuzzlePiece(3, Category.CORNER, 1, 1, '', sides_piece4)
puzzle = Puzzle(2, 2)
puzzle.set_pieces(np.array([piece1, piece2, piece3, piece4]))
return puzzle
def get_puzzle_3x3():
piece0_side0_outline = np.array([ [0,0,0,1,1,1,0,0,0],
[0,0,1,0,0,0,1,0,0],
[0,0,1,0,0,0,1,0,0],
[0,0,0,1,0,1,0,0,0],
[1,1,1,1,0,1,1,1,1]])
piece0_side1_outline = np.ones(11)
piece0_side2_outline = np.ones(9)
piece0_side3_outline = np.array([ [0,0,0,0,1,1,0,0,0,0,0],
[0,0,0,1,0,0,1,0,0,0,0],
[0,0,1,0,0,0,0,1,0,0,0],
[0,0,1,0,0,0,0,1,0,0,0],
[0,0,0,1,0,0,0,1,0,0,0],
[1,1,1,1,1,0,1,1,1,1,1]])
piece1_side0_outline = np.array([ [0,0,0,0,1,1,0,0,0,0,0],
[0,0,0,1,0,0,1,0,0,0,0],
[0,0,1,0,0,0,0,1,0,0,0],
[0,0,1,0,0,0,0,1,0,0,0],
[0,0,0,1,0,0,0,1,0,0,0],
[1,1,1,1,1,0,1,1,1,1,1]])
piece1_side1_outline = np.ones(13)
piece1_side2_outline = np.array([ [0,0,0,0,0,1,1,0,0,0,0],
[0,0,0,0,1,0,0,1,0,0,0],
[1,1,1,1,1,0,0,1,1,1,1]])
piece1_side3_outline = np.array([ [0,0,0,1,1,1,1,1,0,0,0,0,0],
[0,0,1,0,0,0,0,0,1,0,0,0,0],
[0,0,1,0,0,0,0,0,1,0,0,0,0],
[0,0,0,1,0,0,0,1,0,0,0,0,0],
[1,1,1,1,0,0,0,1,1,1,1,1,1]])
piece2_side0_outline = np.array([ [0,0,0,0,0,0,1,1,0,0,0,0],
[0,0,0,0,0,1,0,0,1,0,0,0],
[0,0,0,0,1,0,0,0,0,1,0,0],
[1,1,1,1,1,0,0,0,0,1,1,1]])
piece2_side1_outline = np.array([ [0,0,0,0,0,1,1,0,0,0,0],
[0,0,0,0,1,0,0,1,0,0,0],
[1,1,1,1,1,0,0,1,1,1,1]])
piece2_side2_outline = np.ones(12)
piece2_side3_outline = np.ones(11)
piece3_side0_outline = np.array([ [0,0,0,1,1,1,0,0,0],
[0,0,1,0,0,0,1,0,0],
[0,0,1,0,0,0,1,0,0],
[0,0,0,1,0,1,0,0,0],
[1,1,1,1,0,1,1,1,1]])
piece3_side1_outline = np.array([ [0,0,0,0,0,0,0,0,0,1,1,0,0,0,0],
[0,0,0,0,0,0,0,0,1,0,0,1,0,0,0],
[0,0,0,0,0,0,0,1,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,0,1,0,0,1,0,0,0],
[1,1,1,1,1,1,1,1,1,0,1,1,1,1,1]])
piece3_side2_outline = np.array([ [0,0,0,1,1,1,0,0,0],
[0,0,1,0,0,0,1,0,0],
[0,0,1,0,0,0,1,0,0],
[1,1,1,0,0,0,1,1,1]])
piece3_side3_outline = np.ones(15)
piece4_side0_outline = np.array([ [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0],
[0,0,0,0,1,0,0,0,0,0,1,0,0,0,0],
[1,1,1,1,1,0,0,0,0,0,0,1,1,1,1]])
piece4_side1_outline = np.array([ [0,0,0,0,0,0,0,1,1,0,0,0,0],
[0,0,0,0,0,1,1,0,0,1,0,0,0],
[0,0,0,0,1,0,0,0,0,1,0,0,0],
[0,0,0,0,1,0,0,0,0,1,0,0,0],
[0,0,0,0,1,0,0,0,0,1,0,0,0],
[1,1,1,1,1,0,0,0,0,1,1,1,1]])
piece4_side2_outline = np.array([ [0,0,0,0,0,0,0,0,0,1,1,0,0,0,0],
[0,0,0,0,0,0,0,0,1,0,0,1,0,0,0],
[0,0,0,0,0,0,0,1,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,0,1,0,0,1,0,0,0],
[1,1,1,1,1,1,1,1,1,0,1,1,1,1,1]])
piece4_side3_outline = np.array([ [0,0,0,1,1,1,1,1,0,0,0,0,0],
[0,0,1,0,0,0,0,0,1,0,0,0,0],
[0,0,1,0,0,0,0,0,1,0,0,0,0],
[0,0,0,1,0,0,0,1,0,0,0,0,0],
[1,1,1,1,0,0,0,1,1,1,1,1,1]])
piece5_side0_outline = np.array([ [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0],
[0,0,0,0,1,0,0,0,0,0,1,0,0,0,0],
[1,1,1,1,1,0,0,0,0,0,0,1,1,1,1]])
piece5_side1_outline = np.array([ [0,0,0,0,0,0,1,1,0,0,0,0],
[0,0,0,0,0,1,0,0,1,0,0,0],
[0,0,0,0,1,0,0,0,0,1,0,0],
[1,1,1,1,1,0,0,0,0,1,1,1]])
piece5_side2_outline = np.ones(15)
piece5_side3_outline = np.array([ [0,0,0,0,0,1,1,1,0,0,0,0],
[1,0,0,0,1,0,0,0,1,0,0,1],
[1,0,0,1,0,0,0,0,0,1,0,1],
[1,1,1,1,0,0,0,0,0,1,1,1]])
piece6_side0_outline = np.array([ [0,0,0,1,1,1,0,0,0],
[0,0,1,0,0,0,1,0,0],
[0,0,1,0,0,0,1,0,0],
[1,1,1,0,0,0,1,1,1]])
piece6_side1_outline = np.array([ [0,0,0,0,1,1,0,0,0,0,0,0],
[0,0,0,1,0,0,1,0,0,0,0,0],
[0,0,0,1,0,0,1,0,0,0,0,0],
[1,1,1,1,0,0,1,1,1,1,1,1]])
piece6_side2_outline = np.ones(9)
piece6_side3_outline = np.ones(12)
piece7_side0_outline = np.array([ [0,0,0,0,1,1,0,0,0,0,0,0],
[0,0,0,1,0,0,1,0,0,0,0,0],
[0,0,0,1,0,0,1,0,0,0,0,0],
[1,1,1,1,0,0,1,1,1,1,1,1]])
piece7_side1_outline = np.array([ [0,0,0,0,0,0,0,1,1,0,0,0,0],
[0,0,0,0,0,1,1,0,0,1,0,0,0],
[0,0,0,0,1,0,0,0,0,1,0,0,0],
[0,0,0,0,1,0,0,0,0,1,0,0,0],
[0,0,0,0,1,0,0,0,0,1,0,0,0],
[1,1,1,1,1,0,0,0,0,1,1,1,1]])
piece7_side2_outline = np.array([ [0,0,0,0,1,1,0,0,0,0,0,0],
[0,0,0,1,0,0,1,0,0,0,0,0],
[1,1,1,0,0,0,0,1,1,1,1,1]])
piece7_side3_outline = np.ones(13)
piece8_side0_outline = np.ones(12)
piece8_side1_outline = np.ones(12)
piece8_side2_outline = np.array([ [0,0,0,0,1,1,0,0,0,0,0,0],
[0,0,0,1,0,0,1,0,0,0,0,0],
[1,1,1,0,0,0,0,1,1,1,1,1]])
piece8_side3_outline = np.array([ [0,0,0,0,0,1,1,1,0,0,0,0],
[1,0,0,0,1,0,0,0,1,0,0,1],
[1,0,0,1,0,0,0,0,0,1,0,1],
[1,1,1,1,0,0,0,0,0,1,1,1]])
piece0_side0 = Side(0, SideType.HEAD, piece0_side0_outline, piece0_side0_outline.shape[1], piece0_side0_outline.shape[0])
piece0_side1 = Side(1, SideType.FLAT, piece0_side1_outline, 1, piece0_side1_outline.shape[0])
piece0_side2 = Side(2, SideType.FLAT, piece0_side2_outline, 1, piece0_side2_outline.shape[0])
piece0_side3 = Side(3, SideType.HEAD, piece0_side3_outline, piece0_side3_outline.shape[1], piece0_side3_outline.shape[0])
piece1_side0 = Side(0, SideType.HOLE, piece1_side0_outline, piece1_side0_outline.shape[1], piece1_side0_outline.shape[0])
piece1_side1 = Side(1, SideType.FLAT, piece1_side1_outline, 1, piece1_side1_outline.shape[0])
piece1_side2 = Side(2, SideType.HEAD, piece1_side2_outline, piece1_side2_outline.shape[1], piece1_side2_outline.shape[0])
piece1_side3 = Side(3, SideType.HEAD, piece1_side3_outline, piece1_side3_outline.shape[1], piece1_side3_outline.shape[0])
piece2_side0 = Side(0, SideType.HOLE, piece2_side0_outline, piece2_side0_outline.shape[1], piece2_side0_outline.shape[0])
piece2_side1 = Side(1, SideType.HOLE, piece2_side1_outline, piece2_side1_outline.shape[1], piece2_side1_outline.shape[0])
piece2_side2 = Side(2, SideType.FLAT, piece2_side2_outline, 1, piece2_side2_outline.shape[0])
piece2_side3 = Side(3, SideType.FLAT, piece2_side3_outline, 1, piece2_side3_outline.shape[0])
piece3_side0 = Side(0, SideType.HOLE, piece3_side0_outline, piece3_side0_outline.shape[1], piece3_side0_outline.shape[0])
piece3_side1 = Side(1, SideType.HOLE, piece3_side1_outline, piece3_side1_outline.shape[1], piece3_side1_outline.shape[0])
piece3_side2 = Side(2, SideType.HEAD, piece3_side2_outline, piece3_side2_outline.shape[1], piece3_side2_outline.shape[0])
piece3_side3 = Side(3, SideType.FLAT, piece3_side3_outline, 1, piece3_side3_outline.shape[0])
piece4_side0 = Side(0, SideType.HEAD, piece4_side0_outline, piece4_side0_outline.shape[1], piece4_side0_outline.shape[0])
piece4_side1 = Side(1, SideType.HOLE, piece4_side1_outline, piece4_side1_outline.shape[1], piece4_side1_outline.shape[0])
piece4_side2 = Side(2, SideType.HEAD, piece4_side2_outline, piece4_side2_outline.shape[1], piece4_side2_outline.shape[0])
piece4_side3 = Side(3, SideType.HOLE, piece4_side3_outline, piece4_side3_outline.shape[1], piece4_side3_outline.shape[0])
piece5_side0 = Side(0, SideType.HOLE, piece5_side0_outline, piece5_side0_outline.shape[1], piece5_side0_outline.shape[0])
piece5_side1 = Side(1, SideType.HEAD, piece5_side1_outline, piece5_side1_outline.shape[1], piece5_side1_outline.shape[0])
piece5_side2 = Side(2, SideType.FLAT, piece5_side2_outline, 1, piece5_side2_outline.shape[0])
piece5_side3 = Side(3, SideType.HOLE, piece5_side3_outline, piece5_side3_outline.shape[1], piece5_side3_outline.shape[0])
piece6_side0 = Side(0, SideType.HOLE, piece6_side0_outline, piece6_side0_outline.shape[1], piece6_side0_outline.shape[0])
piece6_side1 = Side(1, SideType.HOLE, piece6_side1_outline, piece6_side1_outline.shape[1], piece6_side1_outline.shape[0])
piece6_side2 = Side(2, SideType.FLAT, piece6_side2_outline, 1, piece6_side2_outline.shape[0])
piece6_side3 = Side(3, SideType.FLAT, piece6_side3_outline, 1, piece6_side3_outline.shape[0])
piece7_side0 = Side(0, SideType.HEAD, piece7_side0_outline, piece7_side0_outline.shape[1], piece7_side0_outline.shape[0])
piece7_side1 = Side(1, SideType.HEAD, piece7_side1_outline, piece7_side1_outline.shape[1], piece7_side1_outline.shape[0])
piece7_side2 = Side(2, SideType.HOLE, piece7_side2_outline, piece7_side2_outline.shape[1], piece7_side2_outline.shape[0])
piece7_side3 = Side(3, SideType.FLAT, piece7_side3_outline, 1, piece7_side3_outline.shape[0])
piece8_side0 = Side(0, SideType.FLAT, piece8_side0_outline, 1, piece8_side0_outline.shape[0])
piece8_side1 = Side(1, SideType.FLAT, piece8_side1_outline, 1, piece8_side1_outline.shape[0])
piece8_side2 = Side(2, SideType.HEAD, piece8_side2_outline, piece8_side2_outline.shape[1], piece8_side2_outline.shape[0])
piece8_side3 = Side(3, SideType.HEAD, piece8_side3_outline, piece8_side3_outline.shape[1], piece8_side3_outline.shape[0])
sides_piece0 = np.array([piece0_side0, piece0_side1, piece0_side2, piece0_side3])
sides_piece1 = np.array([piece1_side0, piece1_side1, piece1_side2, piece1_side3])
sides_piece2 = np.array([piece2_side0, piece2_side1, piece2_side2, piece2_side3])
sides_piece3 = np.array([piece3_side0, piece3_side1, piece3_side2, piece3_side3])
sides_piece4 = np.array([piece4_side0, piece4_side1, piece4_side2, piece4_side3])
sides_piece5 = np.array([piece5_side0, piece5_side1, piece5_side2, piece5_side3])
sides_piece6 = np.array([piece6_side0, piece6_side1, piece6_side2, piece6_side3])
sides_piece7 = np.array([piece7_side0, piece7_side1, piece7_side2, piece7_side3])
sides_piece8 = np.array([piece8_side0, piece8_side1, piece8_side2, piece8_side3])
piece0 = PuzzlePiece(0, Category.CORNER, 0, 2, '', sides_piece0)
piece1 = PuzzlePiece(1, Category.EDGE, 1, 2, '', sides_piece1)
piece2 = PuzzlePiece(2, Category.CORNER, 2, 0, '', sides_piece2)
piece3 = PuzzlePiece(3, Category.EDGE, 2, 1, '', sides_piece3)
piece4 = PuzzlePiece(4, Category.INNER, 2, 2, '', sides_piece4)
piece5 = PuzzlePiece(5, Category.EDGE, 2, 1, '', sides_piece5)
piece6 = PuzzlePiece(6, Category.CORNER, 2, 0, '', sides_piece6)
piece7 = PuzzlePiece(7, Category.EDGE, 1, 2, '', sides_piece7)
piece8 = PuzzlePiece(8, Category.CORNER, 0, 2, '', sides_piece8)
puzzle = Puzzle(3, 3)
puzzle.set_pieces(np.array([piece0, piece1, piece2, piece3, piece4, piece5, piece6, piece7, piece8]))
return puzzle
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment