Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2020, 01:00   #1
Slavchik452
 
Регистрация: 09.06.2020
Сообщений: 7
По умолчанию Алгоритм со списком активных рёбер

Нужна помощь в написании Алгоритма заполнения многоугольника со списком активных рёбер. Написать нужно алгоритм для заполнения фигуры тор. Что не так в моём коде?
Код:
procedure FillFacetW2(F: tFacet; VL: tVertList; C: tPixel; z0: float);
{ Алгоритм со списком активных рёбер}
type
   tEdge = record
      topV: tVertex; 
      lowV: tVertex;
   end;    
var
   i, j, k, y, countP, countE, testedE, ycurrent, lastActiveE, firstActiveE, m: integer;
   ymin, ymax: integer;
   ix1, ix2: integer;
   x: double;
   Points: array [1..5] of integer;
   buf: tEdge;
   edge: array of tEdge; 
begin
   SetLength(edge, F.nv + 1); //F.nv = 4
   {Наименьшее и наибольшее y}
   ymin := VL[F.v[1]].ys;
   ymax := ymin;
   for i := 1 to F.nv - 1  do
      if VL[F.v[i]].ys < ymin then
         ymin := VL[F.v[i]].ys
      else 
      if ymax < VL[F.v[i]].ys then
         ymax := VL[F.v[i]].ys;
         
   countE := 1;      
   {заполняем массив ребер, записывая сначала верхнюю вершину(меньшую по y), затем нижнюю(большую по y)}
   for i:= 1 to F.nv - 1 do begin
       if VL[F.v[i]].ys <> VL[F.v[(i + 1)]].ys then begin
         if VL[F.v[i]].ys < VL[F.v[(i + 1)]].ys then begin
            edge[countE].topV  := VL[F.v[i]];
            edge[countE].lowV := VL[F.v[(i + 1)  ]];
         end
         else begin
            edge[countE].topV  := VL[F.v[(i + 1)]];
            edge[countE].lowV := VL[F.v[i]];
         end;
         countE := countE + 1;
       end;        
    end;
    //end;  
   {Сортируем ребра по y}
   for i := 1 to countE - 1 do begin //edge[1..
      buf := edge[i];
      j := i;
      while (j > 1) and (edge[j - 1].topV.ys > buf.topV.ys) do begin
         edge[j] := edge[j - 1];
         j := j - 1; 
      end;
      edge[j] := buf;
   end;
   
   testedE := 1;
   firstActiveE := 1;
   lastActiveE := 1;
   {Цикл закраски}
   for i := ymin to ymax do begin
      ycurrent := i;
      {Список активных ребер}
      while (testedE < countE) and (edge[testedE].topV.ys <= ycurrent) do
         testedE := testedE + 1;
      lastActiveE := testedE - 1;
      countP := 1;
      j := firstActiveE;
      while j <= lastActiveE do begin
         {Нахождение точек пересечения}
         {x := (ycurrent - edge[j].topV.ys) * (edge[j].lowV.xs - edge[j].topV.xs) / 
              (edge[j].lowV.ys - edge[j].topV.ys) + edge[j].topV.xs;}
         x:= (edge[j].lowV.xs * edge[j].topV.ys - edge[j].topV.xs * edge[j].lowV.ys - 
             (edge[j].lowV.xs - edge[j].topV.xs)* ycurrent)/(edge[j].topV.ys - edge[j].lowV.ys);
         Points[countP] := trunc(x);
         countP := countP + 1;
         {Исключение неактивных рёбер}
         if edge[j].lowV.ys <= ycurrent then begin
            edge[j] := edge[firstActiveE];
            firstActiveE := firstActiveE + 1;
         end;
         j := j + 1;
      end;
      {сортировка точек}
      for m := 1 to countP - 1  do begin
         x := Points[m];
         j := m;
         while (j > 1) and (x < Points[j - 1]) do begin
            Points[j] := Points[j - 1];
            j := j - 1; 
         end;
         Points[j] := trunc(x);
      end;
      {Заполняем строки}
      j:= 1;
      while j < (countP - 1) do begin
         HLine(Points[j], ycurrent, Points[j + 1]);
         j:= j + 2;
      end;       
   end;
end;

Последний раз редактировалось Slavchik452; 09.06.2020 в 11:55.
Slavchik452 вне форума Ответить с цитированием
Старый 09.06.2020, 11:56   #2
Slavchik452
 
Регистрация: 09.06.2020
Сообщений: 7
По умолчанию

Вот архив с исходниками
Вложения
Тип файла: 7z TOR_ACTIVE_EDGES.7z (25.5 Кб, 2 просмотров)
Slavchik452 вне форума Ответить с цитированием
Старый 10.06.2020, 13:53   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Архив с исходниками это гораздо лучше, чем просто кусок кода. А как вы оцениваете, что что-то не так? Вроде вполне красивый бублик рисуется.
Изображения
Тип файла: png бублик.png (33.1 Кб, 26 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 12.06.2020, 00:22   #4
Slavchik452
 
Регистрация: 09.06.2020
Сообщений: 7
По умолчанию

Видимо скинул не тот архив
Вложения
Тип файла: 7z TOR_ACTIVE_EDGES.7z (28.4 Кб, 3 просмотров)
Slavchik452 вне форума Ответить с цитированием
Старый 12.06.2020, 00:24   #5
Slavchik452
 
Регистрация: 09.06.2020
Сообщений: 7
По умолчанию

На данной кратинке что вы показали, используется YX-алгоритм, а нужен алгоритм со списком активных рёбер
Slavchik452 вне форума Ответить с цитированием
Старый 14.06.2020, 07:39   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Глубину нужно тоже как-то учесть. Так как сейчас "задние" грани, рисующиеся позже, перетирают "передние".
Изображения
Тип файла: png бублик.png (30.4 Кб, 18 просмотров)
Вложения
Тип файла: txt ActiveEdges.txt (5.7 Кб, 2 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.06.2020, 11:40   #7
Slavchik452
 
Регистрация: 09.06.2020
Сообщений: 7
По умолчанию

BDA, Спасибо огромное, а как здесь её учесть?
Slavchik452 вне форума Ответить с цитированием
Старый 14.06.2020, 12:39   #8
Slavchik452
 
Регистрация: 09.06.2020
Сообщений: 7
По умолчанию

BDA, И с чем это связано? Потому как призму хорошо рисует данный алгоритм. Как я думаю тут проблема с удалением невидимых граней.
Изображения
Тип файла: png 2020-06-14_12-29-22.png (11.7 Кб, 18 просмотров)
Slavchik452 вне форума Ответить с цитированием
Старый 15.06.2020, 01:51   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от Slavchik452 Посмотреть сообщение
как здесь её учесть?
Не знаю.
Цитата:
Сообщение от Slavchik452 Посмотреть сообщение
призму хорошо рисует
Если судить по цвету призмы и тора, то рисуется изнанка тора.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.06.2020, 00:26   #10
Slavchik452
 
Регистрация: 09.06.2020
Сообщений: 7
По умолчанию

BDA, Разобрался с ошибкой, нужно было правильно заполнить z-буфер. Благодарю за помощь, очень помогли)
Slavchik452 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C#] Расчёт веса прямоугольного параллелепипеда, если заданы длинны его рёбер, а также удельный вес его материала. ilysha_oz Помощь студентам 2 18.09.2017 12:51
Разрывающее множество вершин и рёбер C# Александр9521 C# (си шарп) 0 24.01.2016 20:51
Удаление рёбер средствами WinApi Best1501 Win Api 2 06.12.2011 01:28
длинны рёбер прямоугольного параллелепипета. zetr0 Помощь студентам 2 10.10.2010 23:22