- •Закраска. (Растровая развертка сплошных областей (ррсо)).
- •Заполнение многоугольников.
- •Простой алгоритм закраски с упорядоченным списком ребер.
- •Алгоритм заполнения по ребрам.
- •Алгоритм заполнения по ребрам с перегородкой.
- •Алгоритм со списком ребер и флагом.
- •Алгоритмы заполнения (закраски) с затравкой.
- •Простой алгоритм закраски с затравкой
- •Построчный алгоритм закраски с затравкой.
- •Отсечение.
- •Двух мерное отсечение.
- •2: Отрезок невидим.
- •3: Переходим к следующему отрезку. Метод Коэна – Сазерленда.
- •Непараметрический способ.
- •Метод предложен Сазерлендом и Спрулом: «Метод разбиения отрезка средней точкой».
- •Отсечение произвольным окном (выпуклым).
- •Отсечение параметрически заданного отрезка прямоугольным регулярным окном (частный случай нерегулярного).
- •Алгоритм Кируса – Бека.
- •Внутреннее и внешнее отсечение.
- •Определение факта выпуклости окна. Метод переносов и поворотов.
- •Разрезание невыпуклого окна.
- •Разбиение невыпуклых многоугольников.
- •Форматы графических файлов.
- •Истинно черно-белые изображения в градациях серого.
- •Цветовые плоскости изображения.
- •Гарантия точности соответствия цветов.
- •Колориметрические стандарты.
Отсечение произвольным окном (выпуклым).
Пример нерегулярного окна, хотя оно и прямоугольное:

Отсечение параметрически заданного отрезка прямоугольным регулярным окном (частный случай нерегулярного).
Параметрическое описание отрезка: Р1(X1 ,Y1) и Р2(X2 ,Y2).
P(t)=P1+ (P2-P1)*t 0≤t≤1 (1)
Х(t)=Х1+ (Х2-Х1)*t 0≤t≤1 (2)
Y(t)=Y1+ (Y2-Y1)*t 0≤t≤1 (2)
t=( P(t) - P1)/( P2- P1)
Для левой: t=(Х(л) -Х1)/ (Х2 -Х1) 0≤t≤1
Для правой: t= (Х(п) -Х1)/ (Х2 -Х1) 0≤t≤1
Для верхней: t= (Y(в) -Y1)/ (Y2 -Y1) 0≤t≤1
Для нижней: t= (Y(н) -Y1)/ (Y2 -Y1) 0≤t≤1
Где Х(л) Х(п) Y(в) Y(н) – координаты левой, правой, верхней, нижней сторон окна.
Если решение этих уравнений дают параметр t, лежащий за пределами интервала 0≤t≤1, то такие решения отвергаются, так как они соответствуют точкам, лежащим вне исходного отрезка.
Пример:

Пересечения:
С левой: t=(Х(л) -Х1)/ (Х2 -Х1)=
=(-1-(-3/2))/(3/2-(-3/2))=1/6
С правой: t= (Х(п) -Х1)/ (Х2 -Х1)=
=(1-(-3/2))/(3/2-(-3/2))=5/6
С нижней: t= (Y(н) -Y1)/ (Y2 -Y1)=
=(-1-(-3/4))/(1/-(-3/4))=-1/5<0 поэтому отвергается
С верхней: t= (Y(в) -Y1)/ (Y2 -Y1)=
=(1-(-3/4))/(1/2-(-3/4))=7/5>1 поэтому отвергается
Видимый отрезок заключен в интервале: 1/6≤t≤5/6
При t=1/6 из уравнения (2):
Х(1/6)=-3/2+ (3/2-(-3/2))*1/6=-1
Y(1/6)=-3/4+ (1/2-(-3/4))*1/6=-13/24
При t=5/6 из уравнения (2):
Х(5/6)=-3/2+ (3/2-(-3/2))*5/6=1
Y(5/6)=-3/4+ (1/2-(-3/4))*5/6=7/24
Алгоритм Кируса – Бека.
Для понимания этого алгоритма нужно уметь определять, где находится точка, принадлежащая отрезку: внутри окна, на границе или за его пределам. Возьмем двумерную отсекающую область (выпуклую). Возьмем внутреннюю нормаль к произвольной точке «a», лежащей на границе этой области.

R
– выпуклая отсекающая область, nв
– внутренняя нормаль, nн
– наружная нормаль (
)
Внутренняя
нормаль
в произвольной точке «а», лежащей на
границеR,
удовлетворяет условию:
гдеb
– любая другая точка на границе R.
Скалярное
произведение
*
=
где
-меньший
из двух углов, образованных
и
.
если
=π/2,
то
=0
и
*
=0,
то есть когда скалярное произведение
двух
векторов
равно нулю эти
вектора взаимно перпендикулярны. Угол
между nв
и любым
вектором
всегда
принадлежит интервалу -π/2 до π/2,
>0.
Угол между внешней нормалью
и
любым вектором
=
π -
,
аcos(π
-
)=
-cos
<0.
Пример:

-
единичный вектор вдоль оси Х.
-
единичный вектор вдоль оси Y.
|
a |
b |
|
|
|
(0,2) |
(0,4) |
0 |
0 |
|
|
(4,4) |
4 |
-4 |
|
|
(8,4) |
8 |
-8 |
|
|
(8,2) |
8 |
-8 |
|
|
(8,0) |
8 |
-8 |
|
|
(4,0) |
4 |
-4 |
|
|
(0,0) |
0 |
0 |
ba=4i+2j
nв*ba=i*(4i+2j)=4
P(t)=P1+ (P2-P1)*t 0≤t≤1
f-
граничная точка выпуклой области R,
-
внутренняя нормаль к одной из ограничивающих
эту плоскость областей,
-
вектор из точкиf
в точку на отрезке Р1Р2.
Тогда для любой точки отрезка (то есть
для любого конкретного значения t)
из условия
<0
следует, что вектор из точкиf
на отрезок направлен во внешнюю к n
область.
И

следует,
что этот вектор (
)
попадает в точку отрезка, которая лежит
на границе окна.
Из
условия
следует, что этот вектор (
)
направлен внутрь окна.
Вывод: из скалярного произведения вектора нормали на вектор, опущенный из точки f в любую точку на отрезке можно найти параметр t , удовлетворяющий точке отрезка, лежащей на границе окна.
Если приравнять это скалярное произведение к нулю, то далее найдя параметр t, соответствующий этому условию можно определить координаты точки пересечения с окном, подставив t в параметрическое уравнение.
Пример:

1) Решаем уравнение прямой:
Х1 =-1 Y1 =9 Х2=1 Y2 =3
Y=Y1+ (X-X1)*m=1+(X-(-1))*1/5=X/5+6/5
m= (Y2-Y1)/ (X2-X1)=(3-1)/(9-(-1))1/5
2) Находим точки пересечения:
Хл=0 Yл=1/5*0+6/5=6/5
Хп=0 Yп=1/5*8+6/5=14/5
3) Решаем параметрическое уравнение:
P(t)=P1+ (P2-P1)*t =[-1 1]+[10 2]t
4) Преобразуем в векторную форму:
,
0≤t≤1
5) Возьмем четыре внутренних нормали:
![]()
![]()
6) Выбираем точку f в левом нижнем углу:
f(0,0),
тогда:
=(10t-1)
+(2t+1)
*
=10t-1.
7) Приравниваем скалярное произведение к нулю:
10t-1=0 t=1/10
8) Подставляем этот параметр в параметрическое уравнение:
P(1/10)=[-1 1]+[10 2]*1/10=[0 1,2]
Возьмем
точку f(8,4)
, тогда уравнение вектора
может быть получено простым смещением
по Х на 8 и поY
на 4:
=(10t-9)
+(2t-3)
*
=-(10t-9)=0
t=9/10
P(9/10)=[-1 1]+[10 2]*9/10=[8 2,8]
06.12.02
Лекция 13.

P(t)=P1+ (P2-P1)*t 0≤t≤1
P(t)=[1 1]+[7-1 3-1]t
P(t)=[1 1]+[6 2]t параметрическое уравнение.
|
Ребро |
|
f |
|
|
t |
|
Левое |
|
(0,0) |
(6t+1) |
6t+1 |
-1/6 |
|
Правое |
|
(8,4) |
(6t
-7) |
7-6t |
7/6 |
|
Нижнее |
|
(0,0) |
(1+6t) |
1+2t |
-1/2 |
|
Верхнее |
|
(8,4) |
(6t-7) |
3-2t |
3/2 |

Так как параметр t лежит за пределами 0≤t≤1 отрезок лежит за пределами всех ребер (либо целиком внутри окна, либо целиком снаружи). Определение этого происходит с помощью линейного программирования путем сверки знаков параметров t попарно (верхний/нижний, левый/правый).
Пример: есть окно произвольной формы.

Надо
разложить
на
и
.
В скалярном произведении вместо
![]()
будет![]()
и далее все решается также.
