From 5d98c7e88e97da22440d78af2dcce1082030b878 Mon Sep 17 00:00:00 2001 From: antifallobst Date: Tue, 21 Mar 2023 12:39:30 +0100 Subject: [PATCH] implemented the forward energy improvement --- main.c | 60 ++++++++++++++++++++++++++++++++++++++++--------- paris_mask.png | Bin 7742 -> 7482 bytes 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/main.c b/main.c index f25aa07..9a7bb1c 100644 --- a/main.c +++ b/main.c @@ -68,6 +68,7 @@ void image_destruct(image_T* image) { void image_calculate_dist_buffer(image_T* image) { memset(image->dist_buffer, 0, image->width * sizeof(distance_T)); + uint32_t* mask_row = &image->mask_buffer[image->width]; uint32_t* last_row = image->buffer; uint32_t* pixel_row = &last_row[image->width]; distance_T* dist_last_row = image->dist_buffer; @@ -75,22 +76,57 @@ void image_calculate_dist_buffer(image_T* image) { for (int y = 1; y < image->new_height; y++) { for (int x = 0; x < image->new_width; x++) { - uint32_t pixel = pixel_row[x]; +// uint32_t pixel = pixel_row[x]; +// +// distance_T shortest_dist; +// bool found_dist = false; +// for (int i = (x > 0 ? -1 : 0); i < (x < image->new_width-1 ? 2 : 1); i++) { +// int32_t dist = 0; +// dist += pixel_distance(pixel, last_row[x + i], image->mask_buffer[(y * image->width) + x + i]); +// dist += dist_last_row[x + i].distance; +// +// if (!found_dist || shortest_dist.distance > dist) { +// shortest_dist = (distance_T){dist, (int8_t)i}; +// found_dist = true; +// } +// } + + int32_t dist; distance_T shortest_dist; - bool found_dist = false; - for (int i = (x > 0 ? -1 : 0); i < (x < image->new_width-1 ? 2 : 1); i++) { - int32_t dist = pixel_distance(pixel, last_row[x + i], image->mask_buffer[(y * image->width) + x + i]) + dist_last_row[x + i].distance; - if (!found_dist || shortest_dist.distance > dist) { - shortest_dist = (distance_T){dist, (int8_t)i}; - found_dist = true; + if (x > 0) { + dist = 0; + dist += dist_last_row[x - 1].distance; + dist += pixel_distance(pixel_row[x - 1], pixel_row[x + 1], mask_row[x]); + dist += pixel_distance(last_row [x], pixel_row[x - 1], mask_row[x]); + + shortest_dist = (distance_T) {dist, -1}; + } + + dist = -10; + dist += dist_last_row[x].distance; + dist += pixel_distance(pixel_row[x - 1], pixel_row[x + 1], mask_row[x]); + + if (x == 0 || shortest_dist.distance > dist) { + shortest_dist = (distance_T) {dist, 0}; + } + + if (x < image->new_width-1) { + dist = 0; + dist += dist_last_row[x + 1].distance; + dist += pixel_distance(pixel_row[x - 1], pixel_row[x + 1], mask_row[x]); + dist += pixel_distance(last_row [x], pixel_row[x + 1], mask_row[x]); + + if (shortest_dist.distance > dist) { + shortest_dist = (distance_T) {dist, 1}; } } dist_pixel_row[x] = shortest_dist; } + mask_row = &mask_row[image->width]; last_row = pixel_row; pixel_row = &pixel_row[image->width]; dist_last_row = dist_pixel_row; @@ -118,7 +154,7 @@ uint32_t image_find_best_line(image_T* image) { void image_cut_line(image_T* image, uint32_t line_id) { uint32_t x = line_id; - for (uint32_t y = image->height-1; y > 0; y--) { + for (uint32_t y = image->new_height-1; y > 0; y--) { distance_T dist = image->dist_buffer[(image->width * y) + x]; x += dist.direction; memcpy(&image->buffer[(image->width * y) + x], &image->buffer[(image->width * y) + x + 1], (image->new_width - x) * sizeof(uint32_t)); @@ -156,7 +192,7 @@ void image_dump(image_T* image) { int main(int argc, char* argv[]) { printf("Line Cutter - Juniorcamp Informatik\n"); - image_T* image = image_load("../bench.png", "../bench_mask.png"); + image_T* image = image_load("../paris.png", "../paris_mask.png"); gfx_open(800, 600, "Juniorcamp Informatik - Line Cutter"); image_dump(image); @@ -167,8 +203,10 @@ int main(int argc, char* argv[]) { image_dump(image); switch (c) { case 's': { - image_calculate_dist_buffer(image); - image_cut_line(image, image_find_best_line(image)); + if (image->new_width > 0) { + image_calculate_dist_buffer(image); + image_cut_line(image, image_find_best_line(image)); + } break; } case 'q': { diff --git a/paris_mask.png b/paris_mask.png index 2970effdc1888795f306c5805089aa753c45c9cf..476f3d886112090a28afd0c9776bf3269dfadd9b 100644 GIT binary patch delta 2963 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