diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 26d33521a..000000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
diff --git a/game/.idea/.gitignore b/game/.idea/.gitignore
new file mode 100644
index 000000000..13566b81b
--- /dev/null
+++ b/game/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/game/.idea/misc.xml b/game/.idea/misc.xml
new file mode 100644
index 000000000..53624c9e1
--- /dev/null
+++ b/game/.idea/misc.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/game/.idea/vcs.xml b/game/.idea/vcs.xml
new file mode 100644
index 000000000..6c0b86358
--- /dev/null
+++ b/game/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/game/Makefile b/game/Makefile
new file mode 100644
index 000000000..7caafa08f
--- /dev/null
+++ b/game/Makefile
@@ -0,0 +1,18 @@
+# Makefile
+
+CC = gcc
+CFLAGS = `pkg-config --cflags gtk+-3.0` -Wall -O3
+LDLIBS = `pkg-config --libs gtk+-3.0`
+
+EXE = main
+
+all: $(EXE)
+
+$(foreach f, $(EXE), $(eval $(f):))
+
+.PHONY: clean
+
+clean:
+ ${RM} $(EXE)
+
+# END
\ No newline at end of file
diff --git a/game/main b/game/main
new file mode 100755
index 000000000..f9ea29ef3
Binary files /dev/null and b/game/main differ
diff --git a/game/main.c b/game/main.c
new file mode 100644
index 000000000..2b9f75438
--- /dev/null
+++ b/game/main.c
@@ -0,0 +1,327 @@
+#include
+#include
+#include
+
+gulong timer_id;
+gint64 start_time;
+
+int isValidSudoku(int sudoku[9][9]) {
+ int usedRow[9][9] = { };
+ int usedColumn[9][9] = { };
+ int usedBox[3][3][9] = { };
+
+ for (int row = 0; row < 9; row++) {
+ for (int col = 0; col < 9; col++) {
+ int digit = sudoku[row][col];
+ if (digit != 0) {
+ if (usedRow[row][digit - 1] || usedColumn[col][digit - 1] || usedBox[row / 3][col / 3][digit - 1]) {
+ return 0; // Duplicate digit found
+ }
+
+ usedRow[row][digit - 1] = 1;
+ usedColumn[col][digit - 1] = 1;
+ usedBox[row / 3][col / 3][digit - 1] = 1;
+ }
+ }
+ }
+
+ return 1; // Grid is valid
+}
+
+int isSafe(int sudoku[9][9], int row, int col, int num) {
+ // Check row
+ for (int i = 0; i < 9; i++) {
+ if (sudoku[row][i] == num) {
+ return 0;
+ }
+ }
+
+ // Check column
+ for (int i = 0; i < 9; i++) {
+ if (sudoku[i][col] == num) {
+ return 0;
+ }
+ }
+
+ // Check box
+ int startRow = (row / 3) * 3;
+ int startCol = (col / 3) * 3;
+
+ for (int i = 0; i < 3; i++) {
+ for (int j = 0; j < 3; j++) {
+ if (sudoku[startRow + i][startCol + j] == num) {
+ return 0;
+ }
+ }
+ }
+
+ return 1;
+}
+
+int solveSudoku(int sudoku[9][9]) {
+ for (int row = 0; row < 9; row++) {
+ for (int col = 0; col < 9; col++) {
+ if (sudoku[row][col] == 0) {
+ for (int num = 1; num <= 9; num++) {
+ if (isSafe(sudoku, row, col, num)) {
+ sudoku[row][col] = num;
+
+ if (solveSudoku(sudoku)) {
+ return 1;
+ }
+
+ sudoku[row][col] = 0;
+ }
+ }
+ return 0;
+ }
+ }
+ }
+ return 1;
+}
+
+void generate_sudoku(int sudoku[9][9]) {
+ // Seed the random number generator
+ srand(time(NULL));
+
+ // Initialize the sudoku grid with zeros
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+ sudoku[i][j] = 0;
+ }
+ }
+
+ // Generate the complete sudoku grid
+ while(!solveSudoku(sudoku));
+
+ // Remove some digits to create a playable sudoku
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+ // Randomly remove digits
+ if (rand() % 2 == 0 || rand() % 2 == 0) {
+ sudoku[i][j] = 0;
+ }
+ }
+ }
+}
+
+// Function to update the label text with the elapsed time
+gboolean updateElapsedTime(GtkLabel* label) {
+ gint64 current_time = g_get_monotonic_time();
+ gint64 elapsed_time = current_time - start_time;
+
+ // Convert the elapsed time to seconds
+ gint64 elapsed_seconds = elapsed_time / G_USEC_PER_SEC;
+
+ // Calculate minutes and seconds
+ gint minutes = elapsed_seconds / 60;
+ gint seconds = elapsed_seconds % 60;
+
+ gchar *elapsed_string = g_strdup_printf("%02d : %02d", minutes, seconds);
+ gtk_label_set_text(label, elapsed_string);
+ g_free(elapsed_string);
+
+ // Continue updating the elapsed time
+ return G_SOURCE_CONTINUE;
+}
+
+void clear_board(GtkBuilder* builder)
+{
+ for (int i = 0; i < 9; i++)
+ {
+ for (int j = 0; j < 9; j++)
+ {
+ gchar *buffer = g_strdup_printf("%i%i", i, j);
+ GtkEntry* entry = GTK_ENTRY(gtk_builder_get_object(builder, buffer));
+ if (gtk_widget_get_sensitive(GTK_WIDGET(entry)))
+ gtk_entry_set_text(entry, "");
+ }
+ }
+}
+
+void on_play(GtkButton* button, gpointer user_data)
+{
+ // Gets the builder.
+ GtkBuilder* builder = (GtkBuilder*) user_data;
+ GtkLabel* label = (GtkLabel*) gtk_builder_get_object(builder, "time");
+ GtkButton* play_button = (GtkButton*) gtk_builder_get_object(builder, "play_button");
+
+ if (timer_id == 0)
+ {
+ start_time = g_get_monotonic_time();
+ updateElapsedTime(label);
+
+ // Start the timer to update the elapsed time every second
+ timer_id = g_timeout_add_seconds(1, (GSourceFunc)updateElapsedTime, label);
+
+ gtk_button_set_label(play_button, "Stop");
+ }
+ else
+ {
+ g_source_remove(timer_id);
+ timer_id = 0;
+
+ clear_board(builder);
+ gtk_label_set_text(label, "00 : 00");
+ gtk_button_set_label(play_button, "Play");
+ }
+}
+
+void on_clear(GtkButton* button, gpointer user_data)
+{
+ GtkBuilder* builder = (GtkBuilder*) user_data;
+ clear_board(builder);
+}
+
+void printAndDisappear(const gchar *text, const gchar *color, GtkLabel* label)
+{
+ gtk_label_set_text(GTK_LABEL(label), text);
+
+ gtk_widget_show(GTK_WIDGET(label));
+ g_timeout_add_seconds(5, (GSourceFunc)gtk_widget_hide, label);
+}
+
+void on_validate(GtkButton* button, gpointer user_data)
+{
+ GtkBuilder* builder = (GtkBuilder*) user_data;
+
+ int sudoku[9][9] = {};
+
+ for (int i = 0; i < 9; i++)
+ {
+ for (int j = 0; j < 9; j++)
+ {
+ // Gets entry.
+ gchar *buffer = g_strdup_printf("%i%i", i, j);
+ GtkEntry *entry = GTK_ENTRY(gtk_builder_get_object(builder, buffer));
+ const gchar *text = gtk_entry_get_text(entry);
+ char charValue = *text;
+ int intValue = charValue - '0';
+ sudoku[i][j] = intValue;
+ }
+ }
+
+ GtkLabel* result_label = (GtkLabel*) gtk_builder_get_object(builder, "result_label");
+
+ if (isValidSudoku(sudoku))
+ {
+ printAndDisappear("Success!", "#32A852", result_label);
+ }
+ else
+ {
+ printAndDisappear("You failed!", "#A84432", result_label);
+ }
+}
+
+void on_new(GtkButton* button, gpointer user_data)
+{
+ GtkBuilder* builder = (GtkBuilder*) user_data;
+
+ if (timer_id != 0)
+ {
+ g_source_remove(timer_id);
+ timer_id = 0;
+
+ clear_board(builder);
+ GtkButton* play_button = (GtkButton*) gtk_builder_get_object(builder, "play_button");
+ GtkLabel* label = (GtkLabel*) gtk_builder_get_object(builder, "time");
+ gtk_label_set_text(label, "00 : 00");
+ gtk_button_set_label(play_button, "Play");
+ }
+
+ int sudoku[9][9] = {};
+ generate_sudoku(sudoku);
+ upload_grid(sudoku, builder);
+}
+
+void upload_grid(int sudoku[9][9], GtkBuilder* builder)
+{
+ // Set not editable cases.
+ for (int i = 0; i < 9; i++)
+ {
+ for (int j = 0; j < 9; j++)
+ {
+ // Gets entry.
+ gchar *buffer = g_strdup_printf("%i%i", i, j);
+ GtkEntry* entry = GTK_ENTRY(gtk_builder_get_object(builder, buffer));
+
+ // Avoid empty cells.
+ if (sudoku[i][j] != 0)
+ {
+ gchar *value = g_strdup_printf("%i", sudoku[i][j]);
+ gtk_widget_set_sensitive(GTK_WIDGET(entry), FALSE);
+ gtk_entry_set_text(entry, value);
+
+ // Apply CSS style to make the text bold and set label color
+ const char *css = "* { font-weight: bold; color: red; }";
+ GtkCssProvider *provider = gtk_css_provider_new();
+ gtk_css_provider_load_from_data(provider, css, -1, NULL);
+ GtkStyleContext *context = gtk_widget_get_style_context(GTK_WIDGET(entry));
+ gtk_style_context_add_provider(context, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER);
+ }
+ else
+ {
+ gtk_widget_set_sensitive(GTK_WIDGET(entry), TRUE);
+ gtk_entry_set_text(entry, "");
+
+ const char *css = "* { font-weight: bold; color: inherit; }";
+ GtkCssProvider *provider = gtk_css_provider_new();
+ gtk_css_provider_load_from_data(provider, css, -1, NULL);
+ GtkStyleContext *context = gtk_widget_get_style_context(GTK_WIDGET(entry));
+ gtk_style_context_add_provider(context, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER);
+
+ }
+
+ gtk_entry_set_alignment(entry, 0.5);
+ gtk_entry_set_max_length(entry, 1);
+
+ }
+}
+
+// Main function.
+int main (int argc, char *argv[])
+{
+ // Initializes GTK.
+ gtk_init(NULL, NULL);
+
+ // Loads the UI description and build the UI. Exits if an error occurs.
+ GtkBuilder* builder = gtk_builder_new();
+ GError* error = NULL;
+ if (gtk_builder_add_from_file(builder, "sudo.glade", &error) == 0)
+ {
+ g_printerr("Error loading file: %s\n", error->message);
+ g_clear_error(&error);
+ return 1;
+ }
+
+ // Widgets.
+ GtkWindow* window = GTK_WINDOW(gtk_builder_get_object(builder, "main_window"));
+ GtkButton* play_button = GTK_BUTTON(gtk_builder_get_object(builder, "play_button"));
+ GtkButton* clear_button = GTK_BUTTON(gtk_builder_get_object(builder, "clear_button"));
+ GtkButton* new_button = GTK_BUTTON(gtk_builder_get_object(builder, "new_button"));
+ GtkButton* validate_button = GTK_BUTTON(gtk_builder_get_object(builder, "validate_button"));
+
+ // Connects signal.
+ g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
+ g_signal_connect(play_button, "clicked", G_CALLBACK(on_play), builder);
+ g_signal_connect(clear_button, "clicked", G_CALLBACK(on_clear), builder);
+ g_signal_connect(new_button, "clicked", G_CALLBACK(on_new), builder);
+ g_signal_connect(validate_button, "clicked", G_CALLBACK(on_validate), builder);
+
+ // -- Generates a new grid. -- //
+ on_new(new_button, builder);
+
+ // --- OR use an existing grid. --- //
+ // int sudoku[9][9];
+ // upload_grid(sudoku, builder);
+
+ // Runs the main loop.
+ gtk_main();
+
+ // Clean up resources
+ g_source_remove(timer_id);
+
+ // Exits.
+ return 0;
+
+}
diff --git a/game/sudo.glade b/game/sudo.glade
new file mode 100644
index 000000000..97c884678
--- /dev/null
+++ b/game/sudo.glade
@@ -0,0 +1,6300 @@
+
+
+
+
+
+
diff --git a/game/sudo.glade~ b/game/sudo.glade~
new file mode 100644
index 000000000..97c884678
--- /dev/null
+++ b/game/sudo.glade~
@@ -0,0 +1,6300 @@
+
+
+
+
+
+ True
+ False
+ center
+ 960
+ 718
+ center
+
+
+
+ True
+ False
+
+
+ True
+ False
+ end
+ 50
+ 20
+ vertical
+ bottom
+
+
+ True
+ False
+ 20
+ 20
+ 20
+ 20
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 5
+ 5
+ Time elapsed
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ False
+ 10
+ 10
+ 00 : 00
+
+
+ False
+ True
+ 2
+
+
+
+
+ True
+ False
+
+
+ False
+ True
+ 3
+
+
+
+
+ Play
+ True
+ True
+ True
+ 20
+ 20
+ 20
+ 5
+
+
+ False
+ True
+ 4
+
+
+
+
+ Hexadoku
+ True
+ True
+ True
+ 20
+ 20
+ 5
+ 5
+
+
+ False
+ True
+ 5
+
+
+
+
+ Validate
+ True
+ True
+ True
+ 20
+ 20
+ 5
+ 5
+
+
+ False
+ True
+ 6
+
+
+
+
+ Clear Board
+ True
+ True
+ True
+ 20
+ 20
+ 5
+ 5
+
+
+ False
+ True
+ 8
+
+
+
+
+ New Puzzle
+ True
+ True
+ True
+ 20
+ 20
+ 5
+ 20
+
+
+ False
+ True
+ 9
+
+
+
+
+ 1
+ 0
+
+
+
+
+ True
+ False
+
+
+
+ True
+ False
+ center
+ center
+ 50
+ 50
+ 20
+ 20
+ 5
+ 5
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ number
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ number
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 0
+ 0
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 1
+ 0
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 2
+ 0
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 0
+ 1
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 1
+ 1
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 2
+ 1
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 0
+ 2
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 1
+ 2
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 2
+ 2
+
+
+
+
+ page0
+ page0
+
+
+
+
+
+ True
+ False
+ center
+ center
+ 50
+ 50
+ 20
+ 20
+ 5
+ 5
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 0
+ 0
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 1
+ 0
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 2
+ 0
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 3
+ 0
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 0
+ 1
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 1
+ 1
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 2
+ 1
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 3
+ 1
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 0
+ 2
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 1
+ 2
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 2
+ 2
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 3
+ 2
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 3
+ 3
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 2
+ 3
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 1
+ 3
+
+
+
+
+
+ True
+ False
+ 1
+ 1
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 0
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 1
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 2
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 0
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 1
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 2
+ 3
+
+
+
+
+ 40
+ 40
+ True
+ True
+ center
+ center
+ 1
+ 1
+ digits
+
+
+ 3
+ 3
+
+
+
+
+ 0
+ 3
+
+
+
+
+ page1
+ page1
+ 1
+
+
+
+
+ 0
+ 0
+
+
+
+
+
+
diff --git a/grid_processing/contour_manager.c b/grid_processing/contour_manager.c
index 84dea3918..327b5b979 100644
--- a/grid_processing/contour_manager.c
+++ b/grid_processing/contour_manager.c
@@ -1,5 +1,4 @@
#include "contour_manager.h"
-#include
/// @brief Gets the polygon area from a set of points.
///
@@ -233,7 +232,7 @@ void get_points_max_shape(int width, int height, int *pixels, struct list** save
/// @param dest_x Destination set of the x coordinates of the points.
/// @param dest_y Destination set of the x coordinates of the points.
/// @param size Size of arrays
-void find_corners_of_rectangle(double* arr_x, double* arr_y, double *dest_x, double *dest_y, double size)
+void find_corners_of_rectangle2(double* arr_x, double* arr_y, double *dest_x, double *dest_y, double size)
{
// Inits the corners.
double top_left_x = 0;
@@ -327,6 +326,67 @@ void find_corners_of_rectangle(double* arr_x, double* arr_y, double *dest_x, dou
dest_y[3] = bottom_left_y;
}
+void find_corners_of_rectangle(double* arr_x, double* arr_y, double* dest_x, double* dest_y, double size) {
+
+ // Find the index of the closest point to the top-left corner of the image
+ int top_left_index = 0;
+ double min_distance = arr_x[0] + arr_y[0];
+
+ for (int i = 1; i < size; i++) {
+ double distance = arr_x[i] + arr_y[i];
+ if (distance < min_distance) {
+ min_distance = distance;
+ top_left_index = i;
+ }
+ }
+
+ // Find the index of the closest point to the top-right corner of the image
+ int top_right_index = 0;
+ min_distance = -arr_x[0] + arr_y[0];
+
+ for (int i = 1; i < size; i++) {
+ double distance = -arr_x[i] + arr_y[i];
+ if (distance < min_distance) {
+ min_distance = distance;
+ top_right_index = i;
+ }
+ }
+
+ // Find the index of the closest point to the bottom-right corner of the image
+ int bottom_right_index = 0;
+ min_distance = -arr_x[0] - arr_y[0];
+
+ for (int i = 1; i < size; i++) {
+ double distance = -arr_x[i] - arr_y[i];
+ if (distance < min_distance) {
+ min_distance = distance;
+ bottom_right_index = i;
+ }
+ }
+
+ // Find the index of the closest point to the bottom-left corner of the image
+ int bottom_left_index = 0;
+ min_distance = arr_x[0] - arr_y[0];
+
+ for (int i = 1; i < size; i++) {
+ double distance = arr_x[i] - arr_y[i];
+ if (distance < min_distance) {
+ min_distance = distance;
+ bottom_left_index = i;
+ }
+ }
+
+ // Assign the corner coordinates to the dest_x and dest_y arrays
+ dest_x[0] = arr_x[top_left_index];
+ dest_y[0] = arr_y[top_left_index];
+ dest_x[1] = arr_x[top_right_index];
+ dest_y[1] = arr_y[top_right_index];
+ dest_x[2] = arr_x[bottom_right_index];
+ dest_y[2] = arr_y[bottom_right_index];
+ dest_x[3] = arr_x[bottom_left_index];
+ dest_y[3] = arr_y[bottom_left_index];
+}
+
// tmp
@@ -402,11 +462,63 @@ void TMP_extremes_lines_and_cell_extraction(SDL_Surface* surf, double corners_x[
list_destroy(coordinates_x);
}
+double calculate_area(Point p1, Point p2, Point p3, Point p4) {
+ double area = 0.5 * fabs(p1.x * p2.y - p2.x * p1.y +
+ p2.x * p3.y - p3.x * p2.y +
+ p3.x * p4.y - p4.x * p3.y +
+ p4.x * p1.y - p1.x * p4.y);
+ return area;
+}
+
+void find_largest_shape(Point arr[], int size, Point* largest_points) {
+ double max_area = 0.0;
+
+ for (int i = 0; i < size - 3; i++) {
+ for (int j = i + 1; j < size - 2; j++) {
+ for (int k = j + 1; k < size - 1; k++) {
+ for (int l = k + 1; l < size; l++) {
+
+ double curr_area = calculate_area(arr[i], arr[j], arr[k], arr[l]);
+
+ if (curr_area > max_area) {
+ max_area = curr_area;
+ largest_points[0] = arr[i];
+ largest_points[1] = arr[j];
+ largest_points[2] = arr[k];
+ largest_points[3] = arr[l];
+ }
+ }
+ }
+ }
+ }
+}
+
+void four_points(double arr_x[], double arr_y[], double dest_x[], double dest_y[], int size) {
+ // Create an array of Points from the input coordinates
+ Point arr[size];
+ for (int i = 0; i < size; i++)
+ {
+ arr[i].x = arr_x[i];
+ arr[i].y = arr_y[i];
+ }
+
+ // Find the four points forming the largest shape
+ Point largest_points[4]; // = {{1, 2}, {1, 2}, {1, 2}, {1, 2}};
+ find_largest_shape(arr, size, largest_points);
+
+ // Copy the largest points' coordinates to the destination arrays
+ for (int i = 0; i < 4; i++)
+ {
+ dest_x[i] = largest_points[i].x;
+ dest_y[i] = largest_points[i].y;
+ }
+}
+
//
//
//
//
-void four_points(double arr_x[], double arr_y[], double dest_x[], double dest_y[], int size)
+void four_points2(double arr_x[], double arr_y[], double dest_x[], double dest_y[], int size)
{
// Compute the convex hull using the Graham scan algorithm
// and store the result in the arr_x and arr_y arrays
@@ -492,7 +604,8 @@ void get_max_points_rect(SDL_Surface* surf, double *corners_x, double *corners_y
// Gets parameters of surface.
int width = surf->w;
int height = surf->h;
- int arr_pixels[width * height];
+ int *arr_pixels = calloc(width * height, sizeof(int));
+
get_array_of_pixels(surf, arr_pixels);
// double diag = sqrt(width * width + height * height);
@@ -522,10 +635,10 @@ void get_max_points_rect(SDL_Surface* surf, double *corners_x, double *corners_y
/*
for (int i = 0; i < 4; i++)
{
- printf("%f,%f\n", dest_x[i], dest_y[i]);
+ printf("%f,%f\n", corners_x[i], corners_y[i]);
}
- */
- /*
+
+
struct list* point_x = list_new();
struct list* point_y = list_new();
point_x = list_insert_head(point_x, dest_x[0]);
@@ -539,7 +652,7 @@ void get_max_points_rect(SDL_Surface* surf, double *corners_x, double *corners_y
draw_points_on_window(point_x, point_y, surf);
*/
// TMP - Cell extraction
- TMP_extremes_lines_and_cell_extraction(surf, corners_x, corners_y);
+ // TMP_extremes_lines_and_cell_extraction(surf, corners_x, corners_y);
// DEBUG
/*
@@ -557,6 +670,7 @@ void get_max_points_rect(SDL_Surface* surf, double *corners_x, double *corners_y
*/
// Frees memory.
+ free(arr_pixels);
list_destroy(shape_point_x);
list_destroy(shape_point_y);
}
\ No newline at end of file
diff --git a/grid_processing/contour_manager.h b/grid_processing/contour_manager.h
index 323d42da5..6195f0098 100644
--- a/grid_processing/contour_manager.h
+++ b/grid_processing/contour_manager.h
@@ -21,15 +21,29 @@
#define ANSI_COLOR_RESET "\x1b[0m"
// ========================
+#include
+#include
+
+typedef struct {
+ double x;
+ double y;
+} Point;
+
void convex_hull(struct list* point_x, struct list* point_y, struct list** dest_x, struct list** dest_y);
double get_polygon_area(struct list* point_x, struct list* point_y);
void get_points_max_shape(int width, int height, int *pixels, struct list** save_point_x, struct list** save_point_y);
+
+void find_corners_of_rectangle2(double* arr_x, double* arr_y, double *dest_x, double *dest_y, double size);
void find_corners_of_rectangle(double* arr_x, double* arr_y, double *dest_x, double *dest_y, double size);
// tmp
void TMP_extremes_lines_and_cell_extraction(SDL_Surface* surf, double corners_x[], double corners_y[]);
+double calculate_area(Point p1, Point p2, Point p3, Point p4);
+void find_largest_shape(Point arr[], int size, Point* largest_points);
void four_points(double arr_x[], double arr_y[], double dest_x[], double dest_y[], int size);
+
+void four_points2(double arr_x[], double arr_y[], double dest_x[], double dest_y[], int size);
void get_max_points_rect(SDL_Surface* surf, double *corners_x, double *corners_y);
diff --git a/grid_processing/grid.png b/grid_processing/grid.png
deleted file mode 100644
index db9f01b18..000000000
Binary files a/grid_processing/grid.png and /dev/null differ
diff --git a/grid_processing/grid_detection.c b/grid_processing/grid_detection.c
index b7c1c1da4..a79508272 100644
--- a/grid_processing/grid_detection.c
+++ b/grid_processing/grid_detection.c
@@ -291,22 +291,22 @@ void get_intersections(double w, double h, double diag, struct list* list_rho,
/// @param width Width of surface.
/// @param height Height of surface.
/// @return nothing.
-void get_good_points(struct list* point_x, struct list* point_y, struct list** dest_x, struct list** dest_y, double width, double height)
+void get_good_points(struct list* point_x, struct list* point_y, struct list** dest_x, struct list** dest_y, double width, double height, int NB_CELLS)
{
- double hypo_width_cell = width / 9;
- double hypo_height_cell = height / 9;
+ double hypo_width_cell = width / NB_CELLS;
+ double hypo_height_cell = height / NB_CELLS;
double threshold = hypo_width_cell / 3;
- double hypo_grid_x[9];
- double hypo_grid_y[9];
+ double hypo_grid_x[NB_CELLS];
+ double hypo_grid_y[NB_CELLS];
- for (int j = 0; j < 9; j++)
+ for (int j = 0; j < NB_CELLS; j++)
{
hypo_grid_x[j] = j * hypo_width_cell;
}
- for (int i = 0; i < 9; i++)
+ for (int i = 0; i < NB_CELLS; i++)
{
hypo_grid_y[i] = i * hypo_height_cell;
}
@@ -316,9 +316,9 @@ void get_good_points(struct list* point_x, struct list* point_y, struct list** d
double *real_grid_x = list_to_array(point_x);
double *real_grid_y = list_to_array(point_y);
- for (int y = 0; y < 9; y++)
+ for (int y = 0; y < NB_CELLS; y++)
{
- for (int x = 0; x < 9; x++)
+ for (int x = 0; x < NB_CELLS; x++)
{
double hypo_x = hypo_grid_x[x];
double hypo_y = hypo_grid_y[y];
@@ -347,38 +347,67 @@ void get_good_points(struct list* point_x, struct list* point_y, struct list** d
}
}
+/// @brief Convert small squared surface to a 24x24 pixels surface
+///
+/// \param surf The surface to convert.
+/// \param dst_width The width of the destination image.
+/// \param dst_height The height of the destination image.
+/// \return The resized surface.
+SDL_Surface *convert_surface(SDL_Surface* surf, int dst_width, int dst_height)
+{
+ // Removes the contours on the image.
+ //SDL_Surface* surf_contour = SDL_CreateRGBSurfaceWithFormat(0, surf->w, surf->h, 32, SDL_PIXELFORMAT_RGBA32);
+ //upgrade_exploitation(surf, &surf_contour);
+
+ // Resizes image to a new surface.
+ SDL_Surface* resized_surf = SDL_CreateRGBSurfaceWithFormat(0, dst_width, dst_height, 32, SDL_PIXELFORMAT_RGBA32);
+ SDL_BlitScaled(surf, NULL, resized_surf, NULL);
+ //SDL_FreeSurface(surf_contour);
+
+ // Returns a new created surface.
+ return resized_surf;
+}
+
/// @brief Extracts cells and put them in files.
///
/// @param list_x List of x coordinates (81 x coordinates).
/// @param list_y List of y coordinates (81 y coordinates).
/// @param surf Initial surface.
/// @return nothing.
-void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf)
+void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf, int NB_CELLS, SDL_Surface** ocr_eleven)
{
- double width = surf->w / 9;
- double height = surf->h / 9;
+ double width = surf->w / NB_CELLS;
+ double height = surf->h / NB_CELLS;
double *arr_x = list_to_array(list_x);
double *arr_y = list_to_array(list_y);
- for (int y = 0; y < 9; y++)
+ for (int y = 0; y < NB_CELLS; y++)
{
- for (int x = 0; x < 9; x++)
+ for (int x = 0; x < NB_CELLS; x++)
{
SDL_Rect rect;
rect.h = height;
rect.w = width;
- rect.x = arr_x[x + 9 * y];
- rect.y = arr_y[x + 9 * y];
+ rect.x = arr_x[x + NB_CELLS * y];
+ rect.y = arr_y[x + NB_CELLS * y];
+
+ SDL_Surface* square = SDL_CreateRGBSurfaceWithFormat(0, width, height, 32, SDL_PIXELFORMAT_RGBA32);
+ SDL_BlitSurface(surf, &rect, square, NULL);
- SDL_Surface* new_surf = SDL_CreateRGBSurfaceWithFormat(0, width, height, 32, SDL_PIXELFORMAT_RGBA32);
- SDL_BlitSurface(surf, &rect, new_surf, NULL);
+ // RESIZE IMAGES TO 24X24 AND REMOVES CONTOURS
+ // ==========================================
+ SDL_Surface* resized_square = convert_surface(square, 24, 24);
+ // ===========================================
- char filepath[100];
- snprintf(filepath, sizeof(filepath), "img/%i_%i.png", 8 - y, 8 - x);
- // IMG_SavePNG(new_surf, filepath);
+ // char filepath[100];
+ // snprintf(filepath, sizeof(filepath), "img/%i_%i.png", (NB_CELLS - 1) - y, (NB_CELLS - 1) - x);
+ // IMG_SavePNG(resized_square, filepath);
- SDL_FreeSurface(new_surf);
+ ocr_eleven[NB_CELLS * ((NB_CELLS - 1) - y) + ((NB_CELLS - 1) - x)] = resized_square;
+
+ // SDL_FreeSurface(square);
+ SDL_FreeSurface(resized_square);
}
}
}
@@ -389,7 +418,7 @@ void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf
/// @param list_theta Initial list of thetas.
/// @param surf_sudoku Surface from the image
/// @return nothing.
-void grid_detection(struct list* list_rho, struct list* list_theta, SDL_Surface* surf_sudoku)
+void grid_detection(struct list* list_rho, struct list* list_theta, SDL_Surface* surf_sudoku, int NB_CELLS, SDL_Surface** ocr_eleven)
{
// Parameters.
double width = surf_sudoku->w;
@@ -416,16 +445,15 @@ void grid_detection(struct list* list_rho, struct list* list_theta, SDL_Surface*
// ==========================================
struct list* final_grid_x = list_new();
struct list* final_grid_y = list_new();
- get_good_points(list_point_x, list_point_y, &final_grid_x, &final_grid_y, width, height);
+ get_good_points(list_point_x, list_point_y, &final_grid_x, &final_grid_y, width, height, NB_CELLS);
// ==========================================
// EXTRACTS CELLS - THE END
// ==========================================
- cell_extraction(final_grid_x, final_grid_y, surf_sudoku);
+ cell_extraction(final_grid_x, final_grid_y, surf_sudoku, NB_CELLS, ocr_eleven);
// ==========================================
-
// Frees memory.
list_destroy(list_rho_av);
list_destroy(list_theta_av);
diff --git a/grid_processing/grid_detection.h b/grid_processing/grid_detection.h
index 643eaf3ca..069e8dc4e 100644
--- a/grid_processing/grid_detection.h
+++ b/grid_processing/grid_detection.h
@@ -3,6 +3,7 @@
// Files.
// =====
+#include "img_upgrade.h"
#include "doubles_lists.h"
#include "basic_utilities.h"
#include "SDL_utilities.h"
@@ -20,9 +21,9 @@ void point_intersection(double surf_diag,
double rho1,double theta1, double rho2, double theta2, double* x, double* y);
void get_intersections(double w, double h, double diag, struct list* list_rho,
struct list* list_theta, struct list** list_point_x, struct list** list_point_y);
-void get_good_points(struct list* point_x, struct list* point_y,
- struct list** dest_x, struct list** dest_y, double width, double height);
-void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf);
-void grid_detection(struct list* list_rho, struct list* list_theta, SDL_Surface* surf_sudoku);
+void get_good_points(struct list* point_x, struct list* point_y, struct list** dest_x, struct list** dest_y, double width, double height, int NB_CELLS);
+SDL_Surface *convert_surface(SDL_Surface* surf, int dst_width, int dst_height);
+void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf, int NB_CELLS, SDL_Surface** ocr_eleven);
+void grid_detection(struct list* list_rho, struct list* list_theta, SDL_Surface* surf_sudoku, int NB_CELLS, SDL_Surface** ocr_eleven);
#endif
\ No newline at end of file
diff --git a/grid_processing/hex.jpg b/grid_processing/hex.jpg
new file mode 100644
index 000000000..d9bf75eb6
Binary files /dev/null and b/grid_processing/hex.jpg differ
diff --git a/grid_processing/hough_transform.c b/grid_processing/hough_transform.c
index ec634b2e3..4f76d054e 100644
--- a/grid_processing/hough_transform.c
+++ b/grid_processing/hough_transform.c
@@ -17,7 +17,7 @@ void hough_transform(SDL_Surface* surf, struct list** list_theta, struct list**
// Initializes a new matrix of bits (0 or 1).
// And gets array of 0 and 1 from a surface.
- int pixel_array[width * height];
+ int *pixel_array = calloc(width * height, sizeof(int));
// Gets the array of pixels from the surface.
get_array_of_pixels(surf, pixel_array);
@@ -115,4 +115,5 @@ void hough_transform(SDL_Surface* surf, struct list** list_theta, struct list**
// Frees memory.
free(accumulator);
+ free(pixel_array);
}
\ No newline at end of file
diff --git a/grid_processing/img/black_grid.png b/grid_processing/img/black_grid.png
deleted file mode 100644
index 089757875..000000000
Binary files a/grid_processing/img/black_grid.png and /dev/null differ
diff --git a/grid_processing/img/grid_test1.png b/grid_processing/img/grid_test1.png
deleted file mode 100644
index b3e9e7195..000000000
Binary files a/grid_processing/img/grid_test1.png and /dev/null differ
diff --git a/grid_processing/img_upgrade.c b/grid_processing/img_upgrade.c
index cf6346e80..89d745e2b 100644
--- a/grid_processing/img_upgrade.c
+++ b/grid_processing/img_upgrade.c
@@ -154,7 +154,7 @@ int fill_top(int width, int height, int* pixels)
//
//
//
-int fill_bottom(int width, int height, int* pixels)
+void fill_bottom(int width, int height, int* pixels)
{
// Inits constants.
int min_zone = width / 3;
@@ -164,8 +164,6 @@ int fill_bottom(int width, int height, int* pixels)
// Saves the last line that has been detected.
int last_line = height - 1;
- int cpt = 0;
-
// For only the third part.
for (int i = height - 1; i > 2 * height / 3; i--)
{
@@ -187,8 +185,8 @@ int fill_bottom(int width, int height, int* pixels)
{
for (int j_tmp = 0; j_tmp < width; j_tmp++)
{
+ // printf("%i, %i, %i\n", j_tmp + width * i_tmp, width, height * width);
pixels[j_tmp + width * i_tmp] = 0;
- cpt++;
}
}
@@ -196,11 +194,8 @@ int fill_bottom(int width, int height, int* pixels)
last_line = i;
}
}
-
- return cpt;
}
-
// Main function to upgrade image.
//
// surf: initial surface.
@@ -211,7 +206,9 @@ void upgrade_exploitation(SDL_Surface* surf, SDL_Surface** dest)
// Init.
int width = surf->w;
int height = surf->h;
- int pixels[width * height];
+ int* pixels = malloc(width * height * sizeof(int));
+ if (pixels == NULL)
+ return;
// Converts surface into array.
get_array_of_pixels(surf, pixels);
@@ -233,4 +230,6 @@ void upgrade_exploitation(SDL_Surface* surf, SDL_Surface** dest)
// Saves surface.
*dest = array_to_surface(width, height, pixels);
+
+ free(pixels);
}
\ No newline at end of file
diff --git a/grid_processing/img_upgrade.h b/grid_processing/img_upgrade.h
index 32b34a9af..a953871cd 100644
--- a/grid_processing/img_upgrade.h
+++ b/grid_processing/img_upgrade.h
@@ -23,7 +23,7 @@
int fill_left(int width, int height, int* pixels);
int fill_right(int width, int height, int* pixels);
int fill_top(int width, int height, int* pixels);
-int fill_bottom(int width, int height, int* pixels);
+void fill_bottom(int width, int height, int* pixels);
void upgrade_exploitation(SDL_Surface* surf, SDL_Surface** dest);
#endif
\ No newline at end of file
diff --git a/grid_processing/main.c b/grid_processing/main.c
index 2a2e931c5..794e95ec7 100644
--- a/grid_processing/main.c
+++ b/grid_processing/main.c
@@ -11,11 +11,11 @@ int main(int argc, char** argv)
if (argc != 2)
errx(EXIT_FAILURE, "Usage: image-path");
-
// INIT - GET IMAGE
// ====================================================
// Creates a new surface from the image in parameter.
SDL_Surface* surf_img = load_image(argv[1]);
+
// Checks if there is any error with the image.
if (surf_img == NULL)
errx(EXIT_FAILURE, "%s", SDL_GetError());
@@ -25,7 +25,6 @@ int main(int argc, char** argv)
SDL_FreeSurface(surf_img);
// ====================================================
-
// UPGRADE IMAGE - REMOVE PARASITES
// ====================================================
SDL_Surface* surf = SDL_CreateRGBSurfaceWithFormat(0, surf_wait->w, surf_wait->h, 32, SDL_PIXELFORMAT_RGBA32);
@@ -46,11 +45,9 @@ int main(int argc, char** argv)
double corners_x[4];
double corners_y[4];
// Gets the coordinates of the four corners of sudoku.
- get_max_points_rect(surf_wait, corners_x, corners_y);
- // ====================================================
+ get_max_points_rect(surf, corners_x, corners_y);
- // tmp
- return 0;
+ // ====================================================
// ROTATION AND NEW SQUARED SURFACE WITH ONLY SUDOKU
// ONLY FOR ORIENTED SUDOKU
@@ -60,7 +57,6 @@ int main(int argc, char** argv)
// ..
// ====================================================
-
// HOUGH TRANSFORM - LINES DETECTION
// ====================================================
struct list* list_rho = list_new();
@@ -69,18 +65,26 @@ int main(int argc, char** argv)
hough_transform(surf, &list_theta, &list_rho, 2.1);
// ====================================================
-
// MAXIMUM DETECTION - MATRIX PERSPECTIVE TRANSFORM - CELLS EXTRACTION
// ====================================================
- grid_detection(list_rho, list_theta, surf);
+ int NB_CELLS = 9;
+ SDL_Surface** ocr_eleven = calloc(NB_CELLS * NB_CELLS, sizeof(SDL_Surface*));
+ grid_detection(list_rho, list_theta, surf, NB_CELLS, ocr_eleven);
// ====================================================
-
// Frees memory.
SDL_FreeSurface(surf);
list_destroy(list_rho);
list_destroy(list_theta);
+ for (int i = 0; i < NB_CELLS * NB_CELLS; i++)
+ {
+ // printf("%p\n", ocr_eleven[i]);
+ SDL_FreeSurface(ocr_eleven[i]);
+ }
+
+ free(ocr_eleven);
+
// End.
return EXIT_SUCCESS;
}
\ No newline at end of file
diff --git a/grid_processing/sudoku_grid.png b/grid_processing/sudoku_grid.png
deleted file mode 100644
index 1304449b3..000000000
Binary files a/grid_processing/sudoku_grid.png and /dev/null differ