Отчет_геометрия_Землянова, Еременко. Отчет программа раскраски треугольника
Скачать 129.21 Kb.
|
Министерство образования и науки Российской Федерации НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ (НИ ТГУ) Институт прикладной математики и компьютерных наук Кафедра прикладной информатики ОТЧЕТ ПРОГРАММА РАСКРАСКИ ТРЕУГОЛЬНИКА Выполнили Студентки группы № 931901 Ольга Землянова, Екатерина Еременко Томск 2022 Исходные данные для закрашивания треугольника: Вершины треугольника (x1 = 100, y1 = 100; x2 = 200, y2 = 300; x3 300, y3 200) Соответствующие вершинам цвета в RGB (255, 223, 0; 0, 183, 235; 255, 0, 255) Формула аффинного преобразования на выбранных исходных данных: Результат выполнения программы: Вывод: С помощью аффинного преобразования можно не только поворачивать, масштабировать, перемещать фигуры, но и раскрасить треугольник. Листинг программы: 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; using triangle; namespace triangle { class data //создается теругольник по заданным координатам и цветам для каждой вершины { public static double x1 = 100; public static double y1 = 100; public static double x2 = 200; public static double y2 = 300; public static double x3 = 300; public static double y3 = 200; public static UInt32 colorA = 0xFF00FFFF; public static UInt32 colorB = 0xFFFFFF00; public static UInt32 colorC = 0xFFFF00FF; } } namespace triangleRasterization { public partial class Form1 : Form { public static Bitmap image; public Form1() { InitializeComponent(); } public void Rasterization() //функция, которая будет закрашивать точки согласно вычислениям { for (int y = 0; y < pictureBox1.Height; y++) for (int x = 0; x < pictureBox1.Width; x++) image.SetPixel(x, y, Color.FromArgb((int)ShadeBackgroundPixel(x, y))); } public UInt32 ShadeBackgroundPixel(int x, int y) //алгоритм вычисления цвета { UInt32 pixelValue; double l1, l2, l3; pixelValue = 0xFFFFFFFF; l1 = ((data.y2 - data.y3) * ((double)(x) - data.x3) + (data.x3 - data.x2) * ((double)(y) - data.y3)) / ((data.y2 - data.y3) * (data.x1 - data.x3) + (data.x3 - data.x2) * (data.y1 - data.y3)); l2 = ((data.y3 - data.y1) * ((double)(x) - data.x3) + (data.x1 - data.x3) * ((double)(y) - data.y3)) / ((data.y2 - data.y3) * (data.x1 - data.x3) + (data.x3 - data.x2) * (data.y1 - data.y3)); l3 = 1 - l1 - l2; if (l1 >= 0 && l1 <= 1 && l2 >= 0 && l2 <= 1 && l3 >= 0 && l3 <= 1) //проверка точки на пренадлежность треугольнику { pixelValue = (UInt32)0xFF000000 | ((UInt32)(l1 * ((data.colorA & 0x00FF0000) >> 16) + l2 * ((data.colorB & 0x00FF0000) >> 16) + l3 * ((data.colorC & 0x00FF0000) >> 16)) << 16) | ((UInt32)(l1 * ((data.colorA & 0x0000FF00) >> 8) + l2 * ((data.colorB & 0x0000FF00) >> 8) + l3 * ((data.colorC & 0x0000FF00) >> 8)) << 8) | (UInt32)(l1 * (data.colorA & 0x000000FF) + l2 * (data.colorB & 0x000000FF) + l3 * (data.colorC & 0x000000FF)); } return pixelValue; } private void button1_Click(object sender, EventArgs e) { image = new Bitmap(pictureBox1.Width, pictureBox1.Height); //из файла data выводим заданный треугольник Rasterization(); pictureBox1.Image = image; } } } |