mirror of
https://github.com/buserror/mii_emu.git
synced 2024-11-25 20:33:52 +00:00
3fd0540a83
Changes are just too long to list... Signed-off-by: Michel Pollet <buserror@gmail.com>
47 lines
1.1 KiB
C
47 lines
1.1 KiB
C
/*
|
|
* c2_arrays.c
|
|
*
|
|
* Created on: 4 Feb 2023
|
|
* Author: michel
|
|
*/
|
|
|
|
#include "c2_arrays.h"
|
|
|
|
/*! Simplify array 'a' into 'b', return 1 if it was.
|
|
* This takes a list of rectangles 'a', duplicates are skipped. If two rectangles
|
|
* overlap, see if the union is 'worth' it. Returns results in array 'b'
|
|
* Returns 1 if the b array has been simplified somehow, zero if not
|
|
*/
|
|
int
|
|
c2_rect_array_simplify(
|
|
c2_rect_array_p a,
|
|
c2_rect_array_p b)
|
|
{
|
|
c2_rect_array_clear(b);
|
|
for (unsigned int i = 0; i < a->count; i++) {
|
|
int addit = 1;
|
|
c2_rect_p ra = &a->e[i];
|
|
for (unsigned int j = 0; j < b->count && addit; j++) {
|
|
c2_rect_p rb = &b->e[j];
|
|
if (c2_rect_equal(rb, ra)) { // already a copy here
|
|
addit = 0;
|
|
} else if (c2_rect_contains_rect(rb, ra)) {
|
|
addit = 0;
|
|
} else if (c2_rect_intersect_rect(rb, ra)) {
|
|
c2_rect_t o = *ra;
|
|
c2_rect_union(&o, rb);
|
|
long sa = c2_rect_surface_squared(ra);
|
|
long sb = c2_rect_surface_squared(rb);
|
|
long so = c2_rect_surface_squared(&o);
|
|
if (so <= (sa + sb)) {
|
|
*rb = o;
|
|
addit = 0;
|
|
}
|
|
}
|
|
}
|
|
if (addit)
|
|
c2_rect_array_add(b, *ra);
|
|
}
|
|
return b->count < a->count;
|
|
}
|