Где стандартные реализации C алгоритма отсечения полигонов Сазерленда-Ходжмана? - PullRequest
2 голосов
/ 23 июня 2010

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

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

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, или реализации в стандартно используемой библиотеке / графической библиотеке с видимым использованием.

1 Ответ

0 голосов
/ 23 июня 2010

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

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

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

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

...