|
Графика - лаба 1. Лабораторная работа по компьютерной графике 1 примитиви и атрибуты
МИНИСТЕРСТВО НАУКИ И ОБРАЗОВАНИЯ УКРАИНЫ
Днепропетровский национальный университет железнодорожного транспорта имени академика В.А. Лазаряна
Кафедра КИТ
Лабораторная работа по компьютерной графике №1 «примитиви и атрибуты»
Выполнил:
Студент
921 группы
Сторчак Игорь
Днепропетровск
2016
Цель
Получить навыки создания простых графических изображений, и построение графика функций. Выучить графические возможности среды, в которой создавалась программа.
Общее задание
В среде разработки MS Visual Studio разработать программу для рисования графика функции.
Программа должна предоставлять возможность пользователю:
• задавать диапазон аргумента функции и значения коэффициентов функций;
• цвета и стиль начертания и заливки различных элементов графика (фона, осей, заливки и графика функции, маркеров);
• задавать вид (круг или квадрат) и размер маркеров.
Требования к графику функции:
• график функции должен полностью отображаться в указанной области;
• график должен содержать оси координат с подписями и разметкой;
• в узловых точках на графике должны отображаться маркеры.
График
Описание реализованных в программе графических примитивов их атрибутов, а также средств среды разработки программы для их отображения.
Для создания пустого изображения используем функцию Bitmap ^b = gcnew Bitmap (int width, int height) ; width – ширина изображения, height – высота изображения. Для создания поля для рисования на изображении используется функция Graphics ^gr = Graphics::FromImage(Image ^img), img – изображения. Для создания поля для рисования на некотором контроле используется функция Graphics ^gr = (Control)->CreateGraphics(), в данном случае Control - panel1. Для очистки поля используется функция (Graphics^)gr->Clear(Color color), color – цвет фона. Для рисования линии используется функция (Graphics^)gr->DrawLine(Pen^ pen, Point p1, Point p2), pen – ручка с избранным цветом для рисования, p1,p2 – точка на графике, с координатами х, y . Для выведения текста на график используется функция (Graphics^)gr->DrawString(String ^text, Font ^font, Brush ^br, float x, float y), text – Текст, который нужно вывести, Font – шрифт текста, его размер, Brush – цвет текста, х,у – координаты выведения текста. Для рисования точки или элипса используется функция (Graphics^)gr->DrawEllipse(Pen ^pen, float x, float y,float width,float height), аргумент pen – ручка сизбранным цветом для рисования, х,у – координаты, width, height – размер элипса, для точки 1,1 Для заливки элипса используется функция (Graphics^)gr->FillEllipse (Brush^ brush, float x,float y,float width, float height) , brash – заливка избранного цвета, х,у – координаты, width, height – размер элипса. Для заливки прямоугольника используется функция (Graphics^)gr->FillRectangle (Brush^ brush, float x,float y,float width, float height) , brash- заливка избранного цвета, х,у – координаты, width, height – размер прямоугольника. Для отображения изображения на поле для рисования на некотором контроле используется функция (Graphics^)gr->DrawImage(Image ^b, int x, int y) , b- изображения, х,у – координаты изображения.
Текст программы
Main.cpp
#include
#include "MyForm.h" [System::STAThread]
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
System::Windows::Forms::Application::EnableVisualStyles();
System::Windows::Forms::Application::SetCompatibleTextRenderingDefault(false);
System::Windows::Forms::Application::Run(gcnew Graphics_LR1_13::MyForm);
return 0;
}
MyForm.h
#pragma once namespace Graphics_LR1_13 { using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing; ///
/// Сводка для MyForm
///
public ref class MyForm : public System::Windows::Forms::Form
{
private:
int kx = 30, ky = 30;
Graphics ^gr;
Graphics ^gf;
int paramA = 5;
int markSize = 5;
double paramX1 = 0;
double paramX2 = 0;
Color ColorGraph = Color(Color::Red);
Color ColorBackground = Color(Color::White);
Color ColorAxis = Color(Color::Black);
Color MarkerColor = Color(Color::Green);
String ^Markerstyle = "Круг";
Panel^ panel1;
Bitmap^ b;
private: System::Windows::Forms::TrackBar^ trackBar2;
private: System::Windows::Forms::TrackBar^ trackBar1;
private: System::Windows::Forms::Button^ button4;
private: System::Windows::Forms::Button^ button3;
private: System::Windows::Forms::Button^ button2;
private: System::Windows::Forms::Button^ button1;
private: System::Windows::Forms::Label^ label7;
private: System::Windows::Forms::Label^ label6;
private: System::Windows::Forms::Label^ label5;
private: System::Windows::Forms::Label^ label4;
private: System::Windows::Forms::Label^ label3;
private: System::Windows::Forms::Label^ label2;
private: System::Windows::Forms::Label^ label1;
private: System::Windows::Forms::ComboBox^ comboBox1;
private: System::Windows::Forms::TextBox^ textBox3;
private: System::Windows::Forms::TextBox^ textBox2;
private: System::Windows::Forms::TextBox^ textBox1;
private: System::Windows::Forms::TrackBar^ trackBar4; private: System::Windows::Forms::ColorDialog^ colorDialog1; double fy(double x)
{
x = Math::Tan(x);
return x*paramA*(x*x - 1) / (1 + x*x);
}
double fx(double x)
{
x = Math::Tan(x);
return paramA*(x*x - 1) / (1 + x*x);
}
void mypaint()
{
Point AxisX1 = Point(0, panel1->Height / 2);
Point AxisX2 = Point(panel1->Width, panel1->Height / 2);
Point AxisY1 = Point(panel1->Width / 2, 0);
Point AxisY2 = Point(panel1->Width / 2, panel1->Height);
Pen ^penAxis = gcnew Pen(ColorAxis);
Pen ^penGraph = gcnew Pen(ColorGraph);
SolidBrush^ sbMark = gcnew SolidBrush(MarkerColor);
//создаём оси
gr->Clear(panel1->BackColor);
gr = Graphics::FromImage(b);
gr->DrawLine(penAxis, AxisX1, AxisX2);
gr->DrawLine(penAxis, AxisY1, AxisY2); //Рисуем черточки на оси х
int tem = 1;
for (int i = panel1->Width / 2 - kx, j = panel1->Width / 2 + kx; i > 0; i -= kx, j += kx)
{
gr->DrawLine(penAxis, Point(i, panel1->Height / 2 - kx / 6), Point(i, panel1->Height / 2 + kx / 6));
gr->DrawString((-tem).ToString(), gcnew System::Drawing::Font("Times New Roman", (float)(kx / 2.5)), Brushes::Black, Point(i - kx / 5, panel1->Height / 2 + kx / 3));
gr->DrawLine(penAxis, Point(j, panel1->Height / 2 - kx / 6), Point(j, panel1->Height / 2 + kx / 6));
gr->DrawString((tem).ToString(), gcnew System::Drawing::Font("Times New Roman", (float)(kx / 2.5)), Brushes::Black, Point(j - kx / 5, panel1->Height / 2 + kx / 3));
tem++;
}
tem = 1;
//рисуем черточки на ось у
for (int i = panel1->Height / 2 - ky, j = panel1->Height / 2 + ky; i > 0; i -= ky, j += ky)
{
gr->DrawLine(penAxis, Point(panel1->Width / 2 - ky / 6, i), Point(panel1->Width / 2 + ky / 6, i));
gr->DrawString((-tem).ToString(), gcnew System::Drawing::Font("Times New Roman", (float)(ky / 2.5)), Brushes::Black, Point(panel1->Width / 2 + ky / 3, (int)(i - ky / 2.5)));
gr->DrawLine(penAxis, Point(panel1->Width / 2 - ky / 6, j), Point(panel1->Width / 2 + ky / 6, j));
gr->DrawString((tem).ToString(), gcnew System::Drawing::Font("Times New Roman", (float)(ky / 2.5)), Brushes::Black, Point(panel1->Width / 2 + ky / 3, (int)(j - ky / 2.5)));
tem++;
}
//рисуем гр.ф. по точкам
double step = (Math::Max(kx, ky) < 31 ? 0.001 : 0.05 / Math::Max(kx, ky));
for (double i = -Math::PI / 2 + step; i < Math::PI / 2; i += step)
{
if ((paramX1 == 0 && paramX2 == 0) || (fx(i) > paramX1 - 0.1 && fx(i) < paramX2))
{
gr->DrawEllipse(penGraph, (float)(fx(i) * kx + panel1->Width / 2), (float)(-fy(i) * ky + panel1->Height / 2), (float)1, (float)1);
if ((int)fx(i) != (int)fx(i + step))
{
if (Markerstyle == "Круг") gr->FillEllipse(sbMark, (float)(fx(i) * kx + panel1->Width / 2 - markSize / 2), (float)(-fy(i) * ky + panel1->Height / 2 - markSize / 2), (float)markSize, (float)markSize);
else gr->FillRectangle(sbMark, (float)(fx(i) * kx + panel1->Width / 2 - markSize / 2), (float)(-fy(i) * ky + panel1->Height / 2 - markSize / 2), (float)markSize, (float)markSize);
}
}
}
gf->DrawImage(b, 0, 0);
} public:
MyForm(void)
{
InitializeComponent();
//
//TODO: добавьте код конструктора
//
} protected:
///
/// Освободить все используемые ресурсы.
///
MyForm()
{
if (components)
{
delete components;
}
} private:
///
/// Обязательная переменная конструктора.
///
System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code
///
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
///
void InitializeComponent(void)
{
this->panel1 = (gcnew System::Windows::Forms::Panel());
this->button4 = (gcnew System::Windows::Forms::Button());
this->button3 = (gcnew System::Windows::Forms::Button());
this->button2 = (gcnew System::Windows::Forms::Button());
this->button1 = (gcnew System::Windows::Forms::Button());
this->label7 = (gcnew System::Windows::Forms::Label());
this->label6 = (gcnew System::Windows::Forms::Label());
this->label5 = (gcnew System::Windows::Forms::Label());
this->label4 = (gcnew System::Windows::Forms::Label());
this->label3 = (gcnew System::Windows::Forms::Label());
this->label2 = (gcnew System::Windows::Forms::Label());
this->label1 = (gcnew System::Windows::Forms::Label());
this->comboBox1 = (gcnew System::Windows::Forms::ComboBox());
this->textBox3 = (gcnew System::Windows::Forms::TextBox());
this->textBox2 = (gcnew System::Windows::Forms::TextBox());
this->textBox1 = (gcnew System::Windows::Forms::TextBox());
this->trackBar4 = (gcnew System::Windows::Forms::TrackBar());
this->trackBar2 = (gcnew System::Windows::Forms::TrackBar());
this->trackBar1 = (gcnew System::Windows::Forms::TrackBar());
this->colorDialog1 = (gcnew System::Windows::Forms::ColorDialog());
this->panel1->SuspendLayout();
(cli::safe_cast(this->trackBar4))->BeginInit();
(cli::safe_cast(this->trackBar2))->BeginInit();
(cli::safe_cast(this->trackBar1))->BeginInit();
this->SuspendLayout();
//
// panel1
//
this->panel1->Controls->Add(this->button4);
this->panel1->Controls->Add(this->button3);
this->panel1->Controls->Add(this->button2);
this->panel1->Controls->Add(this->button1);
this->panel1->Controls->Add(this->label7);
this->panel1->Controls->Add(this->label6);
this->panel1->Controls->Add(this->label5);
this->panel1->Controls->Add(this->label4);
this->panel1->Controls->Add(this->label3);
this->panel1->Controls->Add(this->label2);
this->panel1->Controls->Add(this->label1);
this->panel1->Controls->Add(this->comboBox1);
this->panel1->Controls->Add(this->textBox3);
this->panel1->Controls->Add(this->textBox2);
this->panel1->Controls->Add(this->textBox1);
this->panel1->Controls->Add(this->trackBar4);
this->panel1->Controls->Add(this->trackBar2);
this->panel1->Controls->Add(this->trackBar1);
this->panel1->Location = System::Drawing::Point(0, 2);
this->panel1->Name = L"panel1";
this->panel1->Size = System::Drawing::Size(839, 516);
this->panel1->TabIndex = 0;
this->panel1->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &MyForm::panel1_Paint);
//
// button4
//
this->button4->Location = System::Drawing::Point(12, 435);
this->button4->Name = L"button4";
this->button4->Size = System::Drawing::Size(103, 23);
this->button4->TabIndex = 17;
this->button4->Text = L"Цвет фона";
this->button4->UseVisualStyleBackColor = true;
this->button4->Click += gcnew System::EventHandler(this, &MyForm::button4_Click);
//
// button3
//
this->button3->Location = System::Drawing::Point(12, 406);
this->button3->Name = L"button3";
this->button3->Size = System::Drawing::Size(103, 23);
this->button3->TabIndex = 16;
this->button3->Text = L"Цвет осей";
this->button3->UseVisualStyleBackColor = true;
this->button3->Click += gcnew System::EventHandler(this, &MyForm::button3_Click);
//
// button2
//
this->button2->Location = System::Drawing::Point(12, 375);
this->button2->Name = L"button2";
this->button2->Size = System::Drawing::Size(103, 23);
this->button2->TabIndex = 15;
this->button2->Text = L"Цвет графика";
this->button2->UseVisualStyleBackColor = true;
this->button2->Click += gcnew System::EventHandler(this, &MyForm::button2_Click);
//
// button1
//
this->button1->Location = System::Drawing::Point(711, 406);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(103, 23);
this->button1->TabIndex = 14;
this->button1->Text = L"Цвет маркеров";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);
//
// label7
//
this->label7->AutoSize = true;
this->label7->Location = System::Drawing::Point(715, 432);
this->label7->Name = L"label7";
this->label7->Size = System::Drawing::Size(99, 13);
this->label7->TabIndex = 13;
this->label7->Text = L"Размер маркеров";
//
// label6
//
this->label6->AutoSize = true;
this->label6->Location = System::Drawing::Point(715, 361);
this->label6->Name = L"label6";
this->label6->Size = System::Drawing::Size(90, 13);
this->label6->TabIndex = 12;
this->label6->Text = L"Стиль маркеров";
//
// label5
//
this->label5->AutoSize = true;
this->label5->Location = System::Drawing::Point(715, 52);
this->label5->Name = L"label5";
this->label5->Size = System::Drawing::Size(78, 13);
this->label5->TabIndex = 11;
this->label5->Text = L"Масштаб по Y";
//
// label4
//
this->label4->AutoSize = true;
this->label4->Location = System::Drawing::Point(714, 6);
this->label4->Name = L"label4";
this->label4->Size = System::Drawing::Size(78, 13);
this->label4->TabIndex = 10;
this->label4->Text = L"Масштаб по Х";
//
// label3
//
this->label3->AutoSize = true;
this->label3->Location = System::Drawing::Point(88, 20);
this->label3->Name = L"label3";
this->label3->Size = System::Drawing::Size(13, 13);
this->label3->TabIndex = 9;
this->label3->Text = L"a";
//
// label2
//
this->label2->AutoSize = true;
this->label2->Location = System::Drawing::Point(23, 41);
this->label2->Name = L"label2";
this->label2->Size = System::Drawing::Size(18, 13);
this->label2->TabIndex = 8;
this->label2->Text = L"x2";
//
// label1
//
this->label1->AutoSize = true;
this->label1->Location = System::Drawing::Point(23, 5);
this->label1->Name = L"label1";
this->label1->Size = System::Drawing::Size(18, 13);
this->label1->TabIndex = 7;
this->label1->Text = L"x1";
//
// comboBox1
//
this->comboBox1->DropDownStyle = System::Windows::Forms::ComboBoxStyle::DropDownList;
this->comboBox1->FormattingEnabled = true;
this->comboBox1->Items->AddRange(gcnew cli::array< System::Object^ >(2) { L"Круг", L"Квадрат" });
this->comboBox1->Location = System::Drawing::Point(711, 377);
this->comboBox1->Name = L"comboBox1";
this->comboBox1->Size = System::Drawing::Size(104, 21);
this->comboBox1->TabIndex = 6;
this->comboBox1->SelectedIndexChanged += gcnew System::EventHandler(this, &MyForm::comboBox1_SelectedIndexChanged);
//
// textBox3
//
this->textBox3->Location = System::Drawing::Point(72, 36);
this->textBox3->Name = L"textBox3";
this->textBox3->Size = System::Drawing::Size(42, 20);
this->textBox3->TabIndex = 5;
this->textBox3->Text = L"5";
this->textBox3->TextChanged += gcnew System::EventHandler(this, &MyForm::textBox3_TextChanged);
//
// textBox2
//
this->textBox2->Location = System::Drawing::Point(12, 54);
this->textBox2->Name = L"textBox2";
this->textBox2->Size = System::Drawing::Size(42, 20);
this->textBox2->TabIndex = 4;
this->textBox2->TextChanged += gcnew System::EventHandler(this, &MyForm::textBox2_TextChanged);
//
// textBox1
//
this->textBox1->Location = System::Drawing::Point(12, 20);
this->textBox1->Name = L"textBox1";
this->textBox1->Size = System::Drawing::Size(42, 20);
this->textBox1->TabIndex = 3;
this->textBox1->TextChanged += gcnew System::EventHandler(this, &MyForm::textBox1_TextChanged);
//
// trackBar4
//
this->trackBar4->Location = System::Drawing::Point(711, 447);
this->trackBar4->Maximum = 4;
this->trackBar4->Name = L"trackBar4";
this->trackBar4->Size = System::Drawing::Size(104, 45);
this->trackBar4->TabIndex = 2;
this->trackBar4->Value = 1;
this->trackBar4->Scroll += gcnew System::EventHandler(this, &MyForm::trackBar4_Scroll);
//
// trackBar2
//
this->trackBar2->Location = System::Drawing::Point(697, 20);
this->trackBar2->Maximum = 9;
this->trackBar2->Minimum = 1;
this->trackBar2->Name = L"trackBar2";
this->trackBar2->Size = System::Drawing::Size(104, 45);
this->trackBar2->TabIndex = 1;
this->trackBar2->Value = 5;
this->trackBar2->Scroll += gcnew System::EventHandler(this, &MyForm::trackBar2_Scroll);
//
// trackBar1
//
this->trackBar1->Location = System::Drawing::Point(697, 62);
this->trackBar1->Maximum = 9;
this->trackBar1->Minimum = 1;
this->trackBar1->Name = L"trackBar1";
this->trackBar1->Size = System::Drawing::Size(104, 45);
this->trackBar1->TabIndex = 0;
this->trackBar1->Value = 5;
this->trackBar1->Scroll += gcnew System::EventHandler(this, &MyForm::trackBar1_Scroll);
//
// MyForm
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(838, 515);
this->Controls->Add(this->panel1);
this->DoubleBuffered = true;
this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedToolWindow;
this->Name = L"MyForm";
this->Text = L"MyForm";
this->Load += gcnew System::EventHandler(this, &MyForm::MyForm_Load);
this->panel1->ResumeLayout(false);
this->panel1->PerformLayout();
(cli::safe_cast(this->trackBar4))->EndInit();
(cli::safe_cast(this->trackBar2))->EndInit();
(cli::safe_cast(this->trackBar1))->EndInit();
this->ResumeLayout(false); }
#pragma endregion private: System::Void panel1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
mypaint();
}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
if (colorDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) {
ColorGraph = colorDialog1->Color;
mypaint();
}
}
private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
if (colorDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) {
ColorAxis = colorDialog1->Color;
mypaint();
}
}
private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {
if (colorDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) {
panel1->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &MyForm::panel1_Paint);
ColorBackground = colorDialog1->Color;
panel1->BackColor = ColorBackground; }
}
private: System::Void textBox1_TextChanged(System::Object^ sender, System::EventArgs^ e) {
if (!Double::TryParse(textBox1->Text, paramX1))paramX1 = 0;
mypaint();
}
private: System::Void textBox2_TextChanged(System::Object^ sender, System::EventArgs^ e) {
if (!Double::TryParse(textBox2->Text, paramX2))paramX2 = 0;
mypaint();
}
private: System::Void textBox3_TextChanged(System::Object^ sender, System::EventArgs^ e) {
Int32::TryParse(textBox3->Text, paramA);
mypaint(); }
private: System::Void trackBar2_Scroll(System::Object^ sender, System::EventArgs^ e) {
switch (trackBar2->Value)
{
case 1: kx = 2;
break;
case 2: kx = 5;
break;
case 3:kx = 10;
break;
case 4:kx = 20;
break;
case 5:kx = 30;
break;
case 6:kx = 75;
break;
case 7:kx = 100;
break;
case 8:kx = 200;
break;
case 9: kx = 300;
break;
case 10: kx = 500;
break;
}
mypaint();
}
private: System::Void trackBar1_Scroll(System::Object^ sender, System::EventArgs^ e) {
switch (trackBar1->Value)
{
case 1: ky = 2;
break;
case 2: ky = 5;
break;
case 3:ky = 10;
break;
case 4:ky = 20;
break;
case 5:ky = 30;
break;
case 6:ky = 75;
break;
case 7:ky = 100;
break;
case 8:ky = 200;
break;
case 9: ky = 300;
break;
case 10: ky = 500;
break;
}
mypaint();
}
private: System::Void comboBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {
Markerstyle = comboBox1->Text;
mypaint();
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
if (colorDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) {
MarkerColor = colorDialog1->Color;
mypaint();
}
}
private: System::Void trackBar4_Scroll(System::Object^ sender, System::EventArgs^ e) {
switch (trackBar4->Value)
{
case 0: markSize = 3;
break;
case 1: markSize = 5;
break;
case 2: markSize = 10;
break;
case 3:markSize = 20;
break;
case 4:markSize = 40;
break;
}
mypaint();
gf->DrawImage(b, 0, 0);
}
private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) {
b = gcnew Bitmap(panel1->Width, panel1->Height);
gr = Graphics::FromImage(b);
gf = panel1->CreateGraphics(); }
};
}
Демонстрация работы программы
Результат роботы с стандартными значениями и параметрами
Результат работы с изменёнными значениями и параметрами.
Анализ результатов
Программа применяет параметры, которые задаёт пользователь, изменяет цвет фона, графика, масштабирует график, и правильно его строит по заданным значениям.
Вывод
В результате выполнения данной работы были изучены графические примитивы и их атрибуты для создания графика функции в среде MS Visual Studio на языке С++. |
|
|