ОТЧЁТ
по лабораторной работе
на тему:
«Отсечение многоугольников (двухмерное отсекающее окно). Отсечение
одной фигурой другой фигуры»
Вариант № 7
Минск 2022
Цель: изучить и реализовать алгоритмы Коэна-Сазерленда и Кируса-
Бэка.
Теоретическая часть
Отсечение - это процесс выделения некоторой части базы данных,
описывающей изображение. Основное применение алгоритмов отсечения -
это отбор той информации, которая необходима для визуализации
конкретной сцены или вида, как части более обширной обстановки. Но кроме
этого отсечение применяется в алгоритмах удаления невидимых линий и
поверхностей, при построении теней, а также при формировании фактуры.
Двухмерное отсечение
Целью алгоритма отсечения является определение тех точек, отрезков
или их частей, которые лежат внутри отсекающего окна. Эти точки, отрезки
или их части остаются для визуализации, а все остальное отбрасывается.
Алгоритм двухмерного отсекающего окна
1) Переопределение координат отрезков в параметрах IX, IY.
2) Определение видимости отрезков по отношению к отсекающему окну
(определение координат отсечки):
а) если IX1— ІX2 ≠ 0 или IY1 — IҮ2 ≠ 0, то отрезок не принадлежит
отсекающему окну (невидим);
б) если IХ1— ІX2 - IҮ1 — IҮ2 — 0, то отрезок целиком лежит внутри
отсекающего окна (полностью видим);
в) если IX1 ≠ 0 и/или IҮ1 ≠ 0, то конец отрезка (х, у) лежит за пределами
отсекающего окна и должна быть определена точка отсечки, т. е. точка ( x '1, у '1
), пересечения отрезка со стороной отсекающего окна (отрезок частично
видим); аналогично вычисляется точка отсечки ( x '2, у '2), если IX2 ≠ 0 и/или
IҮ2 ≠ 0 (отрезок частично видим);
г) если точка ( x '1, у '1) или ( x '2, у '2) есть пересечение отрезка с одним из
продолжений сторон отсекающего окна, т. е. отрезок проходит вне отсекаю-
щего окна, то он игнорируется и не вычерчивается (отрезок невидим).
3) Конец алгоритма.
Код программы
float rotate2 = 0;
float posX1 = 100;
float posX2 = 500;
float posX3 = 30;
float posY1 = -550;
float posY2 = -550;
float posY3 = -630;
float moveSide1 = 1;
float moveSide2 = 1;
float width = 600;
float height = 250;
float speedMove = 0.1;
private: System::Void pictureBox1_Paint(System::Object^ sender,
System::Windows::Forms::PaintEventArgs^ e) {
Graphics^ g1 = Graphics::FromImage(img);
Graphics^ g2 = Graphics::FromImage(img);
Graphics^ g3 = Graphics::FromImage(img);
g1->ScaleTransform(1, -1);
g1->TranslateTransform(posX1, posY1);
g2->ScaleTransform(1, -1);
g2->TranslateTransform(posX2, posY2);
g3->ScaleTransform(1, -1);
g3->TranslateTransform(posX3, posY3);
/*points->Add(PointF(-100, 20));
points->Add(PointF(100, 20));
points->Add(PointF(100, -20));
points->Add(PointF(-100, -20));*/
g3->DrawPolygon(Pens::Black, pointss->ToArray());*/
delete g1;
delete g2;
delete g3;
this->pictureBox1->Image = img;
rotate2 = rotate2 + 0.5;
if (moveSide1 == 1) {
posX1 = posX1 + speedMove;
if (posX1 >= 300) {
moveSide1 = 0;
}
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
float num;
bool isnumX = float::TryParse(textBox1->Text, num);
bool isnumY = float::TryParse(textBox2->Text, num);
if (isnumX) {
width = float::Parse(textBox1->Text);
}
if (isnumY) {
height = float::Parse(textBox2->Text);
}
}
bool moveFirst = false;
bool moveSecond = false;
private: System::Void pictureBox1_MouseDown(System::Object^ sender,
System::Windows::Forms::MouseEventArgs^ e) {
if ((e->X <= posX1 + 50) && (e->X >= posX1 - 50) && (-e->Y <= posY1 + 50) && (-e-
>Y >= posY1 - 50)) {
moveFirst = true;
}
else
if ((e->X <= posX2 + 50) && (e->X >= posX2 - 50) && (-e->Y <= posY2 + 50)
&& (-e->Y >= posY2 - 50)) {
moveSecond = true;
}
}
private: System::Void pictureBox1_MouseMove(System::Object^ sender,
System::Windows::Forms::MouseEventArgs^ e) {
if (moveFirst) {
posX1 = e->X;
posY1 = -e->Y;
}
else
if (moveSecond) {
posX2 = e->X;
posY2 = -e->Y;
}
}
private: System::Void pictureBox1_MouseUp(System::Object^ sender,
System::Windows::Forms::MouseEventArgs^ e) {
moveFirst = false;
moveSecond = false;
}
int mode = 1;
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
if (mode == 1) {
mode = 0;
button2->Text = "Старт";
speedMove = 0;
}
else if (mode == 0) {
mode = 1;
button2->Text = "Стоп";
speedMove = 0.2;
}
}
};
}