"Супер фоновый" цвет (Вопрос РЕШЕН !)

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

"Супер фоновый" цвет (Вопрос РЕШЕН !)

Сообщение Alex2013 » 25.04.2016 17:49:34

Народ !
Не подскажете если ли возможность заполнить битмап заведомо не существующим цветом ?

Вообщем мне нужно значение, которое ни при каких обстоятельствах, не будет использовано при рисовании .
(Сделал выбор графического элемента по клику, через сравнение с фоном... Но беда в том, что я не знаю заранее будет ли использоваться тот или иной цвет, а проверять или громоздко или медленно .... )


Если непонятно на словах вот код функции
Код: Выделить всё
// Номер команды по клику
Function GetCMDOnClik(X,Y:Longint):Longint;
Var
B:TBitmap;
i:longint;
begin
Result:=-1;
If drawlist= Nil  then exit;
If drawlist.Count=0  then exit;
B:=TBitmap.Create;
B.SetSize(rf1.PaintBox1.Width,rf1.PaintBox1.Height);
CurCanvas:=B.Canvas;
     For I:=0 TO DrawList.Count-1 DO
      begin
        b.Canvas.Brush.Color:=$f2;
        CurCanvas.FillRect(0,0,b.Width,b.Width);
        DrawFig(-1,DrawList[i]);
        if b.Canvas.Pixels[X,Y]<>$f2 then
          Result:=I;
     end;
CurCanvas:=rf1.PaintBox1.Canvas;
b.Free;
end;

Для фона у меня используется некий невнятный $f2 но и он может случайно быть частью рисунка ...
Последний раз редактировалось Alex2013 26.04.2016 13:14:32, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

Re: "Супер фоновый" цвет

Сообщение Лекс Айрин » 25.04.2016 18:20:41

А использовать маски не вариант? Вообще, любой адресуемый цвет может использоваться.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: "Супер фоновый" цвет

Сообщение Alex2013 » 25.04.2016 18:30:49

Лекс Айрин писал(а):А использовать маски не вариант? Вообще, любой адресуемый цвет может использоваться.

Для масок если верно понимаю нужны растровые изображения .
А у меня все векторное (или того хуже, процедурное) ... :idea:
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

Re: "Супер фоновый" цвет

Сообщение zub » 25.04.2016 18:42:06

>>Если непонятно на словах вот код функции
Святая простота))
Математически надо определять что лежит под мышкой
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: "Супер фоновый" цвет

Сообщение Лекс Айрин » 25.04.2016 18:42:26

Alex2013но ты же как-то отображаешь все это на растровом устройстве. (а любой существующий моник растровый)
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: "Супер фоновый" цвет

Сообщение sts » 25.04.2016 18:47:09

Alex2013 писал(а):Не подскажете если ли возможность заполнить битмап заведомо не существующим цветом ?

нету такого цвета, да и вообще, выбор по цвету - моветон (ха в первый раз в жизни использовал это слово).
предлагаю, забубенить еще один битмап а в нем рисовать номером объекта, во, ну как в акселераторах всяких, выгода в фиксированности расходов ресурсов на поиск объекта.

Добавлено спустя 4 минуты 19 секунд:
да, и незабыть преждевременную оптимизацию, пока объектов меньше 256 PixelFormat = 8bit, <65536 16bit, и т.д.
sts
постоялец
 
Сообщения: 455
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: "Супер фоновый" цвет

Сообщение zub » 25.04.2016 18:55:00

а потом приспичит найти примитив не в пикселе под мышкой, а в некоторой области?

Добавлено спустя 7 минут 11 секунд:
это сразу надо делать
вместо
Код: Выделить всё
Function GetCMDOnClik(X,Y:Longint):Longint;

надо
Код: Выделить всё
Function GetCMDOnClik(Area:TЧтотоКвадратноеИлиКруглоеСНастраиваемымРазмером):Longint;

или запаришся на современном мониторе тыкать попиксельно
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: "Супер фоновый" цвет

Сообщение Sharfik » 25.04.2016 21:52:55

Alex2013 писал(а):(Сделал выбор графического элемента по клику, через сравнение с фоном... Но беда в том, что я не знаю заранее будет ли использоваться тот или иной цвет, а проверять или громоздко или медленно .... )

Дурацкая идея.

Код: Выделить всё
Function GetCMDOnClik(X,Y:Longint):Longint;

Заголовок нормальный. Просто реализация не та. Раз все векторное, значит должна быть таблица объектов. Прогонять ее на предмет кто занимает указанные координаты и будет счастье.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30

Re: "Супер фоновый" цвет

Сообщение MysticCoder » 26.04.2016 00:13:05

Рисуй в 2 битмапа с 2мя разными цветами фона, сравнивай их между собой и не парься.
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: "Супер фоновый" цвет

Сообщение Alex2013 » 26.04.2016 00:18:07

1 Совершено согласен насчет "моветона" !
Но, фокус в том, что я могу действительно не знать ни размеры ни цвет объекта В ПРИНЦИПЕ.
По цвету это может быть например градиент ...
Изображение
а по форме например БЛОК собранный из разных примитивов ...
Изображение
(Пока у меня блоки вставляются кучей примитивов и программа "забывает" о том что это был блок сразу после "посадки" его на нужное место ...но так явно не будет удобно всюду ...)

2 Математически определять МЫСЛЬ ! Но как быть если это не квадрат или эллипс, а что-то вроде моего "демо-куба" ( там у меня скрипт строит 3д модель куба под разными углами ) или вдруг будет нужна масштабируемая картинка с прозрачностью
(да хоть график или схему по данным построить например ) ... и что делать, если даже начальная точка незнамо где относительно фигуры окажется
? (то есть при вставке просто на глаз видно, а заранее просчитать область "фигвам матерый" ) ... А код кстати УЖЕ работает и неплохо ..

3 "забубенить еще один битмап, а в нем рисовать номером объекта," Код глянь у меня именно так и делается ! :idea:
Я каждую фигуру из списка вывожу на ОЧИЩЕННЫЙ битмап .(Как бы иначе я номер узнал ?)

4 "Нет такого цвета" ...А если "альфа канал" юзать ? (там же еще целый байт! )
Вопрос в том надежно ли это будет ...
Последний раз редактировалось Alex2013 26.04.2016 13:41:56, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

Re: "Супер фоновый" цвет

Сообщение скалогрыз » 26.04.2016 00:38:55

и zub и sts дают тебе правильный советы, тебе нужно просто решится.

Математический
Тебе просто нужно проходить по каждому объекту, и смотреть попадает ли точка в его геометрию. Алгоритмы принадлежит ли точка: треугольнику, полигону, элипску, кругу или хитраедру уже давно известны и написаны. Если фигура сложная, то просто нужно по циклу обходить фигуры этой тело и смотреть.
Да, и может быть полупрозрачность, в этом случае "фигуры" которые ты проверяешь на проверку с курсором мышки, не будут совпадать с реально выводимыми фигурами. Это не страшно, это нормально.

Графический.
Каждая фигура выводится в скрытый буфер, монотонным цветом, уникальным для себя. Никаких градиентов, никаких текстур, никаких расскрасок.
(для этой фигуры запонимается цвет)
Вопрос с полупрозрачностью прост - нужно принять решение: если альфаканал пикселя больше N (наприме 128) - то он считается как непрозрачный, а если он меньше чем N, то он полностью прозрачный и на буфер не выводится.
После этого смотришь какой цвет находится в точке x,y в буфере.

это цвет и указывает на ту фигуру на которую нажали
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: "Супер фоновый" цвет

Сообщение zub » 26.04.2016 00:45:04

>>а что-то вроде моего "демо-куба"
а что такого в демокубе? это такойже "квадрат\элипс" состоящий из нескольких отрезков.
Подход имхо накорню неверный - все "хиттесты" надо делать не в в системе координат дисплея, а в СК модели. Что проще пересчитать все элементы рисунка в СК дисплея или пересчитать одну мышку из СК дисплея в СК модели?

>>или вдруг будет нужна масштабируемая картинка с прозрачностью
Определил что мышка попала прямоугольник картинки, пересчитал координаты из модели в координаты исходной картинки (не масштабированой и не повернутой) и гляди прозрачно там в этом месте или нет.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: "Супер фоновый" цвет

Сообщение Alex2013 » 26.04.2016 00:46:43

MysticCoder писал(а):Рисуй в 2 битмапа с 2мя разными цветами фона, сравнивай их между собой и не парься.

Да это идея ! Но как можно ее реализовать на практике? И что даст сравнение ? ...Оба цвета могут быть частью картинки ...
:idea: А понял !...но НЕ ОБА ОДНОВРЕМЕННО в одной точке ... Тут есть одна мелочь это будет в два раза медленней
Рисовать на "монохромной" битмапе "всеми цветам радуги" ?
Попробую! Но мне кажется выйдет каша и часть вообще пропадет ...

Но все равно спасибо! Как результат твоего совета появилась идея использовать вывод с логической операцией ...
То есть подобрать так чтобы любой вывод(даже тем же самым цветом фона) изменял цвет
Последний раз редактировалось Alex2013 26.04.2016 13:48:56, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

Re: "Супер фоновый" цвет

Сообщение zub » 26.04.2016 00:52:38

Ну и в догонку. [s]порно[\s]графическим способом ты не сможешь разрулить случай когда под мышкой находится несколько объектов - будешь знать только о "верхнем"
А определить что в точке за пределами зоны отображения? не всегда только под мышкой надо
Последний раз редактировалось zub 26.04.2016 01:02:32, всего редактировалось 1 раз.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: "Супер фоновый" цвет

Сообщение скалогрыз » 26.04.2016 00:57:19

zub писал(а):Ну и в догонку. [s]порно[\s]графическим способом ты не сможешь разрулить случай когда под мышкой находится несколько объектов - будешь знать только о "верхнем"

можно знать о всех, только придётся бегать в буфер после каждого отрисованного объекта.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 234

Рейтинг@Mail.ru