Модераторы: diadiavova, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нарисовать контур фигуры из png, gif? 
V
    Опции темы
xXxSataNxXx
Дата 19.7.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как можно нарисовать контур фигуры из файла png, gif?
Например: в файле изображения домик, вокруг него прозрачный цвет, как нарисовать только контур этого домика?
И как задать координаты этого контура, чтоб при наведении в любую точку этого домика, выполнялись какие нибудь процедуры?
PM MAIL   Вверх
diadiavova
Дата 19.7.2010, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
xXxSataNxXx
Дата 19.7.2010, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хорошо...
А как получить контур круга и чтоб при наведении мышки на него вызывалась процедура?
PM MAIL   Вверх
diadiavova
Дата 19.7.2010, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Отлавливаешь событие MouseMove, из аргумента выясняешь где курсор, вычисляешь в круге или нет и в зависимости от результата выполняешь что нужно. (это для винформ, в впф, полагаю, и так все понятно).


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
xXxSataNxXx
Дата 19.7.2010, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Это я понимаю, что надо отлавливать событие мышки, просто мне не понятно, как определить, что именно в круге она, это надо создать массив из точек? Или есть что то по проще, как например с прямоугольником?
PM MAIL   Вверх
Pilger
Дата 20.7.2010, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если ты хочешь проверять, находится ли курсор на самом домике(у тебя есть готовое изображение), то не нужно никакой математики. Просто берешь позицию курсора по отношению к картинке и смотришь, что за пиксел под курсором. Если прозрачный, то курсор вне дома.
Если тебе обязательно надо нарисовать контур дома (хотя мне кажется тебе это не надо), то можно например попиксельно пройтись по изображению и цветной пиксел, у которого есть прозрачные соседние пикселы, можно закрасить.
Если тебе обязательно надо математически определить, находится ли курсор внутри круга, то берешь функцию круга x^2+y^2=r^2, делишь на две функции и методами > и < определяешь, лежит ли он внутри круга (но мне кажется тебе этого не надо). А можно нарисовать круг в том же png и определять методом 1.

Это сообщение отредактировал(а) Pilger - 20.7.2010, 00:14


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
xXxSataNxXx
Дата 20.7.2010, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Тут есть ещё 1 загвозка, так как этот домик рисуется на фоне другого изображения, и поэтому никак не проверить пиксель под курсором... =0( Я знаю только 1 вариант такой проверки, это предварительно создать площадь домика, вычислить его координаты на изображении и просматривать где находится курсор, но в таком случае, будет притормаживать, да и объём кода у величется...
PM MAIL   Вверх
diadiavova
Дата 20.7.2010, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Можно создать объект Region и проверять принадлежность точки этой области.
http://msdn.microsoft.com/ru-ru/library/8hedzh9a.aspx
И кстати домик сам может быть контролом
http://msdn.microsoft.com/ru-ru/library/sy...rol.region.aspx


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Pilger
Дата 20.7.2010, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ты не понял. Смотреть надо пиксел самого домика. Пусть у тебя там хоть 1000 различных картинок, которые помещены друг на дружке или рядом, их всё равно надо разделять. Ты смотришь пиксел самого дома, а там указано, где прозрачно, а где нет.
Детальнее. Картинка дома имеет прямоугольную форму. Смотришь позицию картинки на твоей форме. Смотришь позицию курсора на твоей форме. Если rectangle дома intersects курсор, это значит, что курсор находится на картинке, но не факт, что на самом доме. Тут то и надо посмотреть позицию курсора относительно самой картинки дома и посмотреть, какой цвет пикселя там находится. Вот и все. Изображения то разные. Какой смысл их объединять, что бы потом разделить и понять, где дом а где нет?
А если у тебя два объекта находятся на одном изображении то ИМХО надо их сразу разделить.

Это сообщение отредактировал(а) Pilger - 20.7.2010, 12:22


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
xXxSataNxXx
Дата 20.7.2010, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем спасибо, решил проблему переходом на XNA... Так на много проще, да и с графикой работа намного быстрее... 
PM MAIL   Вверх
Pilger
Дата 20.7.2010, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



XNA и надо подключать, когда со сложной графикой работаешь. Метод, описанный выше, подходит идеально.


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
diadiavova
Дата 21.7.2010, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



На счет сложности: не знаю, что уж там сложного с регионом, пример в аттаче, там я с помощью региона прорисовываю пятно и тот же регион использую для определения попадает в него курсор или нет. В зависимости от результата проверки перекрашиваю пятно.

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

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  regionxmpl.rar 53,30 Kb


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Pilger
Дата 21.7.2010, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Просто у PNG картинки уже вложенный "region" имеется. Достаточно посмотреть, что за пиксел под курсором (на картинке). Если прозрачный, то вне области.

На счет простоты тоже не понял. Быстрее да, но проще ли... В XNA таким же методом чаще всего пользуются, что бы определить попиксельное пересечение или столкновение. Да и XNA в общем то подключать действительно не обязательно, если нарисовать дом и определить область это всё что требуется, но это зависит от его задачи. Может там что то более сложное.

WPF или XNA выбрать тоже от задачи зависит. С интерфейсом работать лучше с WPF. XNA с WinForm лучше контачит. А если просто нужно ускорить обрисовку (например избавиться от мерцания), то достаточно подключить XNA, кое что поменять и готово. И не придется переходить на WPF из за какой то мелочи.


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
diadiavova
Дата 21.7.2010, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(Pilger @  21.7.2010,  17:01 Найти цитируемый пост)
 И не придется переходить на WPF из за какой то мелочи.

А почему бы и не перейти?  smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Pilger
Дата 21.7.2010, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я имел в виду, что не придется переписывать весь проект под WPF. А знания конечно лишними не будут, ибо везде свои плюсы и минусы в зависимости от задачи.


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

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

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


 




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


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

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