Графика в Windows Forms приложении (построение геометрических фигур) [закрыт]
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.
Закрыт 4 года назад .
Мне нужно построить квадрат, на одной стороне которого, как на основании, построен равносторонний треугольник со стороной a. Как составить формулу для построения равностороннего треугольника по заданной стороне и заданным координатам квадрата(чтобы треугольник строился без искажения),код:
Построение треугольника в этом примере создадим код для рисования треугольника. Координаты треугольника создаются случайным образом: Чтобы создать треугольник:
Координаты вершин треугольника будут находиться в структуре “Treyg”. Для этого создадим переменные для работы со структурой и саму структуру.
public static class tr
public static Pen MyPen;
public struct Treyg
public struct B
public struct C
С помощью датчика случайных чисел создадим координаты вершин треугольника. В данном примере размер панели взят фиксированный: 270х240.
private void treyg(object sender)
panel1.BackColor = Color.Green;
label1.Visible = false; Random r = new Random();
tr.graph = this.panel1.CreateGraphics();
tr.graph.Clear(Color.White);
tr.MyPen = new Pen(Color.Blue, 1);
tr.Treyg.A.x = r.Next(80)+10; tr.Treyg.A.y = r.Next(70)+10;
tr.Treyg.B.x = r.Next(80) + 80; tr.Treyg.B.y = r.Next(70) + 160;
tr.Treyg.C.x = r.Next(80) + 180; tr.Treyg.C.y = r.Next(70) + 80;
tr.graph.DrawEllipse(tr.MyPen, tr.Treyg.A.x, tr.Treyg.A.y, 2, 2);
tr.graph.DrawEllipse(tr.MyPen, tr.Treyg.B.x, tr.Treyg.B.y, 2, 2);
tr.graph.DrawEllipse(tr.MyPen, tr.Treyg.C.x, tr.Treyg.C.y, 2, 2);
// соединяем их линиями
tr.graph.DrawLine(tr.MyPen, tr.Treyg.A.x, tr.Treyg.A.y, tr.Treyg.B.x,
tr.graph.DrawLine(tr.MyPen, tr.Treyg.B.x, tr.Treyg.B.y, tr.Treyg.C.x,
tr.graph.DrawLine(tr.MyPen, tr.Treyg.C.x, tr.Treyg.C.y, tr.Treyg.A.x,
Будем рисовать треугольник по щелчку мыши на панели:
private void panel1_Click(object sender, EventArgs e)
Создание графика функции в этом примере создадим код для построения графика функции на интервале .
Чтобы построить график функции необходимо:
Создать объекты полотно и перо:
public static class graphiс
public static Pen MyPen;
Задать характеристики полотна и пера. Перьев может быть несколько: для построения осей и графиков.
graphic.graph = this.panel1.CreateGraphics();
graphic.graph.Clear(Color.White);
graphic.MyPen = new Pen(Color.Blue, 1);
Определить позиции начала координат и границы области рисования: X,Y — начало координат, Xmax, Ymax — границы области.
int X, Y, Xmax, Ymax;
Xmax = panel1.Size.Width; Ymax = panel1.Size.Height;
X = Xmax / 2; Y = Ymax / 2;
Построить оси декартовой системы координат:
// Ox:
graphic.graph.DrawLine(graphic.MyPen, 0, Y, Xmax, Y);
graphic.graph.DrawLine(graphic.MyPen, X, 0, X, Ymax);
Задать шаг для расчета точек по оси Ох в декартовой системе координат и начальную точку, в данном:
double h = 0.1, Xdec = -4, Ydec = Xdec*Xdec/2-4;
Задать масштаб и перевести координаты точки в декартовой системе координат в систему координат принятой в C#:
int d = 10, Xp = Convert.ToInt16(Xdec*d)+X, Yp =- Convert.ToInt16(Ydec*d)+Y;
Создать переменные для расчета следующей точки и задать цикл для построения графика:
Как нарисовать треугольник в c windows forms
Программа построения треугольника по координатам с вычислением его элементов
Предлагаю внешний вид и исходный код небольшой программы которая строит треугольник по координатам в необходимом масштабе и вычисляет некоторые его элементы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
<
public partial class Form1 : Form
<
int x1, x2, x3, y1, y2, y3;
public Form1()
<
InitializeComponent();
>
private void button1_Click(object sender, EventArgs e)
<
x1 = Convert.ToInt32(textBox1.Text);
y1 = Convert.ToInt32(textBox2.Text);
x2 = Convert.ToInt32(textBox3.Text);
y2 = Convert.ToInt32(textBox4.Text);
x3 = Convert.ToInt32(textBox5.Text);
y3 = Convert.ToInt32(textBox6.Text);
int k = comboBox1.SelectedIndex;
int m =10;
if (k == 0) m = 10;
if (k == 1) m = 20;
if (k == 2) m = 50;
if (k == 3) m = 100;
// инициализируем графику
Graphics g = Graphics.FromHwnd(pictureBox1.Handle);
//очищаем поле для рисованиия
//рисуем оси координат
g.Clear(Color.White);
for ( int i=0; i<600; i=i+m)
g.DrawLine(new Pen(Color.DarkSeaGreen, 1), i, 0, i, 600);
for (int i = 0; i < 600; i = i + m)
g.DrawLine(new Pen(Color.DarkSeaGreen, 1), 0, i, 600, i);
g.DrawLine(new Pen(Color.Blue, 1), 300, 0, 300, 600);
g.DrawLine(new Pen(Color.Blue, 1), 0, 300, 600, 300);
//рисуем треугольник
y1 = -y1;
y2 = -y2;
y3 = -y3;
g.DrawLine(new Pen(Color.Red,1),x1*m + 300,y1*m + 300,x2*m + 300,y2*m + 300);
g.DrawLine(new Pen(Color.Red,1),x2*m + 300,y2*m + 300,x3*m + 300,y3*m + 300);
g.DrawLine(new Pen(Color.Red,1),x1*m + 300,y1*m + 300,x3*m + 300,y3*m + 300);
Font f = new System.Drawing.Font("Times New Roman", 12, System.Drawing.FontStyle.Bold);
// устанавливаем цвет
SolidBrush f1 = new SolidBrush(Color.Green);
// выводим надписи
g.DrawString("A", f, f1, x1 * m + 300, y1 * m + 300);
g.DrawString("B", f, f1, x2 * m + 300, y2 * m + 300);
g.DrawString("C", f, f1, x3 * m + 300, y3 * m + 300);
private void Form1_Activated(object sender, EventArgs e)
<
textBox1.Text = "0";
textBox2.Text = "0";
textBox3.Text = "-10";
textBox4.Text = "10";
textBox5.Text = "10";
textBox6.Text = "0";
>
private void button2_Click(object sender, EventArgs e)
<
x1 = Convert.ToInt32(textBox1.Text);
y1 = Convert.ToInt32(textBox2.Text);
x2 = Convert.ToInt32(textBox3.Text);
y2 = Convert.ToInt32(textBox4.Text);
x3 = Convert.ToInt32(textBox5.Text);
y3 = Convert.ToInt32(textBox6.Text);
//вычисляем стороны
double ab = Math.Sqrt((x2 — x1) * (x2 — x1) + (y2 — y1) * (y2 — y1));
double bc = Math.Sqrt((x3 — x2) * (x3 — x2) + (y3 — y2) * (y3 — y2));
double ac = Math.Sqrt((x3 — x1) * (x3 — x1) + (y3 — y1) * (y3 — y1));
label16.Text = Convert.ToString(ab);
label17.Text = Convert.ToString(bc);
label18.Text = Convert.ToString(ac);
//периметр и площадь
double p = ab + bc + ac;
label21.Text = Convert.ToString(p);
p=(ab+bc+ac)/2;
double S = Math.Sqrt(p * (p — ab) * (p — bc) * (p — ac));
label22.Text = Convert.ToString(S);
// углы
//C углами будем рассматривать треугольник по теореме Kосинусов
double cosA=(ac*ac+ab*ab-bc*bc)/(2*ac*ab);
double cosB=(ab*ab+bc*bc-ac*ac)/(2*ab*bc);
double cosC=(ac*ac+bc*bc-ab*ab)/(2*ac*bc);
Игра в хаос и треугольник Серпинского на C#
Игра «Хаос» — это метод создания фрактальных изображений путем построения случайных точек внутри многоугольника в соответствии с простым набором правил. В этой статье мы будем использовать игру в хаос для создания треугольника Серпинского с использованием C# и Windows Forms.
Игра в Хаос
Игра в хаос — это математический термин для метода генерации фрактальных изображений. Игра предоставляет простой набор правил, которые могут создавать удивительно сложные фигуры. Алгоритм задает начальное условие с набором определенных точек, или аттракторов. Множество аттракторов можно рассматривать как ряд вершин многоугольника. Начальная точка в пределах полигона выбирается и наносится на изображение.
Как только начальное условие известно, для создания фрактала выполняется повторяющийся процесс. Сначала выбирается случайная вершина в многоугольнике. Затем текущее положение или начальное положение для первой итерации соединяется с положением аттрактора воображаемой прямой линией. Текущее положение перемещается вдоль этой линии на долю расстояния между двумя точками, и на рисунке отображается новое положение.
Треугольник Серпинского
Треугольник Серпинского — это фрактал, который был впервые описан польским математиком Вацлавом Серпинским. При отображении он выглядит как треугольник, разделенный на четыре секции, каждая из которых составляет половину высоты и ширины оригинала. Центральный треугольник перевернут и может рассматриваться как отверстие на изображении. Каждый из трех внешних треугольников представляет собой уменьшенную версию всей фигуры с собственным центральным отверстием. Этот шаблон повторяется бесконечно, чтобы получить результат, аналогичный показанному на рисунке ниже:
Треугольник Серпинского
Существуют различные методы, с помощью которых можно создать треугольник Серпинского. Одним из них является использование игры хаоса с тремя аттракторами, расположенными в трех вершинах равностороннего треугольника. При перемещении текущей позиции к аттрактору перемещаемая величина всегда равна половине расстояния между текущей точкой и выбранной вершиной. Таким образом, шаги по созданию фрактала заключаются в следующем:
- Определите три точки.
- Выберите начальную позицию.
- Случайным образом выберите один из трех аттракторов.
- Переместите текущее положение на полпути к выбранному положению аттрактора и постройте точку.
- Вернитесь к шагу 3.
В оставшейся части этой статьи мы создадим программу на C# для создания треугольника Серпинского. Программа, которую мы разработаем, — это та, которая использовалась для создания изображения выше.
Создание проекта
Для начала создайте проект Windows Forms. Мы будем использовать форму по умолчанию для отображения треугольника, рисуя непосредственно на поверхности формы. Откройте форму по умолчанию и измените ее свойство BackColor на белый. Мы запустим процесс генерации фрактала в ответ на нажатие кнопки, поэтому добавьте кнопку в форму и нанесите на нее подходящую метку, используя свойство Text.
Переменные области действия на уровне класса
Во время создания изображения есть три элемента, которые будут использоваться различными методами. Первый — генератор псевдослучайных чисел, который будет использоваться для определения направления движения во время каждой итерации игры в хаос. Во-вторых, нам нужно удерживать позиции трех вершин равностороннего треугольника. Мы можем хранить их в небольшом массиве точечных структур. Наконец, еще одна точечная структура сохранит текущую позицию.
Чтобы объявить переменные для этих элементов, добавьте в класс следующие переменные области действия на уровне класса:
Определение размера треугольника
Размер треугольника должен быть как можно больше, чтобы можно было отобразить максимальную детализацию. Тем не менее, мы хотим убедиться, что треугольник является равносторонним и расположен в центре клиентской области формы. Чтобы определить максимально возможный размер, мы должны рассмотреть соотношение между высотой и шириной любого равностороннего треугольника. Предполагая, что основание треугольника выровнено по горизонтали, ширина будет такой же, как длина одной из сторон. Высота будет равна ширине, умноженной на половину квадратного корня из трех.
Мы можем добавить метод в форму для расчета коэффициента, добавив следующий код:
С помощью легко доступного соотношения мы можем определить максимальный размер треугольника, сравнивая полную ширину клиентской области формы и ее высоту, деленную на соотношение. Меньшее из этих двух значений является наибольшим размером. Следующий метод должен быть добавлен в класс формы для вычисления размера треугольника. Обратите внимание, что высота уменьшается на два перед возвратом. Это позволит создать небольшую границу по краю фрактала.
Установка расположения вершин
Следующий метод рассчитает положения каждого из трех аттракторов, каждый из которых расположен в вершине треугольника. Эти значения будут основаны на размере треугольника и средней точке клиентской области формы. Средняя точка рассчитывается сначала с использованием половины высоты и ширины формы. Затем мы добавляем верхнюю вершину, которая будет нулевой точкой, координата X которой выровнена по вертикали со средней точкой, а координата Y равна половине высоты треугольника над средней точкой.
Две нижние вершины расположены на половине высоты треугольника ниже центра формы и на половине его ширины по обе стороны от этой точки. Это точки один и два в массиве.
Построение графиков вершин
Следующая задача — создать метод построения положения вершин. Это достигается за счет использования цикла «для каждого» для построения положения каждой точки по очереди. Фактический рисунок будет выполнен другим методом, в данном случае называемым «Точка построения», так как он будет повторно использован для построения точек во время создания фрактала. Обратите внимание, что оба этих метода принимают параметр, содержащий графическую поверхность, на которой нужно рисовать. Это будет создано, когда пользователь нажмет на кнопку.
Построение случайной точки
Предыдущие методы управляют инициализацией треугольника. Теперь мы можем создать методы, которые используются в цикле алгоритма для рисования фрактала. Метод DrawNextPoint будет управлять этим процессом, вызывая новый метод с именем «MoveTowardsRandomPoint», за которым следует вызов PlotPoint для размещения точки в текущем положении. Наконец, он вызывает приложение. Выполняйте события так, чтобы обновленный чертеж был виден.
MoveTowardsRandomPoint выбирает одну из трех вершин с помощью объекта рандомизатора. Затем он вычисляет положение, которое находится на полпути между текущим положением и выбранным аттрактором, и перемещается в эту точку. Добавьте два метода, описанных ниже, в класс формы:
Заключительная задача состоит в том, чтобы объединить все методы в событии нажатия кнопки формы. Добавьте приведенный ниже код в событие кнопки. Это начинается с получения графической области формы и размера треугольника. Размер используется для вычисления положений трех вершин и сохранения их в массиве. Как только три точки будут нанесены на график, будет задано начальное местоположение. В этом случае я использовал положение верхней вершины в качестве отправной точки.
Бесконечный цикл создается с помощью цикла while с условием, которое всегда будет истинным. В этом цикле повторно вызывается метод DrawNextPoint. В идеале вы должны создать цикл, который может быть остановлен пользователем.
Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
заметки, си шарп, графики, алгоритмы, изображения