Компьютерная графика средствами Windows Forms
Введение
двумерный графика проекция
координата
Существует немало языков
программирования, но лишь немногие из них действительно хороши. Хороший язык
программирования должен быть одновременно эффективным и гибким, а его синтаксис
- кратким, но ясным. Он должен облегчать создание правильного кода, не мешая
делать это, а также поддерживать самые современные возможности
программирования, но не ультрамодные тенденции, заводящие в тупик. И наконец,
хороший язык программирования должен обладать еще одним, едва уловимым
качеством: вызывать у нас такое ощущение, будто мы находимся в своей стихии,
когда пользуемся им. Именно таким языком и является С# [1].
Данная работа посвящена изучению
некоторых разделов интерактивной компьютерной графики средствами C#.
1. Двумерная графика
Задача: Написать программу, которая
строит график функции на отрезке [a, b], заданной явно. Подобрать отрезок [a, b], который содержит только одну
точку разрыва [2].
Решение:
using System;System.
Collections. Generic;System. ComponentModel;System. Data;System.
Drawing;System. Linq;System. Text;System. Windows. Forms;System. Drawing.
Drawing2D;WindowsFormsApplication5
{partial class Form1:
Form
{Form1 ()
{();
}override void OnPaint
(PaintEventArgs e)
{. OnPaint(e);g = e.
Graphics;xmin, xmax, ymin, ymax, x, y, h;r = 3;eps = 0.001;= 1; xmax = 6;=
(xmax - xmin) / 500;= F(xmin);= ymin;= xmin + h;(x = xmin; x < r-eps; x = x
+ h)
{= F(x);(y < ymin)
ymin = y;(y > ymax) ymax = y;
}(x = r + h; x <=
xmax; x = x + h)
{= F(x);(y < ymin)
ymin = y;(y > ymax) ymax = y;
}dx = (xmax - xmin) *
0.03f;dy = (ymax - ymin) * 0.03f;ax = ClientSize. Width / (xmax - xmin + 2 *
dx);ay = - ClientSize. Height / (ymax - ymin + 2 * dy);bx = - ax * (xmin -
dx);by = - ay * (ymax + dy);. Transform = new Matrix (ax, 0, 0, ay, bx, by);hf,
wf, a, b, c, d;asm = (xmax - xmin) / (ymax - ymin);asf = (float) ClientSize.
Width / (float) ClientSize. Height;(asm > asf)
{= ClientSize. Width;=
(ymax - ymin) * wf / (xmax - xmin);= 0;= (ClientSize. Height - hf) / 2;=
ClientSize. Width;= (ClientSize. Height + hf) / 2;
}
{= ClientSize. Height;=
(xmax - xmin) * hf / (ymax - ymin);= (ClientSize. Width - wf) / 2;= 0;=
(ClientSize. Width + wf) / 2;= ClientSize. Height;
}= (c - a) / (xmax -
xmin + 2 * dx);= (b - d) / (ymax - ymin + 2 * dy);= a - ax * (xmin - dx);= b -
ay * (ymax + dy);hline = (xmax - xmin) * 0.001f;blackPen = new Pen (Color.
Black, hline);bluePen = new Pen (Color. Blue, hline);= xmin;. DrawLine
(bluePen, xmin, 0, xmax, 0);. DrawLine (bluePen, 0, ymin, 0, ymax);(x <= r -
h)
{. DrawLine (blackPen,
x, F(x), x + h, F (x + h));= x + h;
}= r + h;(x <= xmax)
{. DrawLine (blackPen,
x, F(x), x + h, F (x + h));= x + h;
}
}float F (float x)
{x / (x * x - 9);
}void Form1_Resize
(object sender, EventArgs e)
{();
}
}
}
Рисунок 1.1 Реализация программы, которая строит двумерный график
функции, заданной явно, с одной точкой разрыва
Задача: Написать программу, которая строит график функции на
отрезке [a, b], заданной
параметрически.
Решение:
using System;System.
Collections. Generic;System. ComponentModel;System. Data;System.
Drawing;System. Linq;System. Text;System. Windows. Forms;System.
Drawing;System. Drawing. Drawing2D;WindowsFormsApplication1
{partial class Form1:
Form
{Form1 ()
{();
}override void OnPaint
(PaintEventArgs e)
{. OnPaint(e);g = e.
Graphics;xmin, xmax, ymin, ymax, x, t, y, h;tmin = -5, tmax = 5;= F1 (tmin);
xmax = F1 (tmax);= (tmax - tmin) / 500;= F2 (tmin);= ymin;= tmin + h;(t = tmin;
t < tmax; t = t + h)
{= F1 (t);(x < xmin)
xmin = x;(x > xmax) xmax = x;= F2 (t);(y < ymin) ymin = y;(y > ymax)
ymax = y;
}dx = (xmax - xmin) *
0.03f;dy = (ymax - ymin) * 0.03f;ax = ClientSize. Width / (xmax - xmin + 2 *
dx);ay = - ClientSize. Height / (ymax - ymin + 2 * dy);bx = - ax * (xmin -
dx);by = - ay * (ymax + dy);hf, wf, a, b, c, d;asm = (xmax - xmin) / (ymax -
ymin);asf = (float) ClientSize. Width / (float) ClientSize. Height;(asm >
asf)
{= ClientSize. Width;=
(ymax - ymin) * wf / (xmax - xmin);= 0;= (ClientSize. Height - hf) / 2;=
ClientSize. Width;= (ClientSize. Height + hf) / 2;
}
{= ClientSize. Height;=
(xmax - xmin) * hf / (ymax - ymin);= (ClientSize. Width - wf) / 2;= 0;=
(ClientSize. Width + wf) / 2;= ClientSize. Height;
}= (c - a) / (xmax -
xmin + 2 * dx);= (b - d) / (ymax - ymin + 2 * dy);= a - ax * (xmin - dx);= b -
ay * (ymax + dy);. Transform = new Matrix (ax, 0, 0, ay, bx, by);hline = (xmax
- xmin) * 0.001f;blackPen = new Pen (Color. Black, hline);bluePen = new Pen
(Color. Blue, hline);= tmin;. DrawLine (bluePen, xmin, 0, xmax, 0);. DrawLine
(bluePen, 0, ymin, 0, ymax);(t <= tmax)
{. DrawLine (blackPen,
F1 (t), F2 (t), F1 (t + h), F2 (t + h));= t + h;
}
}float F1 (float x)
{(float) (6 * Math.
Cos(x) + 2 * Math. Cos (6 * x));
}float F2 (float x)
{(float) (6 * Math.
Sin(x) - 2 * Math. Sin (6 * x));
}void Form1_Resize
(object sender, EventArgs e)
{();
}
}
}
Рисунок 1.2 Реализация программы, которая строит двумерный график
функции, заданной параметрически
2. Преобразования двумерных координат
Задача: Написать программу, демонстрирующую преобразование
двумерных координат (перенос, поворот и масштабирование). Вывести график
функции до преобразования и после него в одном окне [2].
Решение:
using System;System.
Collections. Generic;System. ComponentModel;System. Data;System.
Drawing;System. Linq;System. Text;System. Windows. Forms;System.
Drawing;System. Drawing. Drawing2D;WindowsFormsApplication1
{partial class Form1:
Form
{Form1 ()
{();
}float transX (float x,
float y, float Alfa, float d, float s)
{(float) ((s * x * Math.
Cos(Alfa) + s * y * Math. Sin(Alfa) + d));
{(float) (-s * x * Math.
Sin(Alfa) + s * y * Math. Cos(Alfa) + d);
}override void OnPaint (PaintEventArgs
e)
{. OnPaint(e);g = e.
Graphics;fi, fimin, fimax, xmin, xmax, ymin, ymax, x, y, h, x2, y2;tx, ty,
Alfa, s;= 2;= 10; ty = 7; Alfa = (float) (Math.PI) / 6;= 0; fimax = (float) (4
* (Math.PI));= (fimax - fimin) / 100;= (float) (F(fimin) * Math. Cos(fimin));=
(float) (F(fimin) * Math. Sin(fimin));= xmin;= ymin;= fimin + h;(fi < fimax)
{= (float) (F(fi) *
Math. Cos(fi));(x < xmin) xmin = x;(x > xmax) xmax = x;= (float) (F(fi) *
Math. Sin(fi));(y < ymin) ymin = y;(y > ymax) ymax = y;= transX (x, y,
Alfa, tx, s);(x2 < xmin) xmin = x2;(x2 > xmax) xmax = x2;= transY (x, y,
Alfa, ty, s);(y2 < ymin) ymin = y2;(y2 > ymax) ymax = y2;= fi + h;
}dx = (xmax - xmin) *
0.03f;dy = (ymax - ymin) * 0.03f;ax = ClientSize. Width / (xmax - xmin + 2 *
dx);ay = - ClientSize. Height / (ymax - ymin + 2 * dy);bx = - ax * (xmin -
dx);by = - ay * (ymax + dy);hf, wf, a, b, c, d;asm = (xmax - xmin) / (ymax -
ymin);asf = (float) ClientSize. Width / (float) ClientSize. Height;(asm >
asf)
{= ClientSize. Width;=
(ymax - ymin) * wf / (xmax - xmin);= 0;= (ClientSize. Height - hf) / 2;=
ClientSize. Width;= (ClientSize. Height + hf) / 2;
}
{= ClientSize. Height;=
(xmax - xmin) * hf / (ymax - ymin);= (ClientSize. Width - wf) / 2;= 0;=
(ClientSize. Width + wf) / 2;= ClientSize. Height;
}= (c - a) / (xmax -
xmin + 2 * dx);= (b - d) / (ymax - ymin + 2 * dy);= a - ax * (xmin - dx);= b -
ay * (ymax + dy);. Transform = new Matrix (ax, 0, 0, ay, bx, by);hline = (xmax
- xmin) * 0.001f;blackPen = new Pen (Color. Black, hline);bluePen = new Pen
(Color. Blue, hline);. DrawLine (bluePen, xmin, 0, xmax, 0);. DrawLine
(bluePen, 0, ymin, 0, ymax);= fimin;(fi <= fimax)
{. DrawLine (blackPen,
(float) (F(fi) * Math. Cos(fi)), (float) (F(fi) * Math. Sin(fi)), (float) (F
(fi + h) * Math. Cos (fi + h)), (float) (F (fi + h) * Math. Sin (fi + h)));= fi
+ h;
}= fimin;(fi <=
fimax)
{= (float) (F(fi) *
Math. Cos(fi));= (float) (F(fi) * Math. Sin(fi));= (float) (F (fi + h) * Math.
Cos (fi + h));= (float) (F (fi + h) * Math. Sin (fi + h));. DrawLine (blackPen,
transX (x, y, Alfa, tx, s), transY (x, y, Alfa, ty, s), transX (x2, y2, Alfa,
tx, s), transY (x2, y2, Alfa, ty, s));= fi + h;
}
}float F (float fi)
{3 * (1 + (float) (Math.
Cos(fi)));
}void Form1_Resize
(object sender, EventArgs e)
{();
}
}
}
Рисунок 2.1 Реализация программы, демонстрирующей преобразование
двумерных координат
. Метод сканирующей строки
Задача: Разработать алгоритм и написать программу, демонстрирующую
метод сканирующей строки для закрашивания треугольных областей [2].
Решение:
Класс:
using System;System.
Collections. Generic;System. Linq;System. Text;System. Drawing;System. Drawing.
Drawing2D;System. Collections;Laba3
{FillTriangle
{void Fill (Graphics g,
int[] x, int[] y, int[] rgb)
{maxy, miny;= y[0];=
maxy;(y[1] > maxy) maxy = y[1];(y[2] > maxy) maxy = y[2];(y[1] < miny)
miny = y[1];(y[2] < miny) miny = y[2];t;mas = new ArrayList();myPen = new
Pen (Color. FromArgb (255, rgb[0], rgb[1], rgb[2]));(int yt = miny; yt <=
maxy; yt++)
{. Clear();(y[0]!=y[1])
{= (float)
(yt-y[1])/(float) (y[0] - y[1]);(t>=0 && t<=1). Insert (0, (int)
(t*x[0] + (1-t)*x[1]));
}
{= (float)
(yt-y[2])/(float) (y[1] - y[2]);(t>=0 && t<=1). Insert (0, (int)
(t*x[1] + (1-t)*x[2]));
}
{= (float)
(yt-y[2])/(float) (y[0] - y[2]);(t>=0 && t<=1). Insert (0, (int)
(t*x[0] + (1-t)*x[2]));
}. DrawLine (myPen,
(int) mas[0], yt, (int) mas[1], yt);(mas. Count == 3)
{. DrawLine (myPen,
(int) mas[1], yt, (int) mas[2], yt);
}
}
}
}
}
Форма:System;System. Collections.
Generic;System. ComponentModel;System. Data;System. Drawing;System.
Linq;System. Text;System. Windows. Forms;System. Drawing;System. Drawing.
Drawing2D;Laba3
{partial class Form1:
Form
{int k = 0;int[] x = new
int[3];int[] y = new int[3];int[] rgb = new int[3];Form1 ()
{();
}void Form1_MouseDown
(object sender, MouseEventArgs e)
{(k <= 2)
{[k] = e.X;[k] = e.Y;(k
== 2)
{[0] = 255;[2] = 0;[2] =
0;g = Graphics. FromHwnd (this. Handle);f = new FillTriangle();. Fill (g, x, y,
rgb);. Dispose();
}++;
};
}
}
}
Рисунок 3.1 Реализация программы, демонстрирующей метод
сканирующей строки для закрашивания треугольных областей
. Параллельная проекция
Задача: Написать программу, которая строит на экране изображение
выпуклого трехмерного тела при параллельной проекции. Удалить невидимые грани.
Видимые грани закрасить оттенками серого цвета в зависимости от расположения
соответствующей грани и источника света. Для закрашивания граней использовать
метод сканирующей строки [2].
Решение:
Класс:
using System;
using System.
Collections. Generic;System. Linq;System. Text;System. Drawing;System.
Collections;Triangle
{FillTriangle
{void Fill (Graphics g,
int[] x, int[] y, int[] rgb)
{maxy, miny;mas = new
ArrayList();a;myPen = new Pen (Color. FromArgb (255, rgb[0], rgb[1],
rgb[2]));(Math. Abs((x[1] - x[0]) * (y[2] - y[0]) - (x[2] - x[0]) * (y[1] -
y[0])) <= 0.001)
{. DrawLine (myPen,
x[0], y[0], x[1], y[1]);. DrawLine (myPen, x[1], y[1], x[2], y[2]);;
}= y[0];= maxy;(int i =
1; i <= 2; i++)
{(y[i] > maxy) maxy =
y[i];(y[i] < miny) miny = y[i];
{. Clear();(y[0]!= y[1])
{= (float) (yt -
y[1])/(float) (y[0] - y[1]);(a >= 0 && a <= 1)
{. Insert (0, (int) (a *
x[0] + (1 - a) * x[1]));
}
}(y[1]!= y[2])
{= (float) (yt - y[2]) /
(float) (y[1] - y[2]);(a >= 0 && a <= 1)
{. Insert (0, (int) (a *
x[1] + (1 - a) * x[2]));
}
}(y[0]!= y[2])
{= (float) (yt - y[2]) /
(float) (y[0] - y[2]);(a >= 0 && a <= 1)
{. Insert (0, (int) (a *
x[0] + (1 - a) * x[2]));
}
}(mas. Count == 3)
{. DrawLine (myPen,
(int) mas[0], yt, (int) mas[1], yt);. DrawLine (myPen, (int) mas[1], yt, (int)
mas[2], yt);
}. DrawLine (myPen,
(int) mas[0], yt, (int) mas[1], yt);
}
}
}
}
Форма:System;System. Collections.
Generic;System. ComponentModel;System. Data;System. Drawing;System.
Linq;System. Text;System. Windows. Forms;System. Drawing. Drawing2D;Lab_4
{partial class Form1:
Form
{double[] xv = {0, 2, 0,
0, 2, 0};double[] yv = {0, 0, 2, 0, 0, 2};double[] zv = {0, 0, 0, 2, 2,
2};double[] xpl = new double[6];double[] ypl = new double[6];int[] xfrm = new
int[6];int[] yfrm = new int[6];int[,] gran1 = new int [3, 4];int[,] gran2 = new
int [2, 3];double u1x, u1y, u1z, u2x, u2y, u2z, u3x, u3y, u3z;double rx, ry,
rz;double ax, ay, az;double sx, sy, sz;double r;double a, b, c, d;Form1 ()
{();
}void Form1_Load (object
sender, EventArgs e)
{= 10; ry = 5; rz = 5;=
1; ay = 1; az = 1;= -5; sy = 1; sz = 5;= Math. Sqrt(3);x = ax - rx; u3y = ay -
ry; u3z = az - rz;t = Math. Sqrt (u3x * u3x + u3y * u3y + u3z * u3z);x = u3x /
t; u3y = u3y / t; u3z = u3z / t;x = u3y; u1y = - u3x; u1z = 0;= Math. Sqrt (u1x
* u1x + u1y * u1y + u1z * u1z);x = u1x / t; u1y = u1y / t; u1z = u1z / t;x =
u1y * u3z - u3y * u1z; u2y = u3x * u1z - u1x * u3z; u2z = u1x * u3y - u3x *
u1y;= Math. Sqrt (u2x * u2x + u2y * u2y + u2z * u2z);x = u2x / t; u2y = u2y /
t; u2z = u2z / t;[1, 0] = 0; gran1 [1, 1] = 1; gran1 [1, 2] = 4; gran1 [1, 3] =
3;[0, 0] = 0; gran1 [0, 1] = 3; gran1 [0, 2] = 5; gran1 [0, 3] = 2;[2, 0] = 1;
gran1 [2, 1] = 2; gran1 [2, 2] = 5; gran1 [2, 3] = 4;[0, 0] = 0; gran2 [0, 1] =
2; gran2 [0, 2] = 1;[1, 0] = 3; gran2 [1, 1] = 4; gran2 [1, 2] = 5;(int i = 0;
i < xv. Length; i++)
{[i] = px (xv[i], yv[i],
zv[i]);[i] = py (xv[i], yv[i], zv[i]);
}();
}double px (double x,
double y, double z)
{((x - rx) * u1x + (y -
ry) * u1y + (z - rz) * u1z);
}double py (double x,
double y, double z)
{((x - rx) * u2x + (y -
ry) * u2y + (z - rz) * u2z);
}void Ini()
{wp, hp;(ClientSize.
Width >= ClientSize. Height)
{= 2 * r * ClientSize.
Width / ClientSize. Height; hp = 2 * r;
}
{= 2 * r; hp = 2 * r *
ClientSize. Height / ClientSize. Width;
}= ClientSize. Width /
wp;= ClientSize. Width / 2;= - ClientSize. Height / hp;= ClientSize. Height /
2;
}override void OnPaint
(PaintEventArgs e)
{. OnPaint(e);g=e.
Graphics;. Clear (Color. White);(int i=0; i<xv. Length; i++)
{[i]=fx (xpl[i]);[i]=fy
(ypl[i]);
}bx, by, bz, cx, cy, cz,
nx, ny, nz;[] rgb=new int[3];[] x=new int[3]; int[] y=new int[3];cosfi;.
FillTriangle myFill=new Triangle. FillTriangle();(int i=0; i<=2; i++)
{=xv [gran1 [i, 1]] - xv
[gran1 [i, 0]];=yv [gran1 [i, 1]] - yv [gran1 [i, 0]];=zv [gran1 [i, 1]] - zv
[gran1 [i, 0]];=xv [gran1 [i, 2]] - xv [gran1 [i, 0]];=yv [gran1 [i, 2]] - yv
[gran1 [i, 0]];=zv [gran1 [i, 2]] - zv [gran1 [i, 0]];=by*cz-bz*cy;=bz*cx-bx*cz;=bx*cy-by*cx;(nx*u3x+ny*u3y+nz*u3z>0)
{=xv [gran1 [i, 0]];
by=yv [gran1 [i, 0]]; bz=zv [gran1 [i, 0]];(int j=1; j<=3; j++)
{+=xv [gran1 [i, j]];
by+=yv [gran1 [i, j]]; bz+=zv [gran1 [i, j]];
}=bx/4; by=by/4;
bz=bz/4;=bx-sx; cy=by-sy; cz=bz-sz;=(nx*cx+ny*cy+nz*cz)/ (Math. Sqrt
(nx*nx+ny*ny+nz*nz)*Math. Sqrt (cx*cx+cy*cy+cz*cz));[0]=(int)
(-255*cosfi/2+255/2);[1]=rgb[0]; rgb[2]=rgb[0];[0]=xfrm [gran1 [i, 0]];
y[0]=yfrm [gran1 [i, 0]];[1]=xfrm [gran1 [i, 1]]; y[1]=yfrm [gran1 [i,
1]];[2]=xfrm [gran1 [i, 2]]; y[2]=yfrm [gran1 [i, 2]];. Fill (g, x, y,
rgb);[0]=xfrm [gran1 [i, 0]]; y[0]=yfrm [gran1 [i, 0]];[1]=xfrm [gran1 [i, 2]];
y[1]=yfrm [gran1 [i, 2]];[2]=xfrm [gran1 [i, 3]]; y[2]=yfrm [gran1 [i, 3]];.
Fill (g, x, y, rgb);
}
}(int i = 0; i <= 1;
i++)
{= xv [gran2 [i, 1]] -
xv [gran2 [i, 0]];= yv [gran2 [i, 1]] - yv [gran2 [i, 0]];= zv [gran2 [i, 1]] -
zv [gran2 [i, 0]];= xv [gran2 [i, 2]] - xv [gran2 [i, 0]];= yv [gran2 [i, 2]] -
yv [gran2 [i, 0]];= zv [gran2 [i, 2]] - zv [gran2 [i, 0]];= by * cz - bz * cy;=
bz * cx - bx * cz;= bx * cy - by * cx;(nx * u3x + ny * u3y + nz * u3z > 0)
{= xv [gran2 [i, 0]]; by
= yv [gran2 [i, 0]]; bz = zv [gran2 [i, 0]];(int j = 1; j <= 2; j++)
{+= xv [gran2 [i, j]];
by += yv [gran2 [i, j]]; bz += zv [gran2 [i, j]];
}= bx / 3; by = by / 3;
bz = bz / 3;= bx - sx; cy = by - sy; cz = bz - sz;= (nx * cx + ny * cy + nz *
cz) / (Math. Sqrt (nx * nx + ny * ny + nz * nz) * Math. Sqrt (cx * cx + cy * cy
+ cz * cz));[0] = (int) (-255 * cosfi/2+255/2);[1] = rgb[0]; rgb[2] =
rgb[0];[0] = xfrm [gran2 [i, 0]]; y[0] = yfrm [gran2 [i, 0]];[1] = xfrm [gran2
[i, 1]]; y[1] = yfrm [gran2 [i, 1]];[2] = xfrm [gran2 [i, 2]]; y[2] = yfrm
[gran2 [i, 2]];. Fill (g, x, y, rgb);[0] = xfrm [gran2 [i, 0]]; y[0] = yfrm
[gran2 [i, 0]];[1] = xfrm [gran2 [i, 1]]; y[1] = yfrm [gran2 [i, 1]];[2] = xfrm
[gran2 [i, 2]]; y[2] = yfrm [gran2 [i, 2]];. Fill (g, x, y, rgb);
}
}
}int fx (double x)
{(int) (a*x+b);
}int fy (double y)
{(int) (c*y+d);
}void Form1_Resize
(object sender, EventArgs e)
{();();
}
}
}
Рисунок 4.1 Реализация программы, которая строит на экране
изображение выпуклого трехмерного тела при параллельной проекции
. Центральная проекция
Задача: Написать программу, которая строит на экране изображение
выпуклого трехмерного тела при центральной проекции. Удалить невидимые грани.
Видимые грани закрасить оттенками серого цвета в зависимости от расположения
соответствующей грани и источника света. Для закрашивания граней использовать
метод сканирующей строки [2].
Решение:
Класс:
using System;
using System.
Collections. Generic;System. Linq;System. Text;System. Drawing;System.
Collections;WindowsFormsApplication1
{void Fill (Graphics g,
int[] x, int[] y, int[] rgb)
{maxy, miny;mas = new
ArrayList();a; // Параметр альфа= y[0]; maxy = miny;(int i = 1; i
< 3; i++)
{(y[i] > maxy) maxy =
y[i];(y[i] < miny) miny = y[i];
}myPen = new Pen (Color.
FromArgb (255, rgb[0], rgb[1], rgb[2]));(int yt = miny; yt < maxy; yt++)
{. Clear();(y[0]!= y[1])
{= (float) (yt-y[1]) /
(float) (y[0] - y[1]);(a>=0&&a<=1). Insert (0, (int)
(a*x[0]+(1-a)*x[1]));
}(y[0]!= y[2])
{= (float) (yt - y[2]) /
(float) (y[0] - y[2]);(a >= 0 && a <= 1). Insert (0, (int) (a *
x[0] + (1 - a) * x[2]));
}(y[1]!= y[2])
{= (float) (yt - y[2]) /
(float) (y[1] - y[2]);(a >= 0 && a <= 1). Insert (0, (int) (a *
x[1] + (1 - a) * x[2]));
}(mas. Count == 3).
DrawLine (myPen, (int) mas[1], yt, (int) mas[2], yt);. DrawLine (myPen, (int)
mas[0], yt, (int) mas[1], yt);
}
}
}
}
Форма:System;System. Collections. Generic;System.
ComponentModel;System. Data;System. Drawing;System. Linq;System. Text;System.
Windows. Forms;WindowsFormsApplication1
{partial class Form1:
Form
{Form1 ()
{();
}[] xv = {0, 0, 30, 30,
15, 15};[] yv = {0, -30, -30, 0, -15, -15};[] zv = {0, 0, 0, 0, 30, -30};[] xpl
= new double[6];[] ypl = new double[6];[] xfrm = new int[6];[] yfrm = new
int[6];[,] gran = new int [8, 3];u1x, u1y, u1z, u2x, u2y, u2z, u3x, u3y,
u3z;rx, ry, rz, ax, ay, az, sx, sy, sz;r1, r2, a, b, c, d, fd, rd, gx, gy, gz;void
Form1_Load (object sender, EventArgs e)
{= 15; ay = -15; az =
0;= 20;= 90; sy = -60; sz = 50;= 100; gy = 30; gz = 20;= 35;x = ax - gx; u3y =
ay - gy; u3z = az - gz;m = Math. Sqrt (u3x * u3x + u3y * u3y + u3z * u3z);x =
u3x / m; u3y = u3y / m; u3z = u3z / m;x = u3y; u1y = - u3x; u1z = 0;= Math.
Sqrt (u1x * u1x + u1y * u1y + u1z * u1z);x = u1x / m; u1y = u1y / m; u1z = u1z
/ m;x = - u3y * u1z + u1y * u3z;y = - u1x * u3z + u3x * u1z;z = - u3x * u1y +
u1x * u3y;= Math. Sqrt (u2x * u2x + u2y * u2y + u2z * u2z);x = u2x / m; u2y =
u2y / m; u2z = u2z / m;= gx + u3x * fd;= gy + u3y * fd;= gz + u3z * fd;=Math.
Sqrt (Math. Pow (rx-ax, 2)+Math. Pow (ry-ay, 2)+Math. Pow (rz-az, 2));=
r1*fd/(rd+fd);[0, 0] = 1; gran [0, 1] = 4; gran [0, 2] = 0;[1, 0] = 1; gran [1,
1] = 2; gran [1, 2] = 4;[2, 0] = 2; gran [2, 1] = 3; gran [2, 2] = 4;[3, 0] =
3; gran [3, 1] = 0; gran [3, 2] = 4;[4, 0] = 5; gran [4, 1] = 1; gran [4, 2] =
0;[5, 0] = 1; gran [5, 1] = 5; gran [5, 2] = 2;[6, 0] = 5; gran [6, 1] = 3;
gran [6, 2] = 2;[7, 0] = 5; gran [7, 1] = 0; gran [7, 2] = 3;(int i = 0; i <
6; i++)
{[i] = px (xv[i], yv[i],
zv[i]);[i] = py (xv[i], yv[i], zv[i]);
}();
}double px (double x,
double y, double z)
{sc1 = ((x - rx) * u1x +
(y - ry) * u1y + (z - rz) * u1z);sc2 = ((x - rx) * u3x + (y - ry) * u3y + (z -
rz) * u3z);fd * sc1 / (sc2 + fd);
}double py (double x,
double y, double z)
{sc1 = ((x - rx) * u2x +
(y - ry) * u2y + (z - rz) * u2z);sc2 = ((x - rx) * u3x + (y - ry) * u3y + (z -
rz) * u3z);fd * sc1 / (sc2 + fd);
}void Ini()
{wp, hp;(ClientSize.
Width >= ClientSize. Height)
{= 2 * r2 * ClientSize.
Width / ClientSize. Height;= 2 * r2;
}
{= 2 * r2;= 2 * r2 *
ClientSize. Height / ClientSize. Width;
}= ClientSize. Width /
wp;= ClientSize. Width / 2;= - ClientSize. Height / hp;= ClientSize. Height /
2;
}int fx (double x)
{(int) (a * x + b);
}int fy (double y)
{(int) (c * y + d);
}override void OnPaint
(PaintEventArgs e)
{. OnPaint(e);g = e.
Graphics;. Clear (Color. White);(int i = 0; i < xv. Length; i++)
{[i] = fx (xpl[i]);[i] =
fy (ypl[i]);
}bx, by, bz, cx, cy, cz,
nx, ny, nz;[] rgb = new int[3];cosfi;[] x = new int [3];[] y = new int
[3];myFill = new FillTriangle();(int i = 0; i < 8; i++)
{= xv [gran[i, 1]] - xv
[gran[i, 0]];= yv [gran[i, 1]] - yv [gran[i, 0]];= zv [gran[i, 1]] - zv
[gran[i, 0]];= xv [gran[i, 2]] - xv [gran[i, 0]];= yv [gran[i, 2]] - yv
[gran[i, 0]];= zv [gran[i, 2]] - zv [gran[i, 0]];= by * cz - bz * cy;= bz * cx
- bx * cz;= bx * cy - by * cx;= (xv [gran[i, 0]] + xv [gran[i, 1]] + xv
[gran[i, 2]]) / 3;= (yv [gran[i, 0]] + yv [gran[i, 1]] + yv [gran[i, 2]]) / 3;=
(zv [gran[i, 0]] + zv [gran[i, 1]] + zv [gran[i, 2]]) / 3;= bx - gx; cy = by -
gy; cz = bz - gz;(nx * cx + ny * cy + nz * cz < 0)
{= bx - sx; cy = by -
sy; cz = bz - sz;= (nx * cx + ny * cy + nz * cz) / (Math. Sqrt (nx * nx + ny *
ny + nz * nz) * (Math. Sqrt (cx * cx + cy * cy + cz * cz)));[0] = (int) (-255 *
cosfi / 2 + 255 / 2); //red[1] = rgb [0]; //green[2] = rgb[0]; //blue[0] = xfrm
[gran[i, 0]]; y[0] = yfrm [gran[i, 0]];[1] = xfrm [gran[i, 1]]; y[1] = yfrm
[gran[i, 1]];[2] = xfrm [gran[i, 2]]; y[2] = yfrm [gran[i, 2]];. Fill (g, x, y,
rgb);
}
}
}void Form1_Resize
(object sender, EventArgs e)
{();();
}
}
}
Рисунок 5.1 Реализация программы, которая строит на экране
изображение выпуклого трехмерного тела при центральной проекции
Заключение
В работе были изучены некоторые разделы интерактивной графики
средствами C# при помощи примеров. Данные задачи позволили хорошо рассмотреть
самые главные аспекты программирования.
Благодаря своей способности быстро приспосабливаться к постоянно
меняющимся потребностям в области программирования С# по-прежнему остается
живым и новаторским языком. А следовательно, он представляет собой один из
самых эффективных и богатых своими возможностями языков в современном
программировании. Это язык, пренебречь которым не может позволить себе ни один
программист. И эта книга призвана помочь вам овладеть им [3].
Список
использованных источников
1 Шилдт, Г. Полное руководство С#4.0 / Г. Шилдт. - М.: Вильямс,
2011.
Мак-Дональд, М. WPF Windows Presentation Foundation в.NET 4.0 с
примерами на C# 2010 для профессионалов / М. Мак-Дональд. - М.: Вильямс, 2011.
Порев, В. Компьютерная графика: учеб. Пособие / В. Порев. -
БХВ-Петербург.: 2004.