Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 06.10.2015
Сообщений: 25

Построение параллелограммов по заданным координатам вершин, с заливкой и автоматическим построением диагоналей

26.09.2017, 14:41. Показов 4428. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если кому-то будет не влом и не сложно, нужно написать такую вот программу :
Отобразить координатную сетку с осями, подписями и направляющими стрелками (центр осей в точке (10,10) на Canvas). Обеспечить построение параллелограммов по заданным координатам вершин (заливка - любой случайный цвет) только во второй координатной четверти с автоматическим построением диагоналей и одной из высот параллелограмма. Обеспечить возможность выбора цвета диагоналей.

Буду очень благодарен

Добавлено через 26 минут
Не сетку, а координатную плоскость*
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.09.2017, 14:41
Ответы с готовыми решениями:

Процедура: рисование ромба по заданным координатам точки пересечения диагоналей и длинам диагоналей
Напишите процедуру рисования ромба по заданным координатам точки пересечения центров диагоналей ромба (x, y), и длинам двух...

Подпрограммы: найти меньшую из диагоналей параллелограмма по координатам его вершин
Найти меньшую из диагоналей параллелограмма ABCD, если известно координаты его вершин. Выполнить проверку, является ли данный...

По введеным координатам вершин четырехугольника определить длины диагоналей и его площадь
по введеным координатам вершин четырехугольника определить длины диагоналей м его площадь, в том случае, если он является выпуклым. как...

6
 Аватар для Toros1992
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
26.09.2017, 22:42
Лучший ответ Сообщение было отмечено nothing1 как решение

Решение

Не реализовано только построение высоты. С этим уж как-нибудь сам.
Вложения
Тип файла: rar Coordinate.rar (57.4 Кб, 14 просмотров)
2
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
27.09.2017, 01:13
Лучший ответ Сообщение было отмечено nothing1 как решение

Решение

Рефакторинг:

