Improved connecting discontiguous corners

This commit is contained in:
Andrew Murray 2025-01-04 14:55:26 +11:00
parent ef223f52f7
commit d5b86c0c91
3 changed files with 27 additions and 33 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 533 B

After

Width:  |  Height:  |  Size: 533 B

View File

@ -1683,7 +1683,7 @@ def test_discontiguous_corners_polygon() -> None:
BLACK,
)
expected = os.path.join(IMAGES_PATH, "discontiguous_corners_polygon.png")
assert_image_similar_tofile(img, expected, 1)
assert_image_equal_tofile(img, expected)
def test_polygon2() -> None:

View File

@ -501,55 +501,49 @@ polygon_generic(
// Needed to draw consistent polygons
xx[j] = xx[j - 1];
j++;
} else if (current->dx != 0 && j % 2 == 1 &&
roundf(xx[j - 1]) == xx[j - 1]) {
} else if ((ymin == current->ymin || ymin == current->ymax) &&
current->dx != 0) {
// Connect discontiguous corners
for (k = 0; k < i; k++) {
Edge *other_edge = edge_table[k];
if ((current->dx > 0 && other_edge->dx <= 0) ||
(current->dx < 0 && other_edge->dx >= 0)) {
if ((ymin != other_edge->ymin && ymin != other_edge->ymax) ||
other_edge->dx == 0) {
continue;
}
// Check if the two edges join to make a corner
if (xx[j - 1] ==
(ymin - other_edge->y0) * other_edge->dx + other_edge->x0) {
if (roundf(xx[j - 1]) ==
roundf(
(ymin - other_edge->y0) * other_edge->dx +
other_edge->x0
)) {
// Determine points from the edges on the next row
// Or if this is the last row, check the previous row
int offset = ymin == ymax ? -1 : 1;
int offset = ymin == current->ymax ? -1 : 1;
adjacent_line_x =
(ymin + offset - current->y0) * current->dx +
current->x0;
adjacent_line_x_other_edge =
(ymin + offset - other_edge->y0) * other_edge->dx +
other_edge->x0;
if (ymin == current->ymax) {
if (current->dx > 0) {
xx[k] =
fmax(
if (ymin + offset >= other_edge->ymin &&
ymin + offset <= other_edge->ymax) {
adjacent_line_x_other_edge =
(ymin + offset - other_edge->y0) * other_edge->dx +
other_edge->x0;
if (xx[j - 1] > adjacent_line_x + 1 &&
xx[j - 1] > adjacent_line_x_other_edge + 1) {
xx[j - 1] =
roundf(fmax(
adjacent_line_x, adjacent_line_x_other_edge
) +
)) +
1;
} else {
xx[k] =
fmin(
} else if (xx[j - 1] < adjacent_line_x - 1 &&
xx[j - 1] < adjacent_line_x_other_edge - 1) {
xx[j - 1] =
roundf(fmin(
adjacent_line_x, adjacent_line_x_other_edge
) -
1;
}
} else {
if (current->dx > 0) {
xx[k] = fmin(
adjacent_line_x, adjacent_line_x_other_edge
);
} else {
xx[k] =
fmax(
adjacent_line_x, adjacent_line_x_other_edge
) +
)) -
1;
}
break;
}
break;
}
}
}