Алгоритми растрової графіки

Растрове розгорнення ліній. Побудова довільної кривої, заданої як таблиця, на множині не рівновіддалених вузлів за допомогою сплайнів, що згладжують. Зафарбування внутрішньої області довільного неопуклого багатокутника за допомогою методу сканування.

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык украинский
Дата добавления 01.08.2016
Размер файла 258,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Міністерство освіти і науки, молоді та спорту України

Запорізька державна інженерна академія

Факультет інформаційних та електронних технологій

Кафедра програмного забезпечення автоматизованих систем

Контрольна рoбота

Предмет: Компьютерная графіка

Тема: Алгоритми растрової графіки

Виконав студент групы СП-09-1з Скрипко О.Я.

Перевірив: Заяц В.І.

Запоріжжя 2014г.

Завдання 1

растровий сплайн сканування

Растрове розгорнення ліній

Реалізувати на вибір один з наступних алгоритмів

алгоритм Брезенхэма побудови відрізка з довільним кутовим коефіцієнтом розташованого в будь-якому чотирьох квадрантів;

алгоритм Брезенхэма побудови кола;

побудувати довільну криву, задану як таблиця, на множині не рівновіддалених вузлів за допомогою сплайнів, що згладжують.

Виконання завдання 1

#include <windows.h>

#include "draw.h"

const double PI = 3.141592653;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

char szClassName[] = "CG_DDA_Fixed";

////////////////////////////////////////////////////////////////////////////////////////////////////

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

HWND hWnd;

MSG lpMsg;

WNDCLASS wc;

// Заполняем структуру класса окна

wc.style = CS_HREDRAW | CS_VREDRAW;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

wc.lpszMenuName = NULL;

wc.lpszClassName = szClassName;

// Регистрируем класс окна

if (!RegisterClass(&wc))

{

MessageBox(NULL, "Cannot register class", "Error", MB_OK);

return 0;

}

// Создаем основное окно приложения

hWnd = CreateWindow(

szClassName, // Имя класса

"Алгоритм Брезенхэма", // Текст заголовка

WS_OVERLAPPEDWINDOW, // Стиль окна

50, 50, // Позиция левого верхнего угла

600, 500, // Ширина и высота окна

(HWND)NULL, // Указатель на родительское окно NULL

(HMENU)NULL, // Используется меню класса окна

(HINSTANCE)hInstance, // Указатель на текущее приложение

NULL); // Передается в качестве lParam в событие WM_CREATE

if (!hWnd)

{

MessageBox(NULL, "Не удается создать главное окно!", "Ошибка", MB_OK);

return 0;

}

// Показываем наше окно

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

// Выполняем цикл обработки сообщений до закрытия приложения

while (GetMessage(&lpMsg, NULL, 0, 0)) {

TranslateMessage(&lpMsg);

DispatchMessage(&lpMsg);

}

return (lpMsg.wParam);

}

////////////////////////////////////////////////////////////////////////////////////////////////////

LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam)