C#
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace Coordinate
{
    public partial class Form1 : Form
    {
        #region Переменные
 
        private TextBox[,] TextBoxes;               //для фичи с мышкой
        private int Xcenter, Ycenter;
 
        private Color diagonalColor = Color.Black;
        private int CurentPair      = 0;
        private Point[] DataPoints  = new Point[0];
 
        #endregion
 
 
 
        #region Методы
 
        /// <summary>
        /// Основная форма
        /// </summary>
        public Form1()
        {
            InitializeComponent();
 
            // заставим панель для отрисовок использовать двойную буф-ю
            typeof(Control).GetProperty(
                "DoubleBuffered", 
                System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.SetProperty
                ).SetValue(CoordinatePanel, true, null);
 
            Colors.Items.AddRange(Enum.GetNames(typeof(KnownColor)));
            TextBox[,] T = { { X1, Y1 }, { X2, Y2 }, { X3, Y3 } };
            TextBoxes = T;
 
            CoordinatePanel.Invalidate();
        }
 
        /// <summary>
        /// получение четырех вершин параллелограмма
        /// </summary>
        /// <returns></returns>
        private void Calc()
        {
            try
            {
                int x1, x2, x3, x4, y1, y2, y3, y4;
                x1 = Xcenter + Convert.ToInt32(X1.Text) * 10; y1 = Ycenter - Convert.ToInt32(Y1.Text) * 10;
                x2 = Xcenter + Convert.ToInt32(X2.Text) * 10; y2 = Ycenter - Convert.ToInt32(Y2.Text) * 10;
                x3 = Xcenter + Convert.ToInt32(X3.Text) * 10; y3 = Ycenter - Convert.ToInt32(Y3.Text) * 10;
                x4 = x1 + (x3 - x2); y4 = y1 + (y3 - y2);
 
                DataPoints = new Point[]{
                                            new Point(x1, y1),
                                            new Point(x2, y2),
                                            new Point(x3, y3),
                                            new Point(x4, y4)
                                        };
 
                CoordinatePanel.Invalidate();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        /// <summary>
        /// фича с мышкой
        /// </summary>
        /// <param name="clickLocation"></param>
        private void SetDataMouse(Point clickLocation)
        {
            TextBoxes[CurentPair, 0].Text = ((clickLocation.X - Xcenter) / 10).ToString();
            TextBoxes[CurentPair, 1].Text = ((Ycenter - clickLocation.Y) / 10).ToString();
            CurentPair = (CurentPair + 1) % 3;
        }
 
        /// <summary>
        /// Цвет диагоналий
        /// </summary>
        private void SetDiagonalColor()
        {
            diagonalColor = Color.FromName(Colors.Text);
            CoordinatePanel.Invalidate();
        }
 
        /// <summary>
        /// Очистка
        /// </summary>
        private void Clr()
        {
            DataPoints = new Point[0];
 
            CurentPair = 0;
 
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    TextBoxes[i, j].Clear();
                }
            }
 
            CoordinatePanel.Invalidate();
        }
 
        /// <summary>
        /// отрисовка координатной сетки
        /// </summary>
        /// <param name="graf"></param>
        private void DrawGriid(Graphics graf)
        {
            int widht = CoordinatePanel.Width;
            int height = CoordinatePanel.Height;
 
            Xcenter = widht / 2;
            Ycenter = height / 2;
 
            //сетка
            using (var greyPen = new Pen(Color.FromArgb(230, 230, 230)))
            {
                for (int x = widht % 10; x < widht; x += 10) { graf.DrawLine(greyPen, x, 0, x, height); }
                for (int y = height % 10; y < height; y += 10) { graf.DrawLine(greyPen, 0, y, widht, y); }
            }
 
            graf.DrawLine(Pens.Black, 0, Ycenter, widht, Ycenter);//крестовина
            graf.DrawLine(Pens.Black, Xcenter, 0, Xcenter, height);
 
            graf.DrawLine(Pens.Black, widht - 3, Ycenter, widht - 8, Ycenter - 3);//стрелки
            graf.DrawLine(Pens.Black, widht - 3, Ycenter, widht - 8, Ycenter + 3);
            graf.DrawLine(Pens.Black, Xcenter, 0, Xcenter - 3, 5);
            graf.DrawLine(Pens.Black, Xcenter, 0, Xcenter + 3, 5);
 
            graf.DrawLine(Pens.Black, Xcenter + 10, Ycenter - 3, Xcenter + 10, Ycenter + 3);//единичные отрезки
            graf.DrawLine(Pens.Black, Xcenter + 3, Ycenter - 10, Xcenter - 3, Ycenter - 10);
        }
 
        /// <summary>
        /// подписи
        /// </summary>
        /// <param name="graf"></param>
        private void DrawLabel(Graphics graf)
        {
            int widht = CoordinatePanel.Width;
            int height = CoordinatePanel.Height;
 
            using (var fnt = new Font("Microsoft Sans Serif", 6.5f))
            {
                graf.DrawString("0", fnt, Brushes.Black, new Point(Xcenter - 12, Ycenter + 2));
                graf.DrawString("Ось Х", fnt, Brushes.Black, new Point(widht - 33, Ycenter + 4));
                graf.DrawString("Ось Y", fnt, Brushes.Black, new Point(Xcenter + 9, 1));
            }
        }
 
        /// <summary>
        /// фигурка
        /// </summary>
        /// <param name="graf"></param>
        private void DrawPoligon(Graphics graf)
        {
            if (DataPoints == null)     { return; }
            if (DataPoints.Length < 4)  { return; }
 
            Random randomColor = new Random();
            graf.FillPolygon(new SolidBrush(Color.FromArgb(randomColor.Next(0, 255), randomColor.Next(0, 255), randomColor.Next(0, 255))), DataPoints);//рандомный цвет заливки
            graf.DrawPolygon(Pens.Black, DataPoints);
 
            using (var DiagonalPen = new Pen(diagonalColor))
            {
                graf.DrawLine(DiagonalPen, DataPoints[0], DataPoints[2]);
                graf.DrawLine(DiagonalPen, DataPoints[1], DataPoints[3]);
            }
        }
 
        #endregion
 
 
 
        /// <summary>
        /// Отрисовки
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CoordinatePanel_Paint(object sender, PaintEventArgs e)
        {
            DrawGriid(e.Graphics);
            DrawLabel(e.Graphics);
            DrawPoligon(e.Graphics);
        }
 
        /// <summary>
        /// построение параллелограмма
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Build_Click(object sender, EventArgs e)
        {
            Calc();
        }
 
        /// <summary>
        /// Очистить
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Clear_Click(object sender, EventArgs e)
        {
            Clr();
        }
 
        /// <summary>
        /// Выбор цвета
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Colors_SelectedIndexChanged(object sender, EventArgs e)
        {
            SetDiagonalColor();
        }
 
        /// <summary>
        /// фича с мышкой
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CoordinatePanel_MouseClick(object sender, MouseEventArgs e)
        {
            SetDataMouse(e.Location);
        }
 
    }
}
Вложения
Тип файла: rar Coordinate_v_0_0_1.rar (64.7 Кб, 20 просмотров)
1
 Аватар для Toros1992
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
27.09.2017, 07:49
Sanya_sa, спасибо! Как раз сейчас сижу на форуме, чтобы обучаться.
using пока ещё не привык использовать.

