using System using System Collections Generic using System ComponentMo

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
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 Graphics_lab_5
{
public partial class Form1 : Form
{
const int N = 3;
int[] x = new int[N];//массивы под вершины
int[] y = new int[N];//
int i = 0;
Pen bluePen = new Pen(Color.Blue, 2f);//ручка для рисования - синий цвет, толщина 2ф
public Form1()
{
InitializeComponent();
}
private void ClickMouse(object sender, MouseEventArgs e)//обработчик событий нажатия мышки
{
Graphics g = Graphics.FromHwnd(this.Handle);//переменная для рисования на форме
if (e.Button == MouseButtons.Left)//если нажата левая кнопка мыши, то выполняем тело условия
{
if (i >= N)//костыль для того, чтобы нельзя было поставить больше 3 вершин
{
}
else
{
x[i] = e.Location.X;//запоминаем текущее расположение нажатой точки
y[i] = e.Location.Y;//по Х и У и записываем в массивы
g.DrawRectangle(bluePen, e.Location.X, e.Location.Y, 1, 1);//рисуем эту точку
i++;//перекидываемся на следующий элемент массива
}
}
if (e.Button == MouseButtons.Right)//если нажата правая кнопка мыши, то выполняем тело условия
{
g.DrawLine(bluePen, x[0], y[0], x[1], y[1]);//соединяем все вершины
g.DrawLine(bluePen, x[1], y[1], x[2], y[2]);//между
g.DrawLine(bluePen, x[2], y[2], x[0], y[0]);//собой
}
}
private void button1_Click(object sender, EventArgs e)//в этой кнопке тупо чистим форму от того, что нарисовали
{
Graphics g = Graphics.FromHwnd(this.Handle);//переменная для рисования на форме
g.Clear(Color.White);//метод чистки под цвет
i = 0;//обнуляем счетчик
}
private void button2_Click(object sender, EventArgs e)//кнопка выполнения алгоритма
{
FillTriangle(x, y);//выполняем функцию заливки
}
private void swap(ref int a, ref int b)//функция свап для 2 переменных
{
int temp = 0;
temp = a;
a = b;
b = temp;
}
private void swap4(ref int a, ref int b, ref int c, ref int d)//свап для 4х, тут обмен идет попарно: 1 с 2, 3 с 4
{
int temp = 0;
temp = a;
a = b;
b = temp;
temp = c;
c = d;
d = temp;
}
//если забыл, то свап тупо меняет местами переменные
private void FillTriangle(int []X, int[]Y)
{
Graphics g = Graphics.FromHwnd(this.Handle);//переменная для рисования на форме
int xb = 0, xe = 0, scanline = 0; //xb и хе тупо отвечают за положения концов нашего отрезка по
// координате Х, сканлайн значение по У нашего отрезка
if (Y[0] > Y[1]) swap4(ref Y[0], ref Y[1], ref X[0], ref X[1]); //тут тупо ищем самую верхнюю вершину
if (Y[1] > Y[2]) swap4(ref Y[1], ref Y[2], ref X[1], ref X[2]); //
if (Y[0] > Y[1]) swap4(ref Y[0], ref Y[1], ref X[0], ref X[1]); //
if ((Y[0] == Y[1]) && (Y[1] == Y[2])) return; // проверка того, что у нас треугольник выглядит как //линяя, если так, то выходим из функции
for (scanline = Y[0]; scanline < Y[1]; ++scanline) // идем от самой верхней вершины, до средней
{ // по У
xb = X[1] + (scanline - Y[1]) * (X[0] - X[1]) / (Y[0] - Y[1]); // Тут по спец. формулам
xe = X[2] + (scanline - Y[2]) * (X[0] - X[2]) / (Y[0] - Y[2]); // высчитываем наши хб и хе
if (xb > xe) swap(ref xb, ref xe); // если выполнено условие, то меняем местами, т.к. хе должен
// быть больше хб, ибо хе - координата по Х слева, а хб -
// справа
g.DrawLine(bluePen, xb, scanline, xe, scanline); // рисуем линюю
}
for (scanline = Y[1]; scanline < Y[2]; ++scanline) // идем от средней вершины, до самой нижней по У
{
xb = X[2] + (scanline - Y[2]) * (X[1] - X[2]) / (Y[1] - Y[2]); // Опять подсчитываем хб и хе
xe = X[2] + (scanline - Y[2]) * (X[0] - X[2]) / (Y[0] - Y[2]);
if (xb > xe) swap(ref xb, ref xe);// опять меняем местами при надобности
g.DrawLine(bluePen, xb, scanline, xe, scanline); // опять рисуем
}
}// вот и вся программа
}
}