Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное
учреждение высшего профессионального образования
«Комсомольский-на-Амуре государственный
технический университет»
Факультет компьютерных технологий
Кафедра «Прикладная математика и информатика»
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе
по дисциплине «Интерактивная компьютерная графика»
Компьютерная графика средствами 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 Реализация программы, которая строит двумерный график функции, заданной параметрически