Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2007, 18:10   #1
Albenous
Helper
Форумчанин
 
Аватар для Albenous
 
Регистрация: 10.12.2006
Сообщений: 109
Восклицание Canvas (Канва) - заливка фигуры произвольной формы

Работаю с канвой (canvas) - не могу сделать нормальную заливку. Стандартный объект (прямоугольник, круг) заливает нормально, а фигуру произвольной формы - не хочет. Что мне делать? Заливать эту фигуру частями или есть какая-то функция, мне в помощь?
И вообще, тема про канву достаточно интересная, а в литературе раскрыта поверхностно. Обидно.
Глупых вопросов не бывает - бывают глупые ответы.
Albenous вне форума Ответить с цитированием
Старый 22.02.2007, 22:29   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

наверное придется, писать алгоритм основываясь на массиве TPoint )) даже незнаю ) ...

хотя я точно сказать не могу, такого не делал, но посмотри на TCanvas.PolyBezier и TCanvas.PolyBezierTo ! чтот похожее нарно, хотя...
BOBAH13 вне форума Ответить с цитированием
Старый 22.02.2007, 22:33   #3
Albenous
Helper
Форумчанин
 
Аватар для Albenous
 
Регистрация: 10.12.2006
Сообщений: 109
По умолчанию

ну неужели никто не рисовал на канве и с таким не сталкивался? Не верю. Заливка площали произвольной формы встречается довольно часто.
Цитата:
но посмотри на TCanvas.PolyBezier и TCanvas.PolyBezierTo
Что за оно? Поясни, пожалуйста.
Глупых вопросов не бывает - бывают глупые ответы.
Albenous вне форума Ответить с цитированием
Старый 22.02.2007, 22:37   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

ну я не разбирался, просто посмотрел в книге ))) там описан единственный параметр это массив TPoint )) так что возможно оно, потестируй !
BOBAH13 вне форума Ответить с цитированием
Старый 22.02.2007, 22:41   #5
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Самостоятельные функции пробовал писать? Мне кажеться это довольно интересно. запомнить место клика, если пиксели, которые рядом того же цвета, то закрасить и т.д. Также можно заливать и похожие цвета.
Alar вне форума Ответить с цитированием
Старый 23.02.2007, 09:38   #6
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Хм.. я думал что я не понял темы, но чем Вам не нравится процедура ?!

procedure FloodFill(X, Y: Integer; Color: TColor; FillStyle: TFillStyle);
zetrix вне форума Ответить с цитированием
Старый 23.02.2007, 11:39   #7
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию

Вот попробуй эти методы если FloodFill не нравится.
параметры функций Flood и LineFlood:
X, Y - координаты начала заливки
Color - цвет заливки
Код:
function InRect(X, Y: integer): boolean;
begin
  if InRange(X, 0, Self.Width) and InRange(Y, 0, Self.Height) then
    result := true
  else
    result := false;
end;

// Простой но не очень корректный метод - 
// при большой оласти заливки вызывает переполнение стека
procedure Flood(X, Y: integer; Color: TColor);
begin
  if InRect(X, Y) then
    Self.Canvas.Pixels[x,y] := Color;
  if InRect(X + 1, Y) and (Self.Canvas.Pixels[X + 1, Y] <> Color) then
    Flood(X + 1, Y);
  if InRect(X - 1, Y) and (Self.Canvas.Pixels[X - 1, Y] <> Color) then
    Flood(X - 1, Y);
  if InRect(X, Y + 1) and (Self.Canvas.Pixels[X, Y + 1] <> Color) then
    Flood(X, Y + 1);
  if InRect(X, Y - 1) and (Self.Canvas.Pixels[X, Y - 1] <> Color) then
    Flood(X, Y-1);
end;
Код:
// Хороший, но не очень простой метод
// кстати он используеться в моей программе 
// JCEditor которая участвует на конкурсе программистов
procedure LineFlood(X, Y: integer; Color: TColor);
var
  J,
  BegX,
  EndX: integer;
  Col: integer;
  BColor: TColor;
begin
  BColor := Self.Canvas.Pixels[X, Y];
  Col := BColor;
  if Color = BColor then
    Exit;
  //Эти строчки нужно написать перед вызовом этой процедуры
  //чтобы они не повторялись каждый раз при рекурсивном вызове
  //Self.Canvas.Pen.Color := Color;
  //Self.Canvas.Brush.Color := Color;
  BegX := X;
  While (Col = BColor) and (BegX >= 0) do begin
    dec(BegX);
    if BegX >= 0 then
      Col := Self.Canvas.Pixels[BegX, Y];
    else
      Col := BColor + 1;
  end;
  Inc(BegX);
  EndX := X + 1;
  Col := Self.Canvas.Pixels[EndX, Y];
  While (Col = BColor) and (EndX <= Self.Width) do begin
    inc(EndX);
    if EndX <= Self.Width then
      Col := Self.Canvas.Pixels[EndX, Y]
    else
      Col := BColor + 1;
  end;
  Dec(EndX);

  //собственно рисование
  Self.Canvas.MoveTo(BegX, Y);
  Self.Canvas.LineTo(EndX, Y);
  if (Y > 0) then begin
    J := BegX;
    While J <= EndX do begin
      Col := Self.Canvas.Pixels[J, Y - 1];
      if (Col = BColor) then
        LineFlood(J, Y - 1);
      inc(J);
    end;
  end;
  if (Y > 0) and (Y < Self.Height) then begin
    J := BegX;
    While J <= EndX do begin
      Col := Self.Canvas.Pixels[J, Y + 1];
      if (Col = BColor) then
        LineFlood(J, Y + 1);
      inc(J);
    end;
  end;
end;
использование:

Код:
 Flood(10, 10, clBlack);
Код:
   Self.Canvas.Pen.Color := clBlack;
   Self.Canvas.Brush.Color := clBlack;
 LineFlood(10, 10, clBlack);
Umen вне форума Ответить с цитированием
Старый 23.02.2007, 14:45   #8
Albenous
Helper
Форумчанин
 
Аватар для Albenous
 
Регистрация: 10.12.2006
Сообщений: 109
Радость

Цитата:
Сообщение от zetrix Посмотреть сообщение
Хм.. я думал что я не понял темы, но чем Вам не нравится процедура ?!
procedure FloodFill(X, Y: Integer; Color: TColor; FillStyle: TFillStyle);
Да кто говорил, что не нравится? Я не знал о ее существовании, поэтому и создал тему.
пасиба, то, что нужно.
Тему не закраывайте - сюда еще много чего дописать можно.
P.S. Очень оценил старания umen`а. Тоже хорошо написано.
Глупых вопросов не бывает - бывают глупые ответы.

Последний раз редактировалось Albenous; 23.02.2007 в 17:51.
Albenous вне форума Ответить с цитированием
Старый 23.02.2007, 17:51   #9
Albenous
Helper
Форумчанин
 
Аватар для Albenous
 
Регистрация: 10.12.2006
Сообщений: 109
По умолчанию

Люди, подскажите, в чем может быть проблема: Закинул анимацию в dll и она перестала работать (В смысле рисунк стоит на месте).

{Анимация не gif, а то, что я рисовал на канве.}
Глупых вопросов не бывает - бывают глупые ответы.
Albenous вне форума Ответить с цитированием
Старый 23.02.2007, 18:00   #10
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

т.е. анимацию закинул ?! и что перестало работать ?
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из Delphi в Word.Формирование произвольной формы документа Streetmagic Общие вопросы Delphi 1 14.04.2011 13:21
Заливка фигуры в делфи! who i Помощь студентам 2 22.02.2011 22:59
Заливка шейпа в окументе картинкой из формы tyrus2 Microsoft Office Word 1 22.09.2010 23:08
окна произвольной формы winApi alex_triton Visual C++ 7 26.08.2010 07:43
реакция на наведение указателя на участок формы. Canvas skalt12 Общие вопросы Delphi 4 11.08.2010 13:09