![]() |
Модераторы: javastic, AntonSaburov |
![]() ![]() ![]() |
|
bncom |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 2.11.2005 Репутация: нет Всего: 1 |
Есть такое задание:
На исходное изображение, которое выведено на экран, поместить aRGB изображение синего цвета (т.е. просто залитый прямоугольник, но с альфа-каналом). Затем необходимо используя поток постепенно проявить нижнее (исходное) изображение начиная с нижней строки (справа налево). Вот что у меня пока получилось:
Как результат - не работает. Точнее, не работает лишь плавное исчезновение aRGВ изображения, видимо дело в том, что я не правильно использую поток. У меня есть два варианта заполнения массива пикселей изображения прозрачными пикселями:
Как раз по заданию: с нижней строки (справа налево). Но как к такому циклу применить поток - я не знаю, потому что цикл for срабатывает моментально, т.к. все условия цикла уже прописаны в нем сразу (может некорректно выразился, простите). И еще один вариант:
Однако результат такого алгоритма - просто синяя заливка без поочередного "скрытия" пикселей. Помогите правильно организовать поток, чтобы плавно проявилось нижнее изображение начиная с нижней строки (справа налево). Это сообщение отредактировал(а) bncom - 10.2.2010, 11:25 --------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер |
||||||
|
|||||||
Dancer |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 29.4.2005 Где: Nizhniy Novgorod Репутация: 33 Всего: 37 |
наверное как-то так.
Код не проверял, написано "на коленке", но принцип такой.
-------------------- У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! ![]() |
|||
|
||||
bncom |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 2.11.2005 Репутация: нет Всего: 1 |
Попробовал, работает, правда коряво. Пиксели становятся прозрачными справа налево с верхней строки (хотя надо с нижней строки) с небольшого отступа слева (хотя надо начинать с правой стороны экрана).
Ваш метод работает очень медленно, одна строка пикселей становится прозрачной через где-то 5 минут, даже при значении Thread.sleep(1). Дальше уже терпения не хватило за этим наблюдать. Наверно все же есть вариант проще... --------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер |
|||
|
||||
eugine_s |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 581 Регистрация: 14.11.2007 Где: Киев Репутация: 17 Всего: 17 |
Вот приблизительно, что ты написал: У меня программа выводит "Hello, World", а должна "World, hello", поэтому программа работает не правильно. Так ускорь его. В чем проблема? В том что готовое решение не написали? Из того что написано, нужно буквально две строчки (изменение цвета пикселя):
Все остальное - только способ прохождения по массиву пикселей и изменение их цвета. А если завтра тебе нужно будет не с края показывать картинку - а с центра? Как вариант ускорения: 1) не вызывать repaint/sleep (даже sleep(1) - это реально может тормозить) после каждого изменения цвета одного пикселя 2) работать не с квадратиками 1х1 (что равно одному пикселю), а с квадратиками 2х2, 3х3, 5х5 3) менять прозрачность не с шагом 1, а с шагом 10 например. 4) полностью изменить алгоритм, так как по большей степени тебе писался не алгоритм, а пример как изменить цвет, про функциональность нигде не говорилось. |
||||
|
|||||
Dancer |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 29.4.2005 Где: Nizhniy Novgorod Репутация: 33 Всего: 37 |
-------------------- У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! ![]() |
|||
|
||||
bncom |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 2.11.2005 Репутация: нет Всего: 1 |
Ваши способы хорошие, но я все же хочу сделать так, как более логично и проще (т.е. так, как у меня придумала голова):
Но этот алгоритм не работает так, как от него хотелось бы по заданию (видимо, голова у меня работает не так совершенно, как хотелось бы). Результат - просто синяя заливка без поочередного "скрытия" пикселей. Так в чем проблема? ЗЫ: хочется же найти решение проблемы своего метода, а брать за идею чужие. Это сообщение отредактировал(а) bncom - 10.2.2010, 11:26 --------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер |
|||
|
||||
Dancer |
|
||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 29.4.2005 Где: Nizhniy Novgorod Репутация: 33 Всего: 37 |
Хорошо, идём по твоему коду
![]()
То есть заполнили arrayPixel "ОТРИЦАТЕЛЬНЫМИ" значениями, так как старший бит отвечает за знак, а ты его принудительно выставил в "1". присвоив всем элементам твоего массива 0xFFrrggbb; Далее while(true), то есть у нас в потоке будет всегда что-то исполняться, даже если мы уже показали всю картинку целиком - Это не есть гуд. Нужно предусмотреть варианты с окончанием работы цикла и выхода из него.
На момент первого старта у нас есть массив с непрозрачным синим цветом, и мы делаем repaint(). что получим - правильно, залитый синим прямоугольник, на том месте, где у нас картинка (0,0, image.width, image.heigth). причём картинка у нас точно есть под этим прямоугольником, это видно из paint() метода.
не будет вызываться достаточно долго, так как "arrayPixel[k]" у нас отрицательный (про это думаю уже понятно? ![]()
Вот здесь видно, что мы работаем с одинм и тем же пикселом, берём этот пиксел из массива и уменьшаем значение в этом элементе А где переход к другому пикселу(индексу массива)? Может быть хотели так написать: arrayPixel[k--]; // тоже самое и с другими пикселями но если написать так, то ниже следующий код вообще никогда выполняться не будет.
Разберитесь с индексами и значениями в элементах массива, и где и когда нужно делать инкремент/декремент индекса Или опишите словами ваш алгоритм, тогда будет понятно ЧТО и главное КАК исправлять. -------------------- У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! ![]() |
||||||||||
|
|||||||||||
W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
Вы все алгоритмы садитесь и придумываете сами?? Заново? И это уже алгоритмика больше, нежели j2me - есть специальная, отдельная ветка форума для этого. -------------------- iOS developer |
|||
|
||||
Dancer |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 29.4.2005 Где: Nizhniy Novgorod Репутация: 33 Всего: 37 |
всё понял. Перечитал пост заново. bncom, ты хочешь пройти цикл и за каждый проход делать прозрачным пиксель с конца, то есть полностью прозрачным и всё, без всяких там градаций (блин, вот я тупая скотина). Цикл for можно использовать и не только одной строчкой, а можно к нему применять так же опрератор "фигурные скобки", и то что будет внутри скобок находится, так же будет выполняться в цикле.
Если будет слишком быстро, после repaint() можешь добавить sleep(), код у тебя этот уже есть. А заполнение массива arrayPixel лучше сделать в конструкторе, как я в последнем моём коде приводил. И метот paint() лучше использовать мой ![]() Это сообщение отредактировал(а) Dancer - 10.2.2010, 12:58 -------------------- У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! ![]() |
|||
|
||||
bncom |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 2.11.2005 Репутация: нет Всего: 1 |
Спасибо, смысл понятен
![]() --------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер |
|||
|
||||
![]() ![]() ![]() |
FAQ раздела лежит здесь! |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java ME (J2ME) | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |