Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TImage, не работает заливка(FloodFill) 
V
    Опции темы
Веталька
Дата 6.2.2010, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: 2
Всего: 6



понимаю элементарность вопроса,но все таки как закрасить замкнутою область?
делаю закраску так
Код

Image1->Canvas->FloodFill(1,1,clGreen,fsBorder) ;

но область как была белого цвета так и осталась беленькой

и уже более сложный вопрос, как можно реализовать наложение цветов при заливке(белый+черный=серый).




--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
artsb
Дата 6.2.2010, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Рисуй в нужном месте прямоугольник. Его цвет будет таким же как у кисти. Или используй функцию FillRect.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Веталька
Дата 6.2.2010, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: 2
Всего: 6



а если область треугольная, 4х-угольная...?

Добавлено через 3 минуты и 54 секунды
заливаться должна область от линии и вверх или вниз, может быть такое что ее встретит другая линия


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
artsb
Дата 6.2.2010, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Веталька @  6.2.2010,  21:25 Найти цитируемый пост)
а если область треугольная, 4х-угольная...?

Добавлено через 3 минуты и 54 секунды
заливаться должна область от линии и вверх или вниз, может быть такое что ее встретит другая линия 

Тут уже нужно смотреть по ситуации. Скорее всего всё придётся делать руками.

Цитата(Веталька @  6.2.2010,  20:11 Найти цитируемый пост)
и уже более сложный вопрос, как можно реализовать наложение цветов при заливке(белый+черный=серый).

Смешивай цвета. Пример:
Код

TColor clr, clrt;
float per;
int r, g, b;
clr = clFuchsia; // цвет для наложения
per = 50.0; // процент розового цвета

for(int i=5; i<55; i++)
 for(int j=5; j<55; j++) {
  clrt = Image1->Picture->Bitmap->Canvas->Pixels[i][j];
  r = (float)GetRValue(clr) / 100.0 * per + (float)GetRValue(clrt) / 100.0 * (100.0 - per);
  g = (float)GetGValue(clr) / 100.0 * per + (float)GetGValue(clrt) / 100.0 * (100.0 - per);
  b = (float)GetBValue(clr) / 100.0 * per + (float)GetBValue(clrt) / 100.0 * (100.0 - per);
  Image1->Picture->Bitmap->Canvas->Pixels[i][j] = (TColor)RGB(r, g, b);
 }

В примере, на картинке рисуется розовый квадрат с прозрачностью 50%

Добавлено через 2 минуты и 52 секунды
Цитата(artsb @  6.2.2010,  21:40 Найти цитируемый пост)
Тут уже нужно смотреть по ситуации. Скорее всего всё придётся делать руками.

Хотя, припоминаю функцию, которая заливает из указанной точки всё одним цветом до тех пор пока не встретит указанный цвет. Но может я и ошибаюсь...


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 6.2.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Веталька @  6.2.2010,  21:25 Найти цитируемый пост)
а если область треугольная, 4х-угольная...?

Юзай Canvas->Polygon()


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Веталька
Дата 6.2.2010, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: 2
Всего: 6



спасибо за ответ, а как та функция называется???

Добавлено @ 22:01
вот по поводу области, а если провести ограничительные линии?
хотя так тоже не работает...

спс, было бюы правильно наши ответы местами сменить

Это сообщение отредактировал(а) Веталька - 6.2.2010, 22:22


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
Веталька
Дата 6.2.2010, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: 2
Всего: 6



полигон юзается когда количество вершин известно, верно?, а если о их количестве ничего не известно, и их может быть минимум 3


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
artsb
Дата 6.2.2010, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Веталька @  6.2.2010,  21:59 Найти цитируемый пост)
как та функция называется???

дык вот вспомнить не могу...

Цитата(Веталька @  6.2.2010,  22:24 Найти цитируемый пост)
полигон юзается когда количество вершин известно, верно?

ага.

Цитата(Веталька @  6.2.2010,  22:24 Найти цитируемый пост)
а если о их количестве ничего не известно, и их может быть минимум 3 

кого 3? точки? почитай описание функции Polygon()  и поймёшь что к чему  smile 


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Веталька
Дата 6.2.2010, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: 2
Всего: 6



читал, вот и возникли вопросы,  количество точек и их координаты неизвестны, и их можно узнать после того как будет построен график.


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
artsb
Дата 6.2.2010, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



а если "запоминать" точки во время построения графика в какой-нибудь массив (TPoint points[50]). А потом заливать полученный многоугольник?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Веталька
Дата 6.2.2010, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: 2
Всего: 6



хм...так думать много придется)))

это хорошая идея


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
Веталька
Дата 7.2.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: 2
Всего: 6



вот реализовал полигон, и сразу появился вопрос, ничего нету для штриховки выделенной области?

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

Код
int p=4;
int p1=5;
int qwe=30;
x1=StrToInt(Edit1->Text);
y1=StrToInt(Edit2->Text);
z1=StrToInt(Edit3->Text);


int koord1 = ((z1/y1)*qwe);
int koord2 = ((z1/x1)*qwe);
Image1->Canvas->Pen->Color = clGreen;
Image1->Canvas->MoveTo(200-p*koord2,200-p1*koord1);
Image1->Canvas->LineTo(200+p1*koord2,200+p*koord1);
Image1->Canvas->Brush->Color = clRed;
TPoint points[3];
points[0].x = 200-p*koord2;
points[0].y = 200-p1*koord1;
if(x1<(z1-y1)){
points[1].x = 0;
points[1].y = 0;
points[2].x = 401;
points[2].y = 0;}
else  {
points[1].x = 0;
points[1].y = 401;
points[2].x = 401;
points[2].y = 401;}
points[3].x = 200+p1*koord2;
points[3].y = 200+p*koord1;
Image1->Canvas->Polygon(points,3);


x2=StrToInt(Edit4->Text);
y2=StrToInt(Edit5->Text);
z2=StrToInt(Edit6->Text);

int koord3 = (z2/y2)*qwe;
int koord4 = (z2/x2)*qwe;
Image1->Canvas->MoveTo(200-p*koord4,200-p1*koord3);
Image1->Canvas->LineTo(200+p1*koord4,200+p*koord3);
 Image1->Canvas->Brush->Color = clBlue;
 TPoint points1[3];
points1[0].x = 200-p*koord4;
points1[0].y = 200-p1*koord3;
if(x1<(z1-y1)){
points1[1].x = 0;
points1[1].y = 0;
points1[2].x = 401;
points1[2].y = 0;}
else  {
points1[1].x = 0;
points1[1].y = 401;
points1[2].x = 401;
points1[2].y = 401;}
points1[3].x = 200+p1*koord4;
points1[3].y = 200+p*koord3;
Image1->Canvas->Polygon(points1,3);



а вот и начало все рисовать, только я так и не понял почему, я ж только добавил еще 2 области...чудеса=)
Код
int p=4;
int p1=5;
int qwe=30;
x1=StrToInt(Edit1->Text);
y1=StrToInt(Edit2->Text);
z1=StrToInt(Edit3->Text);


int koord1 = ((z1/y1)*qwe);
int koord2 = ((z1/x1)*qwe);
Image1->Canvas->Pen->Color = clGreen;
Image1->Canvas->MoveTo(200-p*koord2,200-p1*koord1);
Image1->Canvas->LineTo(200+p1*koord2,200+p*koord1);
Image1->Canvas->Brush->Color = clRed;
TPoint points[3];
points[0].x = 200-p*koord2;
points[0].y = 200-p1*koord1;
if(x1<(z1-y1)){
points[1].x = 0;
points[1].y = 0;
points[2].x = 401;
points[2].y = 0;}
else  {
points[1].x = 0;
points[1].y = 401;
points[2].x = 401;
points[2].y = 401;}
points[3].x = 200+p1*koord2;
points[3].y = 200+p*koord1;
Image1->Canvas->Polygon(points,3);
//---------------------------------------------------------------------------

x2=StrToInt(Edit4->Text);
y2=StrToInt(Edit5->Text);
z2=StrToInt(Edit6->Text);

int koord3 = (z2/y2)*qwe;
int koord4 = (z2/x2)*qwe;
Image1->Canvas->MoveTo(200-p*koord4,200-p1*koord3);
Image1->Canvas->LineTo(200+p1*koord4,200+p*koord3);
 Image1->Canvas->Brush->Color = clBlue;
 TPoint points1[3];
points1[0].x = 200-p*koord4;
points1[0].y = 200-p1*koord3;
if(x1<(z1-y1)){
points1[1].x = 0;
points1[1].y = 0;
points1[2].x = 401;
points1[2].y = 0;}
else  {
points1[1].x = 0;
points1[1].y = 401;
points1[2].x = 401;
points1[2].y = 401;}
points1[3].x = 200+p1*koord4;
points1[3].y = 200+p*koord3;
Image1->Canvas->Polygon(points1,3);
 //---------------------------------------------------------------------------
x3=StrToInt(Edit7->Text);
y3=StrToInt(Edit8->Text);
z3=StrToInt(Edit9->Text);
int koord5 = (z3/y3)*qwe;
int koord6 = (z3/x3)*qwe;
Image1->Canvas->MoveTo(200-p*koord6,200-p1*koord5);
Image1->Canvas->LineTo(200+p1*koord6,200+p*koord5);
Image1->Canvas->Brush->Color = clYellow;
TPoint points2[3];
points2[0].x = 200-p*koord6;
points2[0].y = 200-p1*koord5;
if(x1<(z1-y1)){
points2[1].x = 0;
points2[1].y = 0;
points2[2].x = 401;
points2[2].y = 0;}
else  {
points2[1].x = 0;
points2[1].y = 401;
points2[2].x = 401;
points2[2].y = 401;}
points2[3].x = 200+p1*koord6;
points2[3].y = 200+p*koord5;
Image1->Canvas->Polygon(points2,3);
//---------------------------------------------------------------------------
x4=StrToInt(Edit10->Text);
y4=StrToInt(Edit11->Text);
z4=StrToInt(Edit12->Text);
int koord7 = (z4/y4)*qwe;
int koord8 = (z4/x4)*qwe;
Image1->Canvas->MoveTo(200-p*koord8,200-p1*koord7);
Image1->Canvas->LineTo(200+p1*koord8,200+p*koord7);
 Image1->Canvas->Brush->Color = clPurple;
TPoint points3[3];
points3[0].x = 200-p*koord8;
points3[0].y = 200-p1*koord7;
if(x1<(z1-y1)){
points3[1].x = 0;
points3[1].y = 0;
points3[2].x = 401;
points3[2].y = 0;}
else  {
points3[1].x = 0;
points3[1].y = 401;
points3[2].x = 401;
points3[2].y = 401;}
points3[3].x = 200+p1*koord8;
points3[3].y = 200+p*koord7;
Image1->Canvas->Polygon(points3,3);



осталось реализовать "наложение", ждите вопросов=)

Это сообщение отредактировал(а) Веталька - 7.2.2010, 15:53


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
Веталька
Дата 7.2.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: 2
Всего: 6



Цитата

Смешивай цвета. Пример:Код

Код

TColor clr, clrt;
float per;
int r, g, b;
clr = clFuchsia; // цвет для наложения
per = 50.0; // процент розового цвета

for(int i=5; i<55; i++)
 for(int j=5; j<55; j++) {
  clrt = Image1->Picture->Bitmap->Canvas->Pixels[i][j];
  r = (float)GetRValue(clr) / 100.0 * per + (float)GetRValue(clrt) / 100.0 * (100.0 - per);
  g = (float)GetGValue(clr) / 100.0 * per + (float)GetGValue(clrt) / 100.0 * (100.0 - per);
  b = (float)GetBValue(clr) / 100.0 * per + (float)GetBValue(clrt) / 100.0 * (100.0 - per);
  Image1->Picture->Bitmap->Canvas->Pixels[i][j] = (TColor)RGB(r, g, b);
 }



В примере, на картинке рисуется розовый квадрат с прозрачностью 50%


вы меня немножко не так поняли, как добиться этого эффекта ?, я так понял что только ручками.

или проще будет сделать штриховку линиями? и снова вопрос как вместо заливки заполнить области линиями, гуглил,ничего не нашел,  может подскажете пакуются функцию?

Это сообщение отредактировал(а) Веталька - 7.2.2010, 16:03


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
artsb
Дата 7.2.2010, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Веталька @  7.2.2010,  14:32 Найти цитируемый пост)
ничего нету для штриховки выделенной области?

Canvas->Brush->Style

Цитата(Веталька @  7.2.2010,  14:32 Найти цитируемый пост)
когда крашу больше одной области то краситься только последняя, сделал два массива, та самая бяка...

Тут лучше для каждого многоугольника юзать свой массив ИМХО


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Веталька
Дата 7.2.2010, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: 2
Всего: 6



Цитата

Тут лучше для каждого многоугольника юзать свой массив ИМХО


так сразу и юзал разные массивы
Код

TPoint points[3];
TPoint points1[3];


Canvas->Brush->Style ето понятно но как его применить к полигону?

Это сообщение отредактировал(а) Веталька - 7.2.2010, 16:23


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
artsb
Дата 7.2.2010, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Веталька @  7.2.2010,  16:11 Найти цитируемый пост)
Canvas->Brush->Style ето понятно но как его применить к полигону?

Перед заливкой полигона, установи нужный стиль кисти и заливай. Потом установи стиль по умолчанию.
Если никакие из стандартных стилей не устроят, юзай Canvas->Brush->Bitmap


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Веталька
Дата 7.2.2010, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: 2
Всего: 6



заюзал я стили, все бы ничего но вот бяка вылезла, в местах пересечения полигонов остается видимым только один полигон который был нарисован последним, как сделать видимыми те полигоны которые остались снизу?

CopyMode осилить пока не выходит

Это сообщение отредактировал(а) Веталька - 7.2.2010, 18:15


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.2556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.