Где стандартные реализации C алгоритма отсечения многоугольников Сазерленда-Ходжмана?

Я реализовал свою версию алгоритма отсечения полигонов Сазерленда-Ходжмана, но я считаю, что моя реализация могла бы быть лучше. Поэтому мне интересно, есть ли стандартная реализация.

Вот моя реализация

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; 
}

Спасибо.

РЕДАКТИРОВАТЬ
1 Кажется, я не понимаю алгоритм, потому что мой учебник не объясняет его четко. Я посмотрел на оригинальный тезис, но не смог разобраться.

2 Код, который я написал, не повторяется.

3 Я передаю вершины между двумя клиперами путем копирования из одного массива вершин в другой массив вершин, что не эффективно. Я подумал, что мог бы использовать список ссылок или что-то, что является гораздо лучшей структурой данных для алгоритма.

4 Под «стандартной реализацией» я подразумеваю код, реализованный разработчиком алгоритма, например Николл-Ли-Николл, или реализации в широко используемой стандартной библиотеке/графической библиотеке.


person Jichao    schedule 23.06.2010    source источник


Ответы (1)


Что бы вы приняли за эталон? Должен ли он быть закодирован "известным человеком"? Или опубликованы в известном журнале, текстовом журнале или на сайте?

Существует несколько реализаций C, с которыми вы можете сравнить свою (и, конечно же, алгоритм широко опубликован). Ваш код выглядит нормально для меня. Что именно вам в нем не нравится?

Я не буду доказывать вам, что умею гуглить, так как уверен, что вы можете сделать это сами, кроме как сказать, что это выглядит как хорошая страница. Это часть диссертации в Технологическом институте Флориды, в которой объясняется алгоритм и приводится кодовый листинг, который кажется хорошим.

Опять же, если у вас есть какие-либо особые опасения по поводу вашего собственного кода, не могли бы вы указать на них? Это выглядит хорошо для меня.

person Mawg says reinstate Monica    schedule 23.06.2010