Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа Онищук 2ВСб-1.doc
Скачиваний:
16
Добавлен:
07.05.2015
Размер:
262.14 Кб
Скачать

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное

учреждение высшего профессионального образования

«Комсомольский-на-Амуре государственный

технический университет»

Факультет компьютерных технологий

Кафедра «Прикладная математика и информатика»

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовой работе

по дисциплине «Интерактивная компьютерная графика»

Компьютерная графика средствами Windows Forms

Студент группы 2ВСб-1 ___________________ А.И. Онищук

подпись, дата

Руководитель работы ___________________ А.Ю. Лошманов

подпись, дата

Нормоконтролер ___________________ А.Ю. Лошманов

подпись, дата

2014 Содержание

Введение…………………………………………………………………………...3

1 Двумерная графика.......................……………………………………………....4

2 Преобразования двумерных координат......……………………………………6

3 Метод сканирующей строки......................……………….………………….....8

4 Параллельная проекция…………………………………….…….………..….12

5 Центральная проекция……………………………………….….......……..….15

Заключение………………………………………………………………….……19

Список использованных источников………………………………………..….20

Введение

Существует немало языков программирования, но лишь немногие из них действительно хороши. Хороший язык программирования должен быть одновременно эффективным и гибким, а его синтаксис — кратким, но ясным. Он должен облегчать создание правильного кода, не мешая делать это, а также поддерживать самые современные возможности программирования, но не ультрамодные тенденции, заводящие в тупик. И наконец, хороший язык программирования должен обладать еще одним, едва уловимым качеством: вызывать у нас такое ощущение, будто мы находимся в своей стихии, когда пользуемся им. Именно таким языком и является С# [1].

Данная работа посвящена изучению некоторых разделов интерактивной компьютерной графики средствами C#.

1 Двумерная графика

Задача: Написать программу, которая строит график функции на отрезке [a, b], заданной явно. Подобрать отрезок [a, b], который содержит только одну точку разрыва [2].

Решение:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Drawing.Drawing2D;

namespace WindowsFormsApplication5

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

protected override void OnPaint(PaintEventArgs e)

{

base.OnPaint(e);

Graphics g = e.Graphics;

float xmin, xmax, ymin, ymax, x, y, h;

int r = 3;

double eps = 0.001;

xmin = 1; xmax = 6;

h = (xmax - xmin) / 500;

ymin = F(xmin);

ymax = ymin;

x = xmin + h;

for (x = xmin; x < r-eps; x = x + h)

{

y = F(x);

if (y < ymin) ymin = y;

if (y > ymax) ymax = y;

}

for (x = r + h; x <= xmax; x = x + h)

{

y = F(x);

if (y < ymin) ymin = y;

if (y > ymax) ymax = y;

}

float dx = (xmax - xmin) * 0.03f;

float dy = (ymax - ymin) * 0.03f;

float ax = ClientSize.Width / (xmax - xmin + 2 * dx);

float ay = -ClientSize.Height / (ymax - ymin + 2 * dy);

float bx = -ax * (xmin - dx);

float by = -ay * (ymax + dy);

g.Transform = new Matrix(ax, 0, 0, ay, bx, by);

float hf, wf, a, b, c, d;

float asm = (xmax - xmin) / (ymax - ymin);

float asf = (float)ClientSize.Width / (float)ClientSize.Height;

if (asm > asf)

{

wf = ClientSize.Width;

hf = (ymax - ymin) * wf / (xmax - xmin);

a = 0;

b = (ClientSize.Height - hf) / 2;

c = ClientSize.Width;

d = (ClientSize.Height + hf) / 2;

}

else

{

hf = ClientSize.Height;

wf = (xmax - xmin) * hf / (ymax - ymin);

a = (ClientSize.Width - wf) / 2;

b = 0;

c = (ClientSize.Width + wf) / 2;

d = ClientSize.Height;

}

ax = (c - a) / (xmax - xmin + 2 * dx);

ay = (b - d) / (ymax - ymin + 2 * dy);

bx = a - ax * (xmin - dx);

by = b - ay * (ymax + dy);

float hline = (xmax - xmin) * 0.001f;

Pen blackPen = new Pen(Color.Black, hline);

Pen bluePen = new Pen(Color.Blue, hline);

x = xmin;

g.DrawLine(bluePen, xmin, 0, xmax, 0);

g.DrawLine(bluePen, 0, ymin, 0, ymax);

while (x <= r - h)

{

g.DrawLine(blackPen, x, F(x), x + h, F(x + h));

x = x + h;

}

x = r + h;

while (x <= xmax)

{

g.DrawLine(blackPen, x, F(x), x + h, F(x + h));

x = x + h;

}

}

private float F(float x)

{

return x / (x * x - 9);

}

private void Form1_Resize(object sender, EventArgs e)

{

Invalidate();

}

}

}

Рисунок 1.1 Реализация программы, которая строит двумерный график функции, заданной явно, с одной точкой разрыва

Задача: Написать программу, которая строит график функции на отрезке [a, b], заданной параметрически.

Решение:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Drawing;

using System.Drawing.Drawing2D;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

protected override void OnPaint(PaintEventArgs e)

{

base.OnPaint(e);

Graphics g = e.Graphics;

float xmin, xmax, ymin, ymax, x, t, y, h;

float tmin = -5, tmax = 5;

xmin = F1(tmin); xmax = F1(tmax);

h = (tmax - tmin) / 500;

ymin = F2(tmin);

ymax = ymin;

t = tmin + h;

for (t = tmin; t < tmax; t = t + h)

{

x = F1(t);

if (x < xmin) xmin = x;

if (x > xmax) xmax = x;

y = F2(t);

if (y < ymin) ymin = y;

if (y > ymax) ymax = y;

}

float dx = (xmax - xmin) * 0.03f;

float dy = (ymax - ymin) * 0.03f;

float ax = ClientSize.Width / (xmax - xmin + 2 * dx);

float ay = -ClientSize.Height / (ymax - ymin + 2 * dy);

float bx = -ax * (xmin - dx);

float by = -ay * (ymax + dy);

float hf, wf, a, b, c, d;

float asm = (xmax - xmin) / (ymax - ymin);

float asf = (float)ClientSize.Width / (float)ClientSize.Height;

if (asm > asf)

{

wf = ClientSize.Width;

hf = (ymax - ymin) * wf / (xmax - xmin);

a = 0;

b = (ClientSize.Height - hf) / 2;

c = ClientSize.Width;

d = (ClientSize.Height + hf) / 2;

}

else

{

hf = ClientSize.Height;

wf = (xmax - xmin) * hf / (ymax - ymin);

a = (ClientSize.Width - wf) / 2;

b = 0;

c = (ClientSize.Width + wf) / 2;

d = ClientSize.Height;

}

ax = (c - a) / (xmax - xmin + 2 * dx);

ay = (b - d) / (ymax - ymin + 2 * dy);

bx = a - ax * (xmin - dx);

by = b - ay * (ymax + dy);

g.Transform = new Matrix(ax, 0, 0, ay, bx, by);

float hline = (xmax - xmin) * 0.001f;

Pen blackPen = new Pen(Color.Black, hline);

Pen bluePen = new Pen(Color.Blue, hline);

t = tmin;

g.DrawLine(bluePen, xmin, 0, xmax, 0);

g.DrawLine(bluePen, 0, ymin, 0, ymax);

while (t <= tmax)

{

g.DrawLine(blackPen, F1(t), F2(t), F1(t + h), F2(t + h));

t = t + h;

}

}

private float F1(float x)

{

return (float)(6 * Math.Cos(x) + 2 * Math.Cos(6 * x));

}

private float F2(float x)

{

return (float)(6 * Math.Sin(x) - 2 * Math.Sin(6 * x));

}

private void Form1_Resize(object sender, EventArgs e)

{

Invalidate();

}

}

}

Рисунок 1.2 Реализация программы, которая строит двумерный график функции, заданной параметрически