Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 5

Лабораторна робота №3

Математичні алгоритми побудови лінії

Виконала: студентка
гупи СЗ-181 ФККПІ
Сопун Ірина Миколаївна
Хід роботи

1. Реалізувати приклад з теоретичних відомостей.


Приклад 1.
#include <windows.h>
#include <iostream>
#include <conio.h>

int main()
{
HWND hwnd = GetConsoleWindow();
HDC hdc = GetDC(hwnd);

int x1 = 2, y1 = 1, x2 = 1000, y2 = 1009, steps, k;


float xincr, yincr, x, y, dx, dy;
//std::cout << "enter x1 ";
//std::cin >> x1;
//std::cout << "enter x2 ";
//std::cin >> x2;
//std::cout << "enter y1 ";
//std::cin >> y1;
//std::cout << "enter y2 ";
//std::cin >> y2;
dx = x2 - x1;
dy = y2 - y1;
if (abs(dx) > abs(dy))
steps = abs(dx);
else
steps = abs(dy);
xincr = dx / steps;
yincr = dy / steps;
x = x1;
y = y1;
for (k = 1; k <= steps; k++)
{
x += xincr;
y += yincr;
SetPixel(hdc, round(x), round(y), RGB(255, 0, 0));}
ReleaseDC(hwnd, hdc);
std::cin.ignore();
return 0;}
2. Побудувати лінію за допомогою алгоритму Брезенхейма.
#include <windows.h>
#include <iostream>
#include <conio.h>
int main()
{HWND hwnd = GetConsoleWindow();
HDC hdc = GetDC(hwnd);
int x0 = 100, y0 = 100, x1 = 1000, y1 = 300;

double k = ((double)(y1 - y0)) / (x1 - x0);


double d = 2 * k - 1;
int y = y0;
COLORREF color = RGB(200, 100, 10);
SetPixel(hdc, x0, y0, color);
for (int x = x0 + 1; x <= x1; x++)
{
if (d > 0)
{
d += 2 * k - 2;
y++;
}
else
d += 2 * k;
SetPixel(hdc, x, y, color);
}
ReleaseDC(hwnd, hdc);
std::cin.ignore();
return 0;
}

3. Намалювати по одній будь-якій простій фігурі, використовуючи


алгоритми, представлені в лабораторній роботі.
Я поєднала два алгоритми в одному коді, квадрат і трикутник -DDA,
коло – по алгоритму Брезенхейма.
#include <windows.h>
#include <iostream>
#include <conio.h>

void drawCircle(HDC hdc, int xc, int yc, int x, int y)


{
SetPixel(hdc, xc + x, yc + y, RGB(255, 100, 0));
SetPixel(hdc, xc - x, yc + y, RGB(255, 100, 0));
SetPixel(hdc, xc + x, yc - y, RGB(255, 100, 0));
SetPixel(hdc, xc - x, yc - y, RGB(255, 100, 0));
SetPixel(hdc, xc + y, yc + x, RGB(255, 100, 0));
SetPixel(hdc, xc - y, yc + x, RGB(255, 100, 0));
SetPixel(hdc, xc + y, yc - x, RGB(255, 100, 0));
SetPixel(hdc, xc - y, yc - x, RGB(255, 100, 0));
}

void circleBres(HDC hdc, int xc, int yc, int r)


{
int x = 0, y = r;
int d = 3 - 2 * r;
drawCircle(hdc, xc, yc, x, y);
while (y >= x)
{x++;

if (d > 0)
{
y--;
d = d + 4 * (x - y) + 10;
}
else
d = d + 4 * x + 6;
drawCircle(hdc, xc, yc, x, y);
}
}
void DrawLine(HDC hdc, int x1, int y1, int x2, int y2) {
int steps, k;
float xincr, yincr, x, y, dx, dy;
dx = x2 - x1;
dy = y2 - y1;
if (abs(dx) > abs(dy))
steps = abs(dx);
else
steps = abs(dy);
xincr = dx / steps;
yincr = dy / steps;
x = x1;
y = y1;
for (k = 1; k <= steps; k++)
{
x += xincr;
y += yincr;
SetPixel(hdc, round(x), round(y), RGB(186, 10, 40));
}
}

int main()
{
HWND hwnd = GetConsoleWindow();
HDC hdc = GetDC(hwnd);
int xc = 150, yc = 150, r = 30;
circleBres(hdc, xc, yc, r);
DrawLine(hdc, 100, 100, 200, 100);
DrawLine(hdc, 200, 100, 200, 200);
DrawLine(hdc, 200, 200, 100, 200);
DrawLine(hdc, 100, 200, 100, 100);

DrawLine(hdc, 200, 200, 150, 300);


DrawLine(hdc, 150, 300, 100, 200);
DrawLine(hdc, 100, 200, 200, 200);
ReleaseDC(hwnd, hdc);
std::cin.ignore();
return 0;
}

You might also like