{

PAINTSTRUCT ps;

RECT Rect ;

HDC hdc, hCmpDC;

HBITMAP hBmp;

static int x1, y1, x2, y2;

static bool draw_line = false;

switch (messg)

{

case WM_PAINT:

GetClientRect(hWnd, &Rect);

hdc = BeginPaint(hWnd, &ps);

// Создание нового контекста для двойной буфферизации

hCmpDC = CreateCompatibleDC(hdc);

hBmp = CreateCompatibleBitmap(hdc, Rect.right - Rect.left,

Rect.bottom - Rect.top);

SelectObject(hCmpDC, hBmp);

// Закраска фоновым цветом

LOGBRUSH br;

br.lbStyle = BS_SOLID;

br.lbColor = 0xE1E4E7;

HBRUSH brush;

brush = CreateBrushIndirect(&br);

FillRect(hCmpDC, &Rect, brush);

DeleteObject(brush);

// Рисование

if (draw_line)

{

line(hCmpDC, x1, y1, x2, y2);

}

// Вывод на экран

SetStretchBltMode(hdc, COLORONCOLOR);

BitBlt(hdc, 0, 0, Rect.right - Rect.left, Rect.bottom - Rect.top,//hdc, 0, 0,...

hCmpDC, 0, 0, SRCCOPY);//hCmpDC, 0, 0

DeleteDC(hCmpDC);

DeleteObject(hBmp);

hCmpDC = NULL;

EndPaint(hWnd, &ps);

break;

case WM_LBUTTONDOWN:

x1 = LOWORD(lParam);

y1 = HIWORD(lParam);

draw_line = false;

InvalidateRect(hWnd, NULL, FALSE);

break;

case WM_MOUSEMOVE:

if (UINT(wParam) & MK_LBUTTON) {

x2 = LOWORD(lParam);

y2 = HIWORD(lParam);

draw_line = true;

InvalidateRect(hWnd, NULL, FALSE);

}

break;

case WM_LBUTTONUP:

draw_line = true;

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return (DefWindowProc(hWnd, messg, wParam, lParam));

}

return (0);

}

Скріншоти завдання 1

Завдання 2

Растрове розгорнення двовимірних областей

Зафарбувати внутрішню область довільного неопуклого багатокутника за допомогою методу сканування зі списком активних ребер.

Виконання завдання 2

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Drawing.Imaging;

using System.Linq;

using System.Runtime.InteropServices;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace ZacraskaFigure2D

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void Form1_Paint(object sender, PaintEventArgs e)

{

}

void PictureFill(Bitmap bitmap, int x, int y, Color color)

{

BitmapData data = bitmap.LockBits(

new Rectangle(0, 0, bitmap.Width, bitmap.Height),

ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

int[] bits = new int[data.Stride / 4 * data.Height];

Marshal.Copy(data.Scan0, bits, 0, bits.Length);

LinkedList<Point> check = new LinkedList<Point>();

int floodTo = color.ToArgb();

int floodFrom = bits[x + y * data.Stride / 4];

bits[x + y * data.Stride / 4] = floodTo;

if (floodFrom != floodTo)

{

check.AddLast(new Point(x, y));

while (check.Count > 0)

{

Point cur = check.First.Value;

check.RemoveFirst();

foreach (Point off in new Point[] {

new Point(0, -1), new Point(0, 1),

new Point(-1, 0), new Point(1, 0)})

{

Point next = new Point(cur.X + off.X, cur.Y + off.Y);

if (next.X >= 0 && next.Y >= 0 &&

next.X < data.Width &&

next.Y < data.Height)

{

if (bits[next.X + next.Y * data.Stride / 4] == floodFrom)

{

check.AddLast(next);

bits[next.X + next.Y * data.Stride / 4] = floodTo;

}

}

}

}

}

Marshal.Copy(bits, 0, data.Scan0, bits.Length);

bitmap.UnlockBits(data);

}

private void pictureBox1_Paint(object sender, PaintEventArgs e)

{

using (Bitmap bitmap = new Bitmap(this.Width, this.Height))

{

using (Graphics g = Graphics.FromImage(bitmap))

{

g.Clear(Color.LightGray);

List<Point> points = new List<Point>();

for (double i = 0; i < 10000; i++)

{

double dist = (i % 2 == 0) ?200: 70;

double x = 200 + Math.Cos(i / 10d * Math.PI * 2d) * dist;

double y = 200 + Math.Sin(i / 10d * Math.PI * 2d) * dist;

points.Add(new Point((int)x, (int)y));

}

g.DrawPolygon(Pens.Black, points.ToArray());

}

PictureFill(bitmap, 200,200, Color.GreenYellow);

e.Graphics.DrawImage(bitmap, 0, 0);

}

}

}

}

Скріншоти завдання 2

Завдання 3

