Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 19.12.2018
Сообщений: 3

Создать многоугольник из прямых

19.12.2018, 22:02. Показов 2371. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно написать код, в котором пользователь мог бы рисовать многоугольник пером, нажимая ЛКМ, начальная точка должна замыкаться с последней нажимая ПКМ.
Код рабочего пера у меня есть, а как сделать это замыкание точек с первой и последней - не знаю.
Буду благодарен, заранее огромное спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.12.2018, 22:02
Ответы с готовыми решениями:

Создать базовый класс Многоугольник и наследовать от него правильный многоугольник.
Нужна помощь. В вузе практика, осталась последняя задача. Помогите кодом. ТЗ: Создать базовый класс Многоугольник( может быть...

Ввести количество точек, получить многоугольник, закрасить многоугольник построчно.
Здравствуйте, есть программа написанная на С++ Builder, (см архив) у меня почему то она виснет( Суть программы такова сперва нужно ввести...

Многоугольник задан координатами своих вершин. Определить, является ли данный многоугольник выпуклым
Написать программу которая определяет является ли многоугольник выпуклым

4
0 / 0 / 0
Регистрация: 19.12.2018
Сообщений: 3
19.12.2018, 22:56  [ТС]
UPD: код программы, первая кнопка в графическом редакторе, кнопка с рисованием прямой - которую хочу переделать.
Вложения
Тип файла: rar KGS.rar (349.9 Кб, 11 просмотров)
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,014
20.12.2018, 03:29
Лучший ответ Сообщение было отмечено dexzioo как решение

Решение

В h-файле:
C++
1
2
3
4
bool Drawing, FirstLine = True;
TPoint Origin;
TPoint MovePt;
TPoint FirstPt;
cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  if (Button == mbLeft)  // рисуем левой кнопкой мыши
  {
    Drawing = True;
    Image1->Canvas->MoveTo(X, Y);
    Origin = Point(X, Y);
    if (FirstLine && DrawingTool == dtLine)
    {
      FirstPt = Origin;
      FirstLine = False;
    }
    MovePt = Origin;
  }
  else
    if (Button == mbRight && !FirstLine)
  {
    DrawShape(FirstPt, Point(X, Y), pmCopy);
    FirstLine = True;
  }
}
1
0 / 0 / 0
Регистрация: 19.12.2018
Сообщений: 3
20.12.2018, 12:48  [ТС]
Работает просто прекрасно, спасибо за помощь!
0
 Аватар для Аувау мастер
1 / 1 / 0
Регистрация: 09.12.2018
Сообщений: 7
06.12.2019, 21:56
Для тех, кто наткнётся на эту тему в дальнейшем, для них я написал пример-усовершенствование кода автора вопроса + кода того, кто ответил на вопрос выше.

Итак, во вложении проект, рисует все фигуры, которые были у автора вопроса, это: многоугольник, линия, прямоугольник, скруглённый прямоугольник, эллипс, текст. Для рисования многоугольника нажимаем левой кнопкой мыши, и не отпуская ведём, в нужном месте отпускаем, так рисуется первая линия многоугольника, следующие линии многоугольника рисуются нажатием левой кнопкой мыши, по правой кнопке мыши конечная точка многоугольника соединяется с начальной (что и просил автор вопроса).

Отрисовка у меня происходит на Image1->Bitmap->Canvas , а не как у автора вопроса было (просто на Image1->Canvas).

Вот код cpp-файла:
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
bool Drawing=false;
bool FirstLine=true;
TPoint Origin;
TPoint MovePt;
TPoint FirstPt;
TPoint PrevPt;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
Image1->Picture->Bitmap->Width=Image1->Width;
Image1->Picture->Bitmap->Height=Image1->Height;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Button==mbLeft) //рисуем левой кнопкой мыши
{
Drawing=true;
Image1->Picture->Bitmap->Canvas->MoveTo(X, Y);
if(DrawingTool == dtPolygon)
{
if(FirstLine==true)
{
FirstPt=Point(X, Y);
FirstLine=false;
MovePt=FirstPt;
PrevPt=FirstPt;
}
else
{
PrevPt=Point(X, Y);
}
}
else //если не многоугольник
{
Origin = Point(X, Y);
MovePt=Origin;
}
 
}
else //если не левая кнопка мыши
{
if(DrawingTool == dtPolygon)
{
if(Button==mbRight && FirstLine==false)
{
DrawShape(PrevPt,FirstPt,pmCopy);
FirstLine=true;
DrawShape(PrevPt,MovePt,pmNotXor);
}
}
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
if((DrawingTool == dtPolygon))
{
if(Drawing==true)
{
if(FirstLine==false)
{
DrawShape(PrevPt,MovePt,pmNotXor);
MovePt = Point(X, Y);
DrawShape(PrevPt,MovePt,pmNotXor);
}
}
 
if((Drawing==false) && (FirstLine==false))
{
DrawShape(PrevPt,MovePt,pmNotXor);
MovePt = Point(X, Y);
DrawShape(PrevPt,MovePt,pmNotXor);
}
}
else //если не многоугольник
{
if(Drawing==true)
{
DrawShape(Origin, MovePt, pmNotXor);
MovePt = Point(X, Y);
DrawShape(Origin, MovePt, pmNotXor);
}
}
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Drawing==true)
{
 
if(DrawingTool == dtPolygon)
{
if(Button==mbLeft)
{
if(FirstLine==false)
{
PrevPt=Point(X, Y);
Drawing=false;
}
}
}
else //если не многоугольник
{
DrawShape(Origin,Point(X, Y),pmCopy);
Drawing=false;
}
 
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::MnogougolnikClick(TObject *Sender)
{
Drawing=false;
FirstLine=true;
DrawingTool = dtPolygon;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::LiniyaClick(TObject *Sender)
{
Drawing=false;
FirstLine=true;
DrawingTool = dtLine;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::PryamougolnikClick(TObject *Sender)
{
Drawing=false;
FirstLine=true;
DrawingTool = dtRectangle;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::SkruglennyipryamougolnikClick(TObject *Sender)
{
Drawing=false;
FirstLine=true;
DrawingTool = dtRoundRect;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::EllipsClick(TObject *Sender)
{
Drawing=false;
FirstLine=true;
DrawingTool = dtEllipse;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::TekstClick(TObject *Sender)
{
Drawing=false;
FirstLine=true;
DrawingTool = dtText;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::DrawShape(TPoint TopLeft, TPoint BottomRight, TPenMode AMode)
{
Image1->Canvas->Pen->Mode=AMode;
 
switch(DrawingTool)
{
case dtPolygon:
{
Image1->Picture->Bitmap->Canvas->MoveTo(TopLeft.x, TopLeft.y);
Image1->Picture->Bitmap->Canvas->LineTo(BottomRight.x, BottomRight.y);
break;
}
 
case dtLine:
{
Image1->Picture->Bitmap->Canvas->MoveTo(TopLeft.x, TopLeft.y);
Image1->Picture->Bitmap->Canvas->LineTo(BottomRight.x, BottomRight.y);
break;
}
 
case dtRectangle:
{
Image1->Picture->Bitmap->Canvas->Rectangle(TopLeft.x, TopLeft.y, BottomRight.x, BottomRight.y);
break;
}
 
case dtEllipse:
{
Image1->Picture->Bitmap->Canvas->Ellipse(TopLeft.x, TopLeft.y, BottomRight.x, BottomRight.y);
break;
}
 
case dtRoundRect:
{
Image1->Picture->Bitmap->Canvas->RoundRect(TopLeft.x, TopLeft.y, BottomRight.x, BottomRight.y, (TopLeft.x - BottomRight.x)/2, (TopLeft.y - BottomRight.y)/2);
break;
}
 
case dtText:
{
Image1->Picture->Bitmap->Canvas->TextOut(TopLeft.x, TopLeft.y, "Текст");
break;
}
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Drawing=false;
FirstLine=true;
Image1->Picture->Bitmap->Canvas->Brush->Style=bsSolid;
Image1->Picture->Bitmap->Canvas->FillRect(TRect(0,0,Image1->Picture->Bitmap->Width,Image1->Picture->Bitmap->Height));
}
//---------------------------------------------------------------------------
Вот код h-файла:
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
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
//---------------------------------------------------------------------------
enum TDrawingTool {dtPolygon, dtLine, dtRectangle, dtEllipse, dtRoundRect, dtText};
 
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TImage *Image1;
    TPanel *Panel1;
    TLabel *Label1;
    TLabel *Label2;
    TLabel *Label3;
    TRadioButton *Liniya;
    TRadioButton *Pryamougolnik;
    TLabel *Label4;
    TRadioButton *Skruglennyipryamougolnik;
    TLabel *Label5;
    TRadioButton *Ellips;
    TLabel *Label6;
    TRadioButton *Tekst;
    TRadioButton *Mnogougolnik;
    TButton *Button1;
    void __fastcall Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y);
    void __fastcall MnogougolnikClick(TObject *Sender);
    void __fastcall LiniyaClick(TObject *Sender);
    void __fastcall PryamougolnikClick(TObject *Sender);
    void __fastcall SkruglennyipryamougolnikClick(TObject *Sender);
    void __fastcall EllipsClick(TObject *Sender);
    void __fastcall TekstClick(TObject *Sender);
    void __fastcall Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y);
    void __fastcall Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y);
    void __fastcall Button1Click(TObject *Sender);
 
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
    TDrawingTool DrawingTool;
    void __fastcall DrawShape(TPoint TopLeft, TPoint BottomRight, TPenMode AMode);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Вложения
Тип файла: zip Рисование многоугольников (вариант 2).zip (1.12 Мб, 23 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.12.2019, 21:56
Помогаю со студенческими работами здесь

Как создать произвольный многоугольник?
Как в CSS создать произвольный многоугольник? Например фигура в навбаре макета

Создать класс прямых на плоскости
Создать класс прямых на плоскости. Членами класса являются коэффициенты уравнения прямой ах + by + ц = 0. Методами класса являются: Вот...

Ветвление. Даны уравнения прямых. Выяснить, какие из этих прямых параллельны
Написать программу: Даны уравнения прямых а1х+b1y=c1, a2x+b2y=c2, a3x+b3y=c3. Выяснить, какие из этих прямых параллельны и указать, если...

На плоскости задано множество прямых. Найти количество пересечений этих прямых
На плоскости задано множество прямых. Найти количество пересечений этих прямых плиз помогиите с решением!!

Ветвление. Даны уравнения прямых. Выяснить, какие из этих прямых перпендикулярны
Даны уравнения прямых а1х+b1y=c1, a2x+b2y=c2, a3x+b3y=c3. Выяснить, какие из этих прямых перпендикулярны или указать, если таковых не...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru