Я реализовал свою версию алгоритма отсечения полигонов Сазерленда-Ходжмана, но я считаю, что моя реализация могла бы быть лучше. Поэтому мне интересно, есть ли стандартная реализация.
Вот моя реализация
bool shclip(stPt** verts, int *n, float left, float right, float bottom, float top)
{
if (leftclip(verts, n, left) &&
rightclip(verts, n, right) &&
bottomclip(verts, n, bottom) &&
topclip(verts, n, top))
return true;
else
return false;
}
bool leftclip(stPt** verts, int *n, float left)
{
int v1, v2;
float x1, x2, y1, y2;
float relx, rely;
v1 = v2 = 0;
while (v1 < *n) {
x1 = ((*verts)[v1]).x;
x2 = ((*verts)[(v1 + 1) % *n]).x;
if (x1 < left) {
if (x2 > left) {
y1 = ((*verts)[v1]).y; y2 = ((*verts)[(v1 + 1) % *n]).y;
relx = x2 - x1; rely = y2 - y1;
nverts1[v2].y = (left - x1) * rely / relx + y1;
nverts1[v2].x = left;
nverts1[v2+1].y = ((*verts)[(v1 + 1) % *n]).y;
nverts1[v2+1].x = ((*verts)[(v1 + 1) % *n]).x;
v2 += 2;
}
} else {
if (x2 > left) {
nverts1[v2].x = ((*verts)[(v1 + 1) % *n]).x; nverts1[v2].y = ((*verts)[(v1 + 1) % *n]).y;
v2++;
} else {
y1 = ((*verts)[v1]).y; y2 = ((*verts)[(v1 + 1) % *n]).y;
relx = x2 - x1; rely = y2 - y1;
nverts1[v2].y = (left - x1) * rely / relx + y1;
nverts1[v2].x = left;
v2++;
}
}
v1++;
}
if (v2 != 0) {
*n = v2;
(*verts) = nverts1;
return true;
} else
return false;
}
Спасибо.
EDIT
1 Кажется, я не понимаю алгоритм, потому что мой учебник не объясняет его четко. Я посмотрел на оригинальный тезис, но не смог понять его.
2 Код, который я написал, , а не отступление.
3 Я передаю вершины между двумя клипсаторами путем копирования из одного массива вершин в другой массив вершин, который не эффективен. Я думал, что мог бы использовать список ссылок или что-то, что намного лучше структуры данных для алгоритма.
4 То, что я имею в виду под «стандартной реализацией», лучше понимать как код, реализуемый разработчиком алгоритма, например, nicholl-lee-nicholl, или реализации в стандартно используемой библиотеке / графической библиотеке с видимым использованием.