Дротова модель опуклого багатогранника

Задати багатогранник (куб або тетраедр) координатами вершин з врахуванням належності до грані в системі світових координат

Задати вектор спостереження його початковою точкою в сферичних координатах .

За допомогою матриці видових перетворень перевести координати вершин у систему координат, зв'язану з точкою спостереження.

За допомогою проективних перетворень перейти від видових координат до системи координат екранної площини.

Виконання завдання 3

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace CubeTrheeD3

{

public partial class Form1 : Form

{

//Начало координат:

private const double x_focus = 0;

private const double y_focus = 0;

private const double z_focus = 0;

//Сферические координаты глаза наблюдателя (точки E):

private float r_Eye;

private float phi_Eye;

private float theta_Eye;

//Переменные и матрица (как массив) MatrixProjection:

//(во всех массивах нулевые индексы не используем):

private const double pi = Math.PI;

private int Tetrahedron;

private int Cube;

private int Octahedron;

private int Dodecahedron;

private int Icosahedron_first;

private int Icosahedron_last;

private float[,] MatrixProjection = new float[5, 5];

//Для параллельного проецирования объекта на экран

//(parallel projection) задаем константу:

private const int ParallelProjection = 0;

//Для перспективного проецирования объекта на экран

//(perspective projection) задаем константу:

private const int PerspectiveProjection = 1;

//Объявляем массив Lines структуры Line, оператором new

//создаем массив из 100 элементов и инициализируем его,

//т.е всем элементам этого массива присваиваем значение null:

public Line[] Lines = new Line[100];

//Объявляем и инициализируем переменную для индекса массива:

public int NumLines = 0;

public Form1()

{

InitializeComponent();

}

private void btnPlay_Click(object sender, EventArgs e)

{

//Вызываем метод для перспективного проецирования,

Projection(ref MatrixProjection, PerspectiveProjection,

r_Eye, phi_Eye, theta_Eye,

(float)x_focus, (float)y_focus, (float)z_focus, 0, 1, 0);

//Рассчитываем параметры геометрического тела:

СalculateParameters();

//Связываем элемент PictureBox1 с классом Bitmap:

pictureBox1.Image = new Bitmap(pictureBox1.Width,

pictureBox1.Height);

//Проектируем и в PictureBox рисуем выбранное нами тело:

Designing((Bitmap)pictureBox1.Image);

}

private void btnClose_Click(object sender, EventArgs e)

{

Application.Exit();

}

private void Form1_Load(object sender, EventArgs e)

{

//Задаем координаты глаза наблюдателя, например:

r_Eye = 4;

phi_Eye = (float)(0.05 * pi);

theta_Eye = (float)(0.03 * pi);//0.03

}

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)

{

//Задаем угол поворота фигуры после нажатия клавиши:

const float delta_theta = (float)pi / 50; ;

//Рассчитываем новые координаты глаза наблюдателя:

if (keyData == Keys.Left)

theta_Eye = theta_Eye - delta_theta;

if (keyData == Keys.Right)

theta_Eye = theta_Eye + delta_theta;

if (keyData == Keys.Up)

phi_Eye = phi_Eye - delta_theta;

if (keyData == Keys.Down)

phi_Eye = phi_Eye + delta_theta;

//Проектируем выбранное нами геометрическое тело:

Projection(ref MatrixProjection, PerspectiveProjection,

r_Eye, phi_Eye, theta_Eye,

(float)x_focus, (float)y_focus, (float)z_focus,

0, 1, 0);

Designing((Bitmap)pictureBox1.Image);

//В элементе PictureBox перерисовываем объект:

pictureBox1.Refresh();

return true;

}

//Проектируем и при помощи процедуры DrawSolid

private void Designing(Bitmap bmp)

{

//Создаем объект g класса Graphics:

Graphics g;

//Связываем объект g с изображением bmp:

g = Graphics.FromImage(bmp);

//Задаем белый цвет типа Window

//для элемента управления PictureBox1:

g.Clear(SystemColors.ControlLight);

//Высвобождаем ресурсы от графического объекта g:

g.Dispose();

//Преобразуем точки:

TransformAllDataFull(ref MatrixProjection);

// DrawSolid(bmp, Cube, Octahedron - 1,Color.Black, false);

DrawSolid(bmp, Octahedron, Dodecahedron - 1,Color.Blue, false);

}

//Рассчитываем параметры геометрических тел и осей:

private void СalculateParameters()

{

float theta1; float theta2;

float s1; float s2; float c1; float c2;

float S; float R; float H; float A;

float B; float C; float D; float X;

float Y; float y2; float M; float N;

//Оси координат:

DesigningLine(0, 0, 0, 0.5f, 0, 0); //Ось x.

DesigningLine(0, 0, 0, 0, 0.5f, 0); //Ось y.

DesigningLine(0, 0, 0, 0, 0, 0.5f); //Ось z.

//Октаэдр (Octahedron):

Octahedron = NumLines + 1;

DesigningLine(0, 1, 0, 1, 0, 0);

DesigningLine(0, 1, 0, -1, 0, 0);

DesigningLine(0, 1, 0, 0, 0, 1);

DesigningLine(0, 1, 0, 0, 0, -1);

DesigningLine(0, -1, 0, 1, 0, 0);

DesigningLine(0, -1, 0, -1, 0, 0);

DesigningLine(0, -1, 0, 0, 0, 1);

DesigningLine(0, -1, 0, 0, 0, -1);

DesigningLine(0, 0, 1, 1, 0, 0);

DesigningLine(0, 0, 1, -1, 0, 0);

DesigningLine(0, 0, -1, 1, 0, 0);

DesigningLine(0, 0, -1, -1, 0, 0);

}

//Объявляем структуру Line и массивы этой структуры:

public struct Line

{

//Объявляем массивы для соединения точек (points):

public float[] fr_points;

public float[] to_points;

//Массивы для соединения преобразованных точек:

//(transformed (tr) points):

public float[] fr_tr_points;

public float[] to_tr_points;

//Создаем и инициализируем массивы, т.е.

//всем пяти элементам каждого массива присваиваем 0:

public void Initialize()

{

fr_points = new float[5];

to_points = new float[5];

fr_tr_points = new float[5];

to_tr_points = new float[5];

}

}

//Проектируем линию между точками (x1,y1,z1),(x2,y2,z2):

public void DesigningLine(float x1, float y1, float z1,

float x2, float y2, float z2)

{

NumLines = NumLines + 1;

//Инициализируем и рассчитываем массив:

Lines[NumLines].Initialize();

Lines[NumLines].fr_points[1] = x1;

Lines[NumLines].fr_points[2] = y1;

Lines[NumLines].fr_points[3] = z1;

Lines[NumLines].fr_points[4] = 1;

Lines[NumLines].to_points[1] = x2;

Lines[NumLines].to_points[2] = y2;

Lines[NumLines].to_points[3] = z2;

Lines[NumLines].to_points[4] = 1;

}

//Применяем матрицу переноса (translation matrix)

//ко всем линиям, используя MatrixApplyFull.

//Преобразование не имеет 0, 0, 0, 1 в последнем столбце:

public void TransformAllDataFull(ref float[,] M)

{

TransformDataFull(ref M, 1, NumLines);

}

//Применяем матрицу переноса (translation matrix)

//ко всем выделенным линиям, используя MatrixApplyFull.

//Преобразование не имеет 0, 0, 0, 1 в последнем столбце:

public void TransformDataFull(ref float[,] M,

int line1, int line2)

{

for (int i = line1; i <= line2; i++)

{

MatrixApplyFull(ref Lines[i].fr_points, ref M,

ref Lines[i].fr_tr_points);

MatrixApplyFull(ref Lines[i].to_points, ref M,

ref Lines[i].to_tr_points);

}

}

//Рисуем выделенные преобразованные линии:

public void DrawSolid(Bitmap bmp,

int first_line, int last_line, Color color, bool clear)

{

float x1, y1, x2, y2;

Graphics g; Pen pen;

//Задаем толщину линии рисования, например, 2

//(цвет линии мы задали в процедуре Designing):

pen = new Pen(color, 2);

//Связываем объект g с изображением bmp:

g = Graphics.FromImage(bmp);

if (clear) g.Clear(System.Drawing.Color.Black);

//Рисуем линии:

for (int i = first_line; i <= last_line; i++)

{

x1 = Lines[i].fr_tr_points[1];

y1 = Lines[i].fr_tr_points[2];

x2 = Lines[i].to_tr_points[1];

y2 = Lines[i].to_tr_points[2];

//Нормализуем и рисуем многогранник:

g.DrawLine(pen,

(x1 * bmp.Width / 4) + bmp.Width / 2.0F,

bmp.Height / 2.0F - (y1 * bmp.Height / 4),

(x2 * bmp.Width / 4) + bmp.Width / 2.0F,

bmp.Height / 2.0F - (y2 * bmp.Height / 4));

}

//Высвобождаем ресурсы от объектов g и pen:

g.Dispose(); pen.Dispose();

}

//Строим единичную матрицу:

public void MatrixIdentity(ref float[,] M)

{

for (int i = 1; i <= 4; i++)

{

for (int j = 1; j <= 4; j++)

{

if (i == j) M[i, j] = 1;

else M[i, j] = 0;

}

}

}

//Строим матрицу преобразования для поворота на угол theta

public void m3LineRotate(ref float[,] M,

float p1, float p2, float p3,

float d1, float d2, float d3, float theta)

{

float[,] T = new float[5, 5]; //Перенос.

float[,] R1 = new float[5, 5]; //Вращение 1.

float[,] r2 = new float[5, 5]; //Вращение 2.

float[,] Rot3 = new float[5, 5]; //Вращение.

float[,] R2i = new float[5, 5]; //Стоп вращению 2.

float[,] R1i = new float[5, 5]; //Стоп вращению 1.

float[,] Ti = new float[5, 5]; //Стоп переносу.

float D, L;

float[,] M12 = new float[5, 5];

float[,] M34 = new float[5, 5];

float[,] M1234 = new float[5, 5];

float[,] M56 = new float[5, 5];

float[,] M567 = new float[5, 5];

//Переносим плоскость к началу координат:

MatrixTranslate(ref T, -p1, -p2, -p3);

MatrixTranslate(ref Ti, p1, p2, p3);

//Вращаем вокруг оси z,

//пока линия не окажется в y-z плоскости:

MatrixIdentity(ref R1);

D = (float)Math.Sqrt(d1 * d1 + d2 * d2);

R1[1, 1] = d2 / D; R1[1, 2] = d1 / D;

R1[2, 1] = -R1[1, 2]; R1[2, 2] = R1[1, 1];

MatrixIdentity(ref R1i);

R1i[1, 1] = R1[1, 1]; R1i[1, 2] = -R1[1, 2];

R1i[2, 1] = -R1[2, 1]; R1i[2, 2] = R1[2, 2];

//Вращаем вокруг оси x, когда линия будет по оси y:

MatrixIdentity(ref r2);

L = (float)Math.Sqrt(d1 * d1 + d2 * d2 + d3 * d3);

r2[2, 2] = D / L; r2[2, 3] = -d3 / L;

r2[3, 2] = -r2[2, 3]; r2[3, 3] = r2[2, 2];

MatrixIdentity(ref R2i);

R2i[2, 2] = r2[2, 2]; R2i[2, 3] = -r2[2, 3];

R2i[3, 2] = -r2[3, 2]; R2i[3, 3] = r2[3, 3];

//Вращаем вокруг линии (оси y):

MatrixYRotate(ref Rot3, theta);

//Комбинируем матрицы:

m3MatMultiply(ref M12, ref T, ref R1);

m3MatMultiply(ref M34, ref r2, ref Rot3);

m3MatMultiply(ref M1234, ref M12, ref M34);

m3MatMultiply(ref M56, ref R2i, ref R1i);

m3MatMultiply(ref M567, ref M56, ref Ti);

m3MatMultiply(ref M, ref M1234, ref M567);

}

}

Скріншоти завдання 3

Размещено на Allbest.ru


Подобные документы

  • Алгоритм побудови лінії та використання графічної бібліотеки DirectX. Способи побудови довільної кількості довільного розміру точок на поверхні форми. Можливості комп'ютера виконувати мультимедійні програми під управлінням операційної системи Windows.

    контрольная работа [416,9 K], добавлен 22.10.2009

  • Створення зображення (візуалізація) як завдання комп'ютерної графіки. Методи та алгоритми візуалізації. Трансформація об’єктів в бібліотеці OpengL. Побудова довільної кількості довільного розміру точок на поверхні форми засобами бібліотеки OpengL.

    контрольная работа [2,3 M], добавлен 10.09.2009

  • Програма створення графіки OpenGl. Алгоритми зафарбовування від внутрішньої точки до границь довільного контуру. Алгоритм обчислення координати точки кривої Без'є за заданними параметрами. Створення програм OpenGL мовою С, C++ у середовищі Windows.

    контрольная работа [285,3 K], добавлен 19.09.2009

  • Оцифровування карти за допомогою програмного продукту ArcGis. Порівняння методів інтерполяції за допомогою програмних продуктів Surfer та ArcGis. Згладжування отриманих сіткових даних за допомогою сплайнів і фільтрації. Застосування сіткових чисел.

    курсовая работа [2,1 M], добавлен 31.01.2014

  • Методи побудови довірчих інтервалів для невідомої імовірності. Оцінка неоднорідності генеральної сукупності за допомогою лінійних сплайнів. Непараметричні критерії еквівалентності генеральних сукупностей за допомогою мір близькості між вибірками.

    автореферат [32,7 K], добавлен 06.04.2009

  • Перевага аудиту за допомогою стовпців. Різні типи стовпців аудиту та їх налаштування. Аудит за допомогою таблиць. Відновлення даних за допомогою таблиць аудиту. Використання таблиць аудиту для відновлення змінених даних. Приклади синтаксичних конструкцій.

    контрольная работа [27,5 K], добавлен 14.01.2010

  • Програми растрової графіки. Інтерфейс Adobe Photoshop. Зміна розмірів зображення та полотна. Інструменти Adobe Photoshop. Робота з зображеннями, введення тексту. Створення спеціальних ефектів. Прийоми редагування зображення та створення композицій.

    дипломная работа [8,3 M], добавлен 21.07.2014

  • Методи первинної обробки даних - згладжування та характеристика сплайнів. Загальна характеристика об'єктно-орієнтованої мови Java. Принципи побудови графічного інтерфейсу. Розробка алгоритму програми та інтерфейсу користувача програмного продукту.

    дипломная работа [3,3 M], добавлен 10.10.2013

  • Перегляд секторів диску за допомогою програми Disk Editor. Характеристика завантажувального запису BR, FAT-таблиці та кореневого каталогу як основних зон системної області файлової структури операційної системи для дискети стандартного формату 3.5'.

    лабораторная работа [59,7 K], добавлен 11.12.2010

  • Коротка характеристика реле. Побудова моделі реле постійного струму. Розрахунок матриць інциденцій та оберненої матриці. Аналіз напруг за допомогою кривої намагнічення. Розрахунок індуктивність котушки для опису перехідного процесу. Лістинг програми.

    контрольная работа [279,8 K], добавлен 19.01.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.