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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    105,47 Кб
  • Опубликовано:
    2015-03-18
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Компьютерная графика средствами 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.

Похожие работы на - Компьютерная графика средствами Windows Forms

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!