C ++ - компьютерный графический алгоритм средней точки с восьмым октантом - PullRequest
0 голосов
/ 28 мая 2018

У меня проблема с реализацией алгоритма средней точки с восьмым октантом.Текущая ситуация показана на рисунке ниже, когда ось Y инвертирована.

enter image description here

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

здесь мой код для зоны 1

void Line2D::MPOct1(const Window& window, const Point2D& start,
const Point2D& end, const float& delta_x, const float& delta_y) const
{
  Color color = mStartVtx.GetColor();

  int int_delta_x = static_cast<int>(round(delta_x));
  int int_delta_y = static_cast<int>(round(delta_y));

  int start_x = static_cast<int>(round(start.GetX()));
  int start_y = static_cast<int>(round(start.GetY()));
  int const end_x = static_cast<int>(round(end.GetX()));

  int f = 2 * int_delta_y - int_delta_x;
  int f_e = 2 * int_delta_y ;
  // should be se due to y axis inverted
  int f_ne = 2 * int_delta_y + 2 * int_delta_x;

  while (start_x <= end_x )
  {
      if (f >= 0)
      {
          window.SetPixel(start_x, start_y, color);
          f += f_e;
          start_x ++;
      }
      else
      {
          window.SetPixel(start_x, start_y, color);
          f += f_ne;
          start_x ++;
          // y axis inveted so --
          start_y --;
      }
  }

}

по умолчанию задан параметр решения 2deltaY -deltaX, и я предполагаю, что направление 8:

east = 2deltaY
west = -2deltaY
north = 2deltaX (-2deltaX due to inverse of y axis)
south = -2deltaX (2deltaX due to inverse of y axis)
north-east = 2deltaY -2deltaX (2deltaY +2deltaX due to inverse of y axis )
north-west = -2deltaY -2deltaX (-2deltaY +2deltaX due to inverse of y axis )
south-east = 2deltaY +2deltaX (2deltaY -2deltaX due to inverse of y axis )
south-west = -2deltaY +2deltaX (-2deltaY -2deltaX due to inverse of y axis )

любой может сказать мне, как решить другую октавную зону, манипулируя обновлением, которое мне удается сделать зоной 14,5 и 8 работы

1 Ответ

0 голосов
/ 29 мая 2018

1) Обработайте вертикальные и горизонтальные линии специальными функциями
2) Создайте две функции - F1 для первого октанта (где x изменяется быстрее) и F2 для второго октанта (где y изменяется быстрее)
3)Получить абсолютные значения дельты, такие как DeltaX = Abs(X2 - X1)
4) Получить направление шага, например XStep = (X2 - X1>0)?1:-1
5) Для 1,4,5,8 октантов использовать функцию F1 с дельтами и шагами (вместо start_x ++ make start_x += XStepи т.д.)
6) Для 2,3,6,7 октантов используется функция F2, с дельтами и шагами

...