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); // опять рисуем
}
}// вот и вся программа
}
}