Добавлено через 22 минуты
Sanya_sa, можете рассказать, для чего двойная буферизация?
1
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
27.09.2017, 08:47
Цитата Сообщение от Toros1992 Посмотреть сообщение
Sanya_sa, можете рассказать, для чего двойная буферизация?
Что бы не мерцала при перерисовки.

using и двойная буферизация, это не главное - основной целью ставил немного отделить вычисления от отрисовки.

Добавлено через 3 минуты
Цитата Сообщение от Toros1992 Посмотреть сообщение
Как раз сейчас сижу на форуме, чтобы обучаться.
Архитектура ПО в WinForms (FAQ & HowTo)
2
0 / 0 / 0
Регистрация: 06.10.2015
Сообщений: 25
18.10.2017, 16:20  [ТС]
Спасибо большое

Добавлено через 16 минут
Может наглею, но если не тяжело и кто-то возьмется есть еще подобная задачка :
Отобразить координатную сетку (горизонтальную и вертикальную) с осями, подписанными и направляющими стрелками (центр осей в центре Canvas). Обеспечить ввод нескольких равнобедренных треугольников с заданными вручную координатами вершин основы и длины высоты, опущенная на основание. Обеспечить возможность выбора цвета заливки и построения прямоугольников вокруг треугольников.
0
 Аватар для Toros1992
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
18.10.2017, 16:24
А вы не хотите попытаться хотя бы? У вас почти все для этого есть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.10.2017, 16:24
Помогаю со студенческими работами здесь

Определение площади шестиугольника по заданным координатам вершин
Написать программу определения площади шестиугольника с заданными координатами его вершин (x1, y1), (x2, y2), (x3, y3), (x4, y4), (x5, y5),...

Вычисление периметра треугольника по заданным координатам вершин
Добрый день, по такому условию &quot; Составить программу, которая вычисляет периметр треугольника, если заданы координаты вершин ....

Построить треугольник по заданным координатам вершин, вычислить площадь
Есть готовая прога,но неправильно работает. Задание:Построить треугольник по заданным координатам вершин А, В и С, закрасив его в синий...

По заданным координатам вершин треугольника найти стороны и площадь
По заданным координатам вершин треугольника найти стороны и площадь.

Вычислить длины сторон треугольника по заданным координатам его вершин
4)Вычислить длины сторон треугольника по заданным координатам его вершин.Составьте блок-схему к решению задачи и напишите листинг...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru