������ 3D �������
2.4. ��������� ������������ ������������

��� ��������� ����, ��� �������� ������� ����� ������ �����������, ������ ����� � 3D ������� ���� �� �����. ������� ��� ����������.

������� ����� �����������. ��� ����������� �� ������ - ����� �������������� ��������, ������ ��-�� ����, ��� ����������� - ������ ��������, ������ ������ ������ ������������� �� ����� ������ �������. ������� ���������� �������� �� ���� ������� ������, � �������� ������������ ����������� (�� ����, �� ������������ �� ������������� �������� y ��� ������ ������������), � ���������� ��������������� �������������� �������.

������� (illu/illu24a.gif) ������� (illu/illu24b.gif)

����������� ������� ���, ����� ������� A ���� �������, C - ������, ����� � ��� min_y = A.y, max_y = C.y, � ��� ���� �������� �� ���� ������ �� min_y �� max_y. ���������� �����-�� ����� sy, A.y <= sy <= C.y. ���� sy < B.y, �� ��� ���������� ������� AB � AC; ���� sy >= B.y - �� ������� BC � AC. �� ����� ���������� ���� ������, ������� �� ����� �������� ��������� ������ � ����� ����������� ������ ������� � ������ y = sy. ������� ��� ����� �������. ��� ��� �� �� �����, ����� �� ��� �����, � ����� ������, ������� �� ���������� �� x � �������� ��������, ���� ����. ������ ���� �������, ��������� ��������� ��� ������ ������ - � �����, ����������� ���������.

����������� ����� �������� �� ���������� ����������� ������ y = sy (������� ������) � ������� ������������, �������� AB. ������� ��������� ������ AB � ����� x = k*y+b:

x = A.x+(y-A.y)*(B.x-A.x)/(B.y-A.y)

����������� ���� ��������� ��� ������� ������ �������� y = sy:

x = A.x+(sy-A.y)*(B.x-A.x)/(B.y-A.y)

���, � �����-��, � ���. ��� ������ ������ ����������� ������ ���������� ����� ��� ��. � ��� � ������ ����.

// ...
// ����� ��������� ������� (A,B,C)
// ...
for (sy = A.y; sy <= C.y; sy++) {
  x1 = A.x + (sy - A.y) * (C.x - A.x) / (C.y - A.y);
  if (sy < B.y)
    x2 = A.x + (sy - A.y) * (B.x - A.x) / (B.y - A.y);
  else
    x2 = B.x + (sy - B.y) * (C.x - B.x) / (C.y - B.y);
  if (x1 > x2) { tmp = x1; x1 = x2; x2 = tmp; }
  drawHorizontalLine(sy, x1, x2);
}
// ...

����, ������, ���������� �� ������, ����� B.y = C.y - � ���� (� ������ ����, ������ ��� ���� C.y = A.y, �� ����������� ������ � �������� ��� �� �����, ��� ����� �������� �������������� �����; � ���� B.y = A.y, �� sy >= A.y � �� ������� �� B.y - A.y �� ������) ������ ���������� ������� ������� �� ����. ��� ��������� ������ ����-����:

// ...
// ����� ��������� ������� (A,B,C)
// ...
for (sy = A.y; sy <= C.y; sy++) {
  x1 = A.x + (sy - A.y) * (C.x - A.x) / (C.y - A.y);
  if (sy < B.y)
    x2 = A.x + (sy - A.y) * (B.x - A.x) / (B.y - A.y);
  else {
    if (C.y == B.y)
      x2 = B.x;
    else
      x2 = B.x + (sy - B.y) * (C.x - B.x) / (C.y - B.y);
  }
  if (x1 > x2) { tmp = x1; x1 = x2; x2 = tmp; }
  drawHorizontalLine(sy, x1, x2);
}
// ...

��� � ���. ��, �������������� �����, �������, ���������� ������ ��� ��������.



 � ����� ������


demo.design
3D programming FAQ