
УДАЛЕНИЕ НЕВИДИМЫХ ЛИНИЙ И ПОВЕРХНОСТЕЙ
103
Рассмотрим сначала построение графика функции в виде набора линий,
соответствующих постоянным значениям у, считая, что углы ϕ и ψ подобраны таким образом,
что при y
1
< y
2
плоскость у = y
1
расположена ближе к картинной плоскости, чем плоскость у
= у
2
.
Заметим, что каждая линия семейства z = f(x, y
i
) лежит в своей плоскости у = y
i
,
причем все эти плоскости параллельны и, следовательно, не могут пересекаться. Из этого
следует, что при y
j
> y
i
линия z = f(x, y
j
) не может закрывать линию z = f(x, у
i
).
Тогда возможен следующий алгоритм построения графика функции z = f(x, y): линии
рисуются в порядке удаления (возрастания у) и при рисовании очередной линии рисуется
только та ее часть, которая не закрывается ранее нарисованными линиями.
Такой алгоритм называется методом плавающего горизонта.
Для определения частей линии z = f(x, y
k
), которые не закрывают ранее нарисованные
линии, вводятся так называемые линии горизонта, или контурные линии.
Пусть проекцией линии z = f(x, y
k
) на картинную плоскость является линия Y = Y
k
(X),
где (X, Y) координаты на картинной плоскости, причем Y соответствует вертикальной
координате. Контурные линии )(
max
XY
k
и )(
min
XY
k
определяются следующими соотношениями:
).(min)(
),(max)(
11
min
11
max
XYXY
XYXY
i
ki
k
i
ki
k
−≤≤
−≤≤
=
=
На экране рисуются только те части линии Y = Y
k
(X), которые находятся выше линии
)(
max
XY
k
или ниже линии )(
min
XY
k
.
Одной из наиболее простых и эффективных реализаций данного
метода является растровая реализация, при которой в области задания
исходной функции вводится сетка
21
,...,1,,...,1,, njniyx
ji
==
и каждая из линий Y = Y
k
(X) представляется в виде ломаной. Для
рисования сегментов этой ломаной используется модифицированный
алгоритм Брезенхейма, который перед выводом очередного пиксела
сравнивает его ординату с верхней и нижней контурными линиями,
представляющими из себя в этом случае массивы значений
ординат.
Замечание
Случай отрезков с угловым коэффициентом большим 1 требует
специальной обработки (для того, чтобы не появлялись выпадающие
пикселы (рис. 2).
Реализация этого алгоритма приведена на следующем листинге.
// File example1.cpp
#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <process.h>
#include <stdio.h>
#include <stdlib.h>
#define NO_VALUE 7777
struct Point2 // screen point
{
int x, y;
};
int YMax [640];
int YMin [640];