Как перемещать рисованые объекты (прямоугольники, линии)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
MG2007
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 28.09.2007 (Пт) 22:43

Как перемещать рисованые объекты (прямоугольники, линии)

Сообщение MG2007 » 28.09.2007 (Пт) 22:57

Подскажите пожалуйста новичку...
Мне необходимо написать простенькую программу которая бы рисовала простые фигуры (к примеру прямоугольники, линии и т.д.)

Нарисовать не проблема, проблема в другом, задача такова... Любую из фигур необходимо в любой момент времени двигать, изменять размеры (к примеру масштаб) не зависимо друг от друга, так как это делается в редакторе вроде CorelDraw (на листе к примеру отображено три фигуры круг, квадрат и прямая линия выбрав инструмент выделения объекта можно любую фигуру двигать перемещать масштабировать). Мне важно понять, как это делается... ПОМОГИТЕ? :roll:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 28.09.2007 (Пт) 23:40

MG2007
Ты неправильно оцениваешь ситуацию, раз говоришь, что нужно написать простую программу, а потом описывашь столь сложную задачу. Либо твой уровень настолько высок, что тебе эта задача кажется простой, но тогда по крайней мере непонятно - почему ты не можешь это реализовать и спрашиваешь как сделать?

Ну да ладно.
Что именно тебе непонятно, что не получается сделать?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

MG2007
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 28.09.2007 (Пт) 22:43

Сообщение MG2007 » 29.09.2007 (Сб) 0:11

Хакер писал(а):MG2007
Ты неправильно оцениваешь ситуацию, раз говоришь, что нужно написать простую программу, а потом описывашь столь сложную задачу. Либо твой уровень настолько высок, что тебе эта задача кажется простой, но тогда по крайней мере непонятно - почему ты не можешь это реализовать и спрашиваешь как сделать?

Ну да ладно.
Что именно тебе непонятно, что не получается сделать?


Вы меня не так поняли, я не имел ввиду что это просто... Мне важно понять, как это делается и смогу ли это сделать.
ПРИМЕР:
У нас есть две фигуры круг и квадрат... Как сделать так что бы можно было у квадрата менять координаты точек, перемещать его, короче что бы он вел себя как отдельный объект который можно редактировать...? (тоже самое касается круга, что бы его можно было перемещать менять его радиус, заливку и т.д...) Я не говорю, что это легко, мне нужно понять принцип, как это делают, создают каждый объект как какой-то контейнер или еще что-то, я не имею представления поэтому и спрашиваю... :roll: :oops:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.09.2007 (Сб) 0:27

Делается поверхность рисования.

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

Создаётся коллекция, куда добавлячются ссылки на выделенные объекты. Мышиные события на поверхности рисования обрабатываются, устаналивается, что пользователь делает. В частности это приводит к изменениям в коллекции выделенных объектов.

Для выледенных объектов мышиные события обрабатываются по особенному.

Ну, это так - вокруг да около. Что конкретно интересует?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Harlan
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 16.09.2007 (Вс) 11:29

Сообщение Harlan » 29.09.2007 (Сб) 13:30

to MG2007

Дык если тебе нужно только кружочки с квадратиками рисовать, то есть элемент Shape или Line :)

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 29.09.2007 (Сб) 14:06

MG2007
не знаю как кто делает, а я отрабатывал события MouseMove(if Button=1), MouseUp и MouseDown .
Все прекрасно двигалось. Как-нибудь скину пример кода. уверен, тебе это и нужно, чтобы "разобраться как работает"
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

MG2007
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 28.09.2007 (Пт) 22:43

Сообщение MG2007 » 29.09.2007 (Сб) 16:27

Harlan писал(а):to MG2007

Дык если тебе нужно только кружочки с квадратиками рисовать, то есть элемент Shape или Line :)


Про это я знаю, спасибо но я не тупой !!! :roll:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.09.2007 (Сб) 16:28

Как раз таки не надо. Денис ерунду говорит.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

MG2007
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 28.09.2007 (Пт) 22:43

Сообщение MG2007 » 29.09.2007 (Сб) 16:31

Денис писал(а):MG2007
не знаю как кто делает, а я отрабатывал события MouseMove(if Button=1), MouseUp и MouseDown .
Все прекрасно двигалось. Как-нибудь скину пример кода. уверен, тебе это и нужно, чтобы "разобраться как работает"


Если можно, скинь примерчик, буду признателен...

По координатам мышки (отлавливая события) можно перемещать и т.д., это понятно, но к примеру когда два одинаковых элемента (круга), как конкретно заставить перемещать нужный, как это все обрабатывается?

MG2007
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 28.09.2007 (Пт) 22:43

Сообщение MG2007 » 30.09.2007 (Вс) 10:04

Хакер писал(а):Делается поверхность рисования.

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

Создаётся коллекция, куда добавлячются ссылки на выделенные объекты. Мышиные события на поверхности рисования обрабатываются, устаналивается, что пользователь делает. В частности это приводит к изменениям в коллекции выделенных объектов.

Для выледенных объектов мышиные события обрабатываются по особенному.

Ну, это так - вокруг да около. Что конкретно интересует?


Пример можешь показать?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 01.10.2007 (Пн) 15:51

Если перемещать, масштабировать, но не вращать, то задача действительно элементарна, и можно обойтись шейпами. Тут не окончательное решение, а ответ на вопрос "как это делается":
Вложения
2D.rar
(1.43 Кб) Скачиваний: 352

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.10.2007 (Пн) 18:15

Mikle
Не, это слишком примитивно. Автору ИМХО надо с вращением, с масштабированием ( в ширину / высоту + скосы, + перекручивания), + с рисованием линий через алгоритм Ву, + чтобы всё это было векторным, и при увеличнии выглядело так-же красиво.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

MG2007
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 28.09.2007 (Пт) 22:43

Сообщение MG2007 » 01.10.2007 (Пн) 19:52

Mikle писал(а):Если перемещать, масштабировать, но не вращать, то задача действительно элементарна, и можно обойтись шейпами. Тут не окончательное решение, а ответ на вопрос "как это делается":


Огромное спасибо!!! Хоть кто-то ответил нормальным образом!!!
Я тоже задумался о ШЕЙПАХ :wink:


Хакер писал(а):Не, это слишком примитивно. Автору ИМХО надо с вращением, с масштабированием ( в ширину / высоту + скосы, + перекручивания), + с рисованием линий через алгоритм Ву, + чтобы всё это было векторным, и при увеличнии выглядело так-же красиво.


Это ты завернул!!! :roll:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.10.2007 (Ср) 13:54

MG2007
Держи:
http://share.fire-lines.ru/hacker/vector_graphic.rar

(Ночь потратил на изготовление примера).

Жду респектов в свою сторону :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 03.10.2007 (Ср) 14:17

(Ночь потратил на изготовление примера).

Жду респектов в свою сторону


Отличный пример! В кирпичи его. :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.10.2007 (Ср) 14:53

Нуу, примеры в кирпичи не помещаются, а куда его ещё можно деть - я даже не знаю. Может создать раздел для примеров? :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 03.10.2007 (Ср) 14:56

В проекты.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.10.2007 (Ср) 15:00

По моему этот пример не дорос до проектов. Под каким названием / формулировкой / описанием ты предлагаешь его туда поместить?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 03.10.2007 (Ср) 15:21

По крайней мере там он будет более уместен, чем в любом другом разделе. Не нравятся проекты, можно еще в FAQ.
Lasciate ogni speranza, voi ch'entrate.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 03.10.2007 (Ср) 15:39

В проекты логичнее всего. Глядишь, там он дорастет и до Кирпича.
Весь мир матрица, а мы в нем потоки байтов!

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 03.10.2007 (Ср) 18:37

Согласен, отличный пример. Хакер, огромный респект тебе за это. Действительно стоит поместить этот пример в проекты, будем надеяться, что он дорастет не то что до кирпича, а до целой "панели" или "блока" :)
Подпись проходит рефакторинг

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 10.10.2007 (Ср) 9:23

Хакер
Пример хороший, позабавили ремарки, особенно переписка с Орбитом. Ты, когда пишешь, что 2*2=4, тоже всегда доказываешь, что "сам посчитал"? :lol:
Но это я не удержался, повторюсь, пример хороший... но не идеальный.
Странная конструкция:
Код: Выделить всё
TestPointInPolygon = ((Intersections Mod 2) = 1) And (Intersections > 0)

Легко заменяется просто на:
Код: Выделить всё
TestPointInPolygon = Intersections Mod 2

Все работает. Если религия не позволяет приравнивать Boolean к Integer, можно заменить тип Intersections на Boolean, вместо:
Код: Выделить всё
Intersections = Intersections + 1

поставить:
Код: Выделить всё
Intersections = Not Intersections

а в конце получится:
Код: Выделить всё
TestPointInPolygon = Intersections

Но все равно все ф-ция TestPointInPolygon неоправданно усложнена, приведение координат к локальной системе и оптимизация через баунд-бокс вполне "на своем месте", а вот нахождение количества (точнее четности) пересечений уже в локальной системе можно было сделать примерно так (см. приложение), не вызывая TestLinesIntersected, которая вызывает TestRangeIntersected, GetLinesIntersection, TestVectorInBox, который вызывает TestPointInRange.
MultiplyMatricies не применена потому, что она смысла не имеет, если мы хотим комбинировать любые трансформации в одну или делать более сложные трансформации (скос, закручивание), придется перейти к матрицам 3*3.
Вложения
PointInPolygon.rar
(1.39 Кб) Скачиваний: 323

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 10.10.2007 (Ср) 13:23

Mikle
Пример посмотрел и он очевидно проще, чем мой способ определения попадания в полигон. Правда принцип действия на первый взгляд мне не понятен, но попробую разобраться.

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

Причина, по которой используется столь странное выражение (с модулем) мною уже забыта. Я помню, что изначально был тот вариант, который ты указал как более подходящий, но потом обнаружился какой-то баг, и пришлось добавить сравнение с нулём, а т.к. 1 and -1 равно = 0, ещё и приведение 1 к bool(-1). Сейчас, правда, не представляю себе ситуации, когда x mod 2 даст 1 и при этом x будет <= 0. Возможно, поздняя ночь сделала своё дело :)

Причину, по которой я не стал использовать матрицы и сложные деформации ты уже сам описал :)

Обидно только, что автор, судя по всему, так и не увидел пример.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 10.10.2007 (Ср) 16:09

Хакер
Я тоже предпочитаю все писать сам. А пример, как и твой, проверяет четность количества пересечений луча с ребрами полигона, только луч бесконечен и горизонтален.

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re:

Сообщение Saturn.65 » 25.01.2009 (Вс) 22:43

Хакер писал(а):Жду респектов в свою сторону :)

Нет слов! Выше всяких похвал!
Главное, ребята, сердцем не стареть...

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: Как перемещать рисованые объекты (прямоугольники, линии)

Сообщение Saturn.65 » 26.01.2009 (Пн) 15:46

Mikle
Пример хорош, но как идетифицировать фигуры? Надо, чтобы ухватился я за квадрат и знал, что при клике на нем сделать то-то. Или когда перетаскиваю, как знать, что я перетаскиваю именно этот квадрат? А то у них всех одно имя sh. И в скобках число. :(
Главное, ребята, сердцем не стареть...

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Re: Как перемещать рисованые объекты (прямоугольники, линии)

Сообщение |kerish| » 26.01.2009 (Пн) 15:55

Комментарии в коде на 5 балов :)

С такими комментариями код изучать одно удовольствие.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как перемещать рисованые объекты (прямоугольники, линии)

Сообщение Хакер » 26.01.2009 (Пн) 16:44

Нда... перечитал комментарии — выглядят словно я их писал в состоянии глубокого алкогольного опьянения.

Вообще, надо бы переделать этот пример. Много там ляпов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re:

Сообщение Mikle » 26.01.2009 (Пн) 17:36

Saturn.65
Это был максимально простой пример "с чего начать", соответствующий видимому уровню автора вопроса. Я же писал:
Mikle писал(а):Если перемещать, масштабировать, но не вращать, то задача действительно элементарна, и можно обойтись шейпами. Тут не окончательное решение, а ответ на вопрос "как это делается":

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Re: Как перемещать рисованые объекты (прямоугольники, линии)

Сообщение |kerish| » 28.01.2009 (Ср) 10:21

А как поворачивать полигон вокруг своей оси без использования маркеров используя метод Rotate?

Какая формула?

След.

Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: SemrushBot и гости: 54

    TopList