Автор работы: Пользователь скрыл имя, 19 Марта 2013 в 21:11, курсовая работа
Одной из основных проблем, возникающих при разработке компьютерных систем обработки и визуализации графической информации, является проблема выбора математического подхода к представлению графической информации. От этого в значительной мере зависит эффективность и качество работы систем, а также организация алгоритмического и программного обеспечения. С точки зрения эффективности перспективными являются подходы, позволяющие кодировать геометрическую информацию с помощью некоторых аналитических конструкций.
Введение 4
1 Теоретическая часть 5
1.1 Геометрическое моделирование в САПР 5
1.2 Описание алгоритма Кируса - Бека 15
2 Практическая часть 23
2.1 Постановка задачи 23
2.2 Назначение 23
2.3 Системные требования 23
2.4 Структура программы 24
2.5 Инструкция пользователю 25
2.6 Контрольный пример 27
Заключение 28
Список литературы 29
Приложение. Листинг программы 30
Учет ориентации помогает корректно идентифицировать полностью видимые отрезки. Это соображение используется при формальной записи алгоритма Кируса — Бека, которая приводится ниже.
Для формализации этого алгоритма напомним, что параметрическое описание отрезка имеет вид:
Р(t) = P1 + (Р2 - P1)t 0 £ t £ 1 (1)
а скалярное произведение внутренней нормали на вектор, начинающийся в произвольной точке отрезка и заканчивающийся в другой точке, лежащей на той же границе окна, т. е.
ni[P(t)-fi]
i=1,2,3,...
будет положительно, равно нулю или отрицательно — в зависимости от того, будет ли избранная точка отрезка лежать с внутренней стороны границы, на самой этой границе или с ее внешней стороны. Последнее соотношение применимо к любой плоскости или ребру номер i, ограничивающим область. Подстановка (1) в (2) дает условие пересечения отрезка с границей области:
ni[P1 +(P2 - Pi)t-fi]=0 (3)
В другой форме уравнение (3) имеет вид:
ni[P1 - fi] + ni [Р2 - P1]t = 0 (4)
Заметим, что вектор Р2 - P1 определяет ориентацию отрезка, а вектор P1 - fi, пропорционален расстоянию от первого конца отрезка до избранной граничной точки. Обозначим через D = Р2 - Р1 директрису или ориентацию отрезка, а через wi = Р1 — fi — некий весовой множитель. Тогда уравнение (4) можно записать так:
t(ni*D) + wini =0 (5)
Решая
последнее уравнение
t = -(wi*ni)/(D*ni) D¹0 i=1, 2, 3, ... (6)
Здесь Dni может быть равным нулю только при D = О, а это означает, что Р2 = P1 т. е. вырождение отрезка в точку. Если
Уравнение (6) используется для получения значений t, соответствующих пересечениям отрезка с каждой стороной окна. Если значение t лежит за пределами интервала 0 £ t £ 1, то можно его проигнорировать. Хотя известно, что отрезок может пересечь выпуклое окно не более чем в двух точках, т. е. при двух значениях t, уравнения (6) могут дать большее число решений в интервале О £ t £ 1. Эти решения следует разбить на две группы: нижнюю и верхнюю, в зависимости от того, к началу или к концу отрезка будет ближе соответствующая точка. Нужно найти наибольшую из нижних и наименьшую из верхних точек. Если Dni > 0, то найденное значение t рассматривается в качестве возможного нижнего предела. Если Dni < 0, то значение t рассматривается в качестве возможного верхнего предела. Ниже приводится запись этого алгоритма на псевдокоде.
Алгоритм двумерного отсечения Кируса — Бека
Р1, P2 — концевые точки отрезка
k — число сторон отсекающего окна
ni — вектор нормали к i-и стороне окна
fi — точка, лежащая на i-й стороне окна
D — директриса отрезка, равная Р2 — P1
wi — весовая функция, равная Р1 — fi
tн, tв — нижний и верхний пределы значений параметра t
инициализировать пределы значений параметра, предполагая что отрезок полностью видимый
tн = 0
tв = 1
вычислить директрису D
D = Р2 - Р1
начать главный цикл
for i = 1 to k
вычислить Wi, Dni и win для данного i
wi = Р1 - fi
call Скал-произвед(D, ni, DCk)
call Скал-произвед(wi, ni, WCk)
отрезок вырождается в точку?
if DCk = 0 then 2
отрезок невырожден, вычислить t
t = -Wck/Dck,
поиск верхнего и нижнего пределов t
if DCk > 0 then 1
поиск верхнего предела
верно ли, что 0 £ t £ 1?
if t < 0 then 4
tв = min(t, tв)
go to 3
поиск нижнего предела верно ли, что t £ 1?
1 if t > 1 then 4
tл = max (t, tл)
go to 3
отрезок выродился в точку
2 if Wсk < 0 then 4
точка видима относительно текущей границы
3 next i
произошел нормальный выход из цикла проверка фактической видимости отрезка
if tн > tв then 4
Начертить отрезок от P(tн) до P(tв)
4 Обработать следующий отрезок
подпрограмма вычисления скалярного произведения
subroutine Скал-произвед (Вектор1, Вектор2; Скал)
Вектор1 — первый вектор, заданный компонентами х и у
Вектор2 — второй вектор, заданный компонентами х и у
Скал — скалярное произведение векторов
Скал = Вектор1х * Вектор2х + Вектор1у * Вектор2у
return
2.Практическая часть
2.1 Постановка задачи
Разработать программу, реализующую алгоритм двумерного отсечения Кируса – Бека.
2.2 Назначение
Приложение предназначено для демонстрации возможностей языка Delphi при программировании задач компьютерной графики. Программа выполняет:
2.3 Системные требования
Для разработанной программы необходимы следующие минимальные системные требования.
Таблица1 – такблица системных требований
Процессор |
Pentium с тактовой частотой 233 МГц или выше; рекомендуется Pentium III |
Операционная система |
Microsoft Windows 2000 с пакетом обновления 3 (SP3) или более поздней версии; Windows XP или более поздняя версия (рекомендуется) |
Память |
64 Мбайт ОЗУ (минимум); 128 Мбайт ОЗУ (рекомендуется) |
Место на жестком диске |
600 Кбайт |
Монитор |
SVGA (800´600) или с более высоким разрешением, 256 цветов |
Указывающее устройство |
Microsoft Mouse, Microsoft IntelliMouse или совместимое указывающее устройство |
2.4 Структура программы
Ниже перечислены самые необходимые процедуры для создания такого рода программ.
Функция UseBWForContrast
Определение цвета контрастного заданному.
Процедура ClearListOfLines
Очистка списка линий.
Процедура StartNewLine
Начать рисование новой линии.
Процедура DeleteTopmostLine
Удаление линии.
Процедура SetMode
Установка режима вывода линий.
Процедура PaintBox1Paint
Вывод сцены.
Процедура DoClipping
Управляющая процедура отсечения.
Процедура PaintBox1MouseUp
Обработка отпускания кнопки мыши.
Процедура PaintBox1MouseMove
Обработка перемещения мыши.
Процедура ButtonLineClick
Включение режима рисования линий.
Процедура ButtonRectClick
Включение режима рисование окна отсекателя.
Процедура FormDestroy
Удаление формы из памяти.
Процедура FormCreate
Инициализация формы.
Процедура ItemColorDrawItem
Вывод цветного пункта меню.
Процедура ItemColorClick
Выбор цвета.
Процедура FileExitExecute
Выход из программы.
Процедура ButtonClipClick
Нажатие кнопки выполнения отсечения.
Процедура Button1Click
Очистка области построения.
Процедура ClipLineWithRectangle
Алгоритм Кируса – Бека для двумерного отсечения.
2.5 Инструкция пользователю
Установка системы производится путем копирования папки Kirus, не нарушая внутреннюю структуру каталогов (это повлечет за собой различного рода сбои и ошибки при работе программы), на любой магнитный носитель позволяющий перезаписывать и дописывать данные (без этих функций в базу данных невозможно вносить изменения).
Для начала работы пользователь должен запустить программу любым имеющимся для этого способом операционной системы Windows. После запуска программы на экране появится главная форма. Данная форма представлена на рисунке 4.
Состав и назначение элементов окна.
Кнопки управления:
Область построений.
Область выбора цвета.
Флажки
«внешнее отсечение» и «внутренне отсечение»
запрещают или разрешают
Последовательность работы с программой.
1) Рисуем окно отсекателя. Для этого нажимаем на кнопку Окно. Устанавливаем курсор мыши в точку начала рисования, нажимаем левую кнопку. Отпускаем кнопку и «растягиваем» прямоугольник до нужных размеров.
2)
Рисуем отрезки. Нажимаем
3) Нажимаем кнопку Отсечь. Программа выполняет отсечение и выводит результат: отрезки, расположенные внутри отсекателя при этом окрашены одним цветом, за пределами отсекателя – другим.
Очистка области построения выполняется после нажатия кнопки Очистить.
Для завершения работы с программой нажать кнопку Выход.
2.6. Контрольный пример
Заключение
По результатам выполнения курсовой работы на тему «Разработка программы реализующей алгоритм Кируса – Бека» можно сделать следующие выводы:
Главным итогом выполнения является создание программы, реализующей указанный метод. В программе используются оригинальные процедуры которые обеспечивают возможность нахождения точек пересечения заданного многоугольника и прямой и построения на экране результатов. Эти процедуры могут без изменений переноситься и использоваться программами в которых решаются различные задачи графических построений.
В
программе был использован
Программа имеет развитый пользовательский интерфейс, что позволяет работать с разработанной программой пользователю с минимальной квалификацией.
Список литературы
Приложение. Листинг программы
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
StdCtrls, Menus, ExtCtrls, ClippingRoutines, ComCtrls, ToolWin, ImgList;
type
TMode = (mNone, mLineP1, mLineP2, mRectP1, mRectP2, mView, mClip);
PLine = ^TLine;
TLine = record
P1, P2 : TPoint;
ClipP1, ClipP2 : TPoint;
Vis : TVisibility;
Next : PLine;
ExchangeLeftAndRight : Boolean;
end;
TFormMain = class(TForm)
PanelView: TPanel;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ImageList1: TImageList;
PaintBox1: TPaintBox;
Panel1: TPanel;
Label1: TLabel;
ToolButton5: TToolButton;
cbRect: TColorBox;
Label2: TLabel;
cbOut: TColorBox;
cbIn: TColorBox;
Label3: TLabel;
chbOut: TCheckBox;
chbIn: TCheckBox;
procedure PaintBox1Paint(Sender: TObject);
procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure ButtonLineClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ButtonRectClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ItemColorDrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
procedure ItemColorClick(Sender: TObject);
procedure FileExitExecute(Sender: TObject);
procedure ButtonClipClick(Sender: TObject);
procedure ButtonClearClick(Sender: TObject);
procedure chbOutClick(Sender: TObject);
procedure chbInClick(Sender: TObject);
private
{ Private declarations }
OldMode, Mode : TMode;
public
{ Public declarations }
LineList : PLine;
Rect : PRect;
procedure SetMode(NewMode : TMode);
procedure DoClipping;
procedure ClearListOfLines;
procedure StartNewLine;
procedure DeleteTopmostLine;
end;
var
FormMain: TFormMain;
implementation
{$R *.dfm}
function UseBWForContrast(Color : TColor) : TColor;
var
I, B, Max, Sum : Word;
begin
Sum := 0;
Max := 0;
for I := 1 to 3 do
begin
B := Color and $000000FF;
if B > Max then Max := B;
Sum := Sum + B;
Color := Color shr 8;
end;
if (Color = 0) and ((Sum <= 240) or (Max <= 192)) then
Result := clWhite
else
Result := clBlack;
end;
{-----------------------------
procedure TFormMain.ClearListOfLines;
begin
while (LineList <> nil) do DeleteTopmostLine;
end;
{-----------------------------
procedure TFormMain.StartNewLine;
var
P : PLine;
begin
New(P);
P.Next := LineList;
LineList := P;
end;
{-----------------------------
procedure TFormMain.DeleteTopmostLine;
var
P : PLine;
begin
P := LineList;
LineList := P.Next;
Dispose(P);
end;
{-----------------------------
procedure TFormMain.SetMode(NewMode : TMode);
begin
OldMode := Mode;
if (OldMode = mLineP1) and (NewMode <> mLineP2) then
DeleteTopmostLine
else if Assigned(Rect) and (NewMode in [mNone, mRectP1]) or
(OldMode = mRectP2) and (NewMode = mLineP1) then
begin
Dispose(Rect);
Rect := nil;
end;
if NewMode = mNone then
ClearListOfLines
else if NewMode = mLineP1 then
StartNewLine
else if NewMode = mClip then
DoClipping;
Mode := NewMode;
InvalidateRect(PanelView.
end;
Информация о работе Программная реализация алгоритма Кируса-бека