Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
8 / 8 / 4
Регистрация: 13.12.2011
Сообщений: 124

Заливка областей произвольной формы

09.07.2015, 19:18. Показов 2809. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такая проблема: В файле хранятся координаты линий. я их вывожу в Image1, получается из линий карта с районами. Каждый район нужно закрасить.
Вот мой код закраски:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int i=0,j=0;
int cl;
Canvas->Brush->Color=RGB(255,0,255);
Canvas->FloodFill(1,1,clBlack,fsBorder);
for (i = 0; i < Image1->Width; i++)
     for (j=0; j< Image1->Height; j++){
     cl=Image1->Canvas->Pixels[i][j];
     if (cl==clWhite){
     Canvas->Brush->Color=RGB(random(200)+50,random(200)+50,random(200)+50);
     Canvas->FloodFill(i,j,clBlack,fsBorder);
     }
     }
В чем может быть проблема? У меня область вокруг карты постоянно меняет цвет, т.е. условие сразу проходит, хотя я сразу задаю отличный от белого фон.

Добавлено через 17 минут
Эту проблему решил, но теперь когда увожу окно за экран а потом возвращаю все цвета исчезают. как сделать так чтоб это не происходило?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.07.2015, 19:18
Ответы с готовыми решениями:

Форма произвольной формы
Всем привет интересует как создать форму примерно вот такой формы

Форма произвольной формы
Решил попробовать создавать формы произвольной формы по битовой матрице. Вроде всё получилось. потом стало интересно попробовать...

Создать кнопку произвольной формы
Всем доброго дня. Мне нужно как то создать кнопку произвольной формы как это зделать?

4
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
15.07.2015, 16:59
Цитата Сообщение от YniRus Посмотреть сообщение
Эту проблему решил
А вот как, интересно было б знать?
Цитата Сообщение от YniRus Посмотреть сообщение
когда увожу окно за экран а потом возвращаю все цвета исчезают. как сделать так чтоб это не происходило?
Перерисовывать повторно.
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,014
15.07.2015, 17:37
Лучший ответ Сообщение было отмечено YniRus как решение

Решение

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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit2.h"
#include "Unit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
int choice, saved_color, saved_XY;
TColor bordo = TColor(1441928);  // бордовый (vinous)
AnsiString regs[18] = {"?", "31 Белгородский", "32 Брянский", "33 Владимирский", "36 Воронежский", "37 Ивановский", "40 Калужский", \
  "44 Костромской", "46 Курский", "48 Липецкий", "50 Московский", "57 Орловский", "62 Рязанский", "67 Смоленский", "68 Тамбовский", \
  "69 Тверской", "71 Тульский", "76 Ярославский"};
AnsiString colors[18] = {"16777215", "12489328", "5733049", "5026082", "15391129", "15245824", "13387839", "2366701", "1959605", \
  "969215", "62207", "13217535", "12829635", "2588671", "11592943", "8355711", "10766755", "15187912"};
AnsiString new_colors[18];
AnsiString XY[17] = {"183357", "089271", "260156", "246352", "280115", "131216", "325060", "147323", "221283", "181166", \
  "157281", "254224", "074197", "278282", "116117", "182236", "220080"};
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormShow(TObject *Sender)
{
  for (int i = 0; i < 18; i++)
    new_colors[i] = colors[i];
 
  AnsiString reg = "Тульский";
  if (Form1->region->ItemIndex >= 0 && Form1->region->ItemIndex < 17)
  {
    reg = regs[Form1->region->ItemIndex+1];
    StringGrid1->Row = Form1->region->ItemIndex;
  }
  else
    StringGrid1->Row = 15;
 
// запоминание дефолтовых цвета и координат текущего региона
  saved_color = StrToInt(colors[Form1->region->ItemIndex+1]);
  saved_XY = StrToInt(XY[Form1->region->ItemIndex]);
 
// стандартные цвета регионов
  for (int i = 1; i < 18; i++)
  {
    Image1->Canvas->Brush->Color = TColor(StrToInt(colors[i]));
    Image1->Canvas->FloodFill(XY[i-1]/1000, XY[i-1]%1000, bordo, fsSurface);
  }
 
// текущий регион - "бордовый"
  Image1->Canvas->Brush->Color = bordo;
  new_colors[Form1->region->ItemIndex+1] = bordo;  
  Image1->Canvas->FloodFill(saved_XY/1000, saved_XY%1000, TColor(saved_color), fsSurface);
 
  cur->Caption = "текущий - " + reg;
  sel->Caption = "выделен - ?";
  coords->Caption = "";
 
// заполнение таблицы названиями регионов  
  for (int i = 0; i < 17; i++)
    StringGrid1->Cells[0][i] = " " + regs[i+1];
    
  Image1->OnMouseMove;
}
//---------------------------------------------------------------------------
void SelReg(int color, int X, int Y)
{
  for (int i = 0; i < 18; i++)
    if (color == StrToInt(new_colors[i]))
    {
      choice = i;
      break;
    }
 
  for (int i = 0; i < 18; i++)
    new_colors[i] = colors[i];
 
  if (choice != 0)
  {
    if (color != bordo)
    {
      Form2->Image1->Canvas->Brush->Color = TColor(saved_color);
      Form2->Image1->Canvas->FloodFill(saved_XY/1000, saved_XY%1000, bordo, fsSurface);
 
      saved_color = color;
      saved_XY = StrToInt(XY[choice-1]);
      new_colors[choice] = bordo;
 
      Form2->Image1->Canvas->Brush->Color = bordo;
      Form2->Image1->Canvas->FloodFill(X, Y, TColor(StrToInt(colors[choice])), fsSurface);
    }
    Form2->StringGrid1->Row = choice-1;
    Form2->sel->Caption = "выделен - " + regs[choice];
  }
  else
  {
    Form2->Image1->Canvas->Brush->Color = TColor(saved_color);
    Form2->Image1->Canvas->FloodFill(saved_XY/1000, saved_XY%1000, bordo, fsSurface);
 
    saved_color = StrToInt(colors[Form1->region->ItemIndex+1]);
    saved_XY = StrToInt(XY[Form1->region->ItemIndex]);
    new_colors[Form1->region->ItemIndex+1] = bordo;
 
    Form2->Image1->Canvas->Brush->Color = bordo;
    Form2->Image1->Canvas->FloodFill(XY[Form1->region->ItemIndex]/1000, XY[Form1->region->ItemIndex]%1000, TColor(StrToInt(colors[Form1->region->ItemIndex+1])), fsSurface);
 
    Form2->StringGrid1->Row = Form1->region->ItemIndex;
    Form2->sel->Caption = "выделен - " + regs[choice];  // choice=0
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Image1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
  int color = Image1->Canvas->Pixels[X][Y];
 
  SelReg(color, X, Y);
 
  coords->Caption = IntToStr(color) + "     (R=" + GetRValue(color) + " G=" + GetGValue(color) + " B=" + GetBValue(color) + ")     х=" + IntToStr(X) + " y=" + IntToStr(Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Image1Click(TObject *Sender)
{
  if (choice != 0)
  {
    Form1->region->ItemIndex = choice - 1;
    Form2->Close();
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm2::StringGrid1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
  int Col, Row;
  StringGrid1->MouseToCell(X, Y, Col, Row);
  StringGrid1->Row = Row;
  sel->Caption = "выделен - " + regs[Row+1];
 
  int x = XY[Row]/1000, y = XY[Row]%1000;
  int color = Image1->Canvas->Pixels[x][y];
  SelReg(color, x, y);
}
//---------------------------------------------------------------------------
void __fastcall TForm2::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
      TRect &Rect, TGridDrawState State)
{
  if (ARow == Form1->region->ItemIndex || State.Contains(gdSelected))
  {
    if (ARow == Form1->region->ItemIndex)
      StringGrid1->Canvas->Font->Color = bordo;
    StringGrid1->Canvas->Font->Style = TFontStyles()<<fsBold;
    StringGrid1->Canvas->FillRect(Rect);
    StringGrid1->Canvas->TextOut(Rect.Left+1, Rect.Top+2, StringGrid1->Cells[ACol][ARow]);
  }
  if (State.Contains(gdFocused))
    StringGrid1->Canvas->DrawFocusRect(Rect);  // убрать фокус
}
//---------------------------------------------------------------------------
void __fastcall TForm2::StringGrid1SelectCell(TObject *Sender, int ACol,
      int ARow, bool &CanSelect)
{
  sel->Caption = "выделен - " + regs[ARow+1];
//  int x = XY[ARow]/1000, y = XY[ARow]%1000;
//  int color = Image1->Canvas->Pixels[x][y];
//  SelReg(color, x, y);  // переполнение стека !  (была попытка "симитировать реагирование" на перемещение по строкам с помощью клавиш, см. "игнорирование" ниже)
}
//---------------------------------------------------------------------------
void __fastcall TForm2::StringGrid1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  if (Button == mbLeft)
  {
    Form1->region->ItemIndex = StringGrid1->Row;
    Form2->Close();
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm2::StringGrid1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
  if (Key == VK_RETURN)
  {
    Form1->region->ItemIndex = StringGrid1->Row;
    Form2->Close();
  }
 
  if (Key == 33 || Key == 34 || Key == 38 || Key == 40)  // arrow_up, arrow_down, page_up, page_down
    SetCursorPos(Mouse->CursorPos.x, Mouse->CursorPos.y);  // "игнорирование" нажатий клавиш для предотвращения перемещения по строкам таблицы StringGrid
}
//---------------------------------------------------------------------------
Миниатюры
Заливка областей произвольной формы  
0
16.07.2015, 08:27

Не по теме:

gunslinger, еще бы контуры регионов задать математически. Х)
Ну и по мелочи опять пристану: обзывать переменную текущего цвета самим цветом как-то худо. А если захочется не бордовый, а лимонный использовать? Тогда весь код переписывать?

0
16.07.2015, 09:28

Не по теме:

Я этот "код" давно писал. Поэтому прошу понять и простить.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.07.2015, 09:28
Помогаю со студенческими работами здесь

Заливка рисунков произвольной формы
Есть ли в Java аналог WinApi-ной функции FloodFill, или может собственный алгоритм у кого есть - буду рад любой помощи. Заранее...

CorelDraw: как получить площадь кривой произвольной формы, в которой есть "дырки" произвольной формы?
Стоит задача рассчитать площадь сложной кривой. В CorelDraw у кривых есть стандартное свойство, отображающее площадь кривой. ...

Заливка произвольной области
Добрый день. Подскажите с помощью какого метода и если есть пример, как организовать на javascript в canvas заливку произвольной области....

Заливка формы по нажатию
Добрый вечер! Очень короткий и глупый вопрос имеется программа, в ходе которой создается фигура(в данном случае будет круг), и по нажатию...

Градиентная заливка формы
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
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(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru