|
1 / 1 / 0
Регистрация: 09.03.2018
Сообщений: 30
|
|
Перемещение простых геометрических объектов по экрану мышкой04.09.2020, 14:19. Показов 2847. Ответов 6
Здравствуйте
Нужно составить программу, которая позволяет перемещать по экрану простые геометрические объекты (треугольник, прямоугольник и т.п.) с помощью мыши. Предусмотреть изменение цвета объектов. Режим экрана графический.
0
|
|
| 04.09.2020, 14:19 | |
|
Ответы с готовыми решениями:
6
Имитация движения простых геометрических объектов Перемещение объектов мышкой Перемещение объектов мышкой |
|
Модератор
|
|
| 04.09.2020, 16:26 | |
|
Tonia_, сама по себе задача не сложная, но размер итогового кода будет значительным.
Можно сделать код сильно маленьким за счёт прямой записи в память и разных трюков, но читать и защищать его будет сложно. Сейчас только начало учебного года и вы вполне можете успеть всё сделать самостоятельно. Отдельные подзадачи многократно решались, алгоритмы рисования линий реализовывались. Что-то даже в FAQ для раздела Assembler, MASM, TASM рассматривалось и пояснялась теория. FAQ - не идеал, что-то лучше рассматривалось и в темах. Если будут вопросы - задавайте.
1
|
|
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
|||
| 04.09.2020, 19:45 | |||
|
1
|
|||
|
2642 / 1653 / 267
Регистрация: 19.02.2010
Сообщений: 4,375
|
|
| 04.09.2020, 20:52 | |
|
Если бы под Виндой, а не под ДОСом...
Под Виндой, если задать некоторое ограничение насчёт размеров объектов, будет сильно проще. А именно - объекты предварительно рисуются (в редакторе ресурсов) в размер виндовозного курсора. Вернее, в двух вариантах - как обычный битмап для отрисовки на экране (и тут мне лень думать/вспоминать, как там проще потом будет задавать-менять цвета), и как курсор (но - немного отличаясь при этом от исходного битмапа, дабы показать выделение именно этого объекта). Затем все эти ресурсы надо будет прицепить к проге. И при нажатии мышой на какой-то из кинутых в окно объектов - этот объект удаляется и виндовозный курсор-стрелка меняется на соответствующий объекту курсор. Последующее таскание объекта по экрану происходит автоматом - в смысле, не надо будет перерисовывать ни фон, ни накрываемых объектов. А при отпускании мышиной кнопки - курсор меняется обратно на стрелку, и объект рисуется битмапом в новом месте. Т.е. из необходимой для программирования алгоритмики (в смысле - циклы и структуры данных) оставалась бы только работа со списком объектов (их координаты на экране, их цвета, коды объектов) - дабы при нажатии на кнопку мыши искать-определять, какой объект выбрали. Всё остальное выходило бы в виде линейных последовательностей операций. В принципе, и под ДОСом так же будет - но посложнее (вместо использования ряда готовых функций ВинАПИ придётся кодить врукопашную).
1
|
|
|
Модератор
|
|
| 04.09.2020, 21:15 | |
|
Kukuxumushu,
Это уже детали. Можно ограничить перемещение и фигуры и курсора мыши (менять ограничение при захвате и отпускании фигуры) для постоянного полного изображения фигуры без обрезания. Ещё что-нибудь учудить. Можно менять курсор мыши в зависимости от режима - свободное перемещение (стрелка), перемещение фигуры (кулак), выбор цвета (пипетка). Можно красиво оформить экран - основное окно для фигуры, дополнительное окно для выбора цвета мышкой, окно с подсказками. Окна можно залить фоновым цветом, обрамить рамкой. Внизу сделать строку состояния с отображением координат мыши, фигуры, цвета, режима мыши. Можно менять графический режим - разрешение. Когда готова основа - найдётся и что улучшать. Не по теме: А! Понял!
1
|
|
|
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
|
||||||||||||||||||||||||||
| 05.09.2020, 14:48 | ||||||||||||||||||||||||||
Сообщение было отмечено ФедосеевПавел как решение
Решение
Частой ошибкой начинающих программистов является то, что они, следуя указаниям из книг,
пытаются создать программу, которая напрямую выводит изображение в видеопамять компьютера. При этом как правило возникает следующий результат. Вывести точку или линию можно достаточно быстро, но при выводе сложного изображения мы сталкиваемся с такими эффектами как мерцание, резкое замедление скорости. Легко можно проверить то, что функции BIOS по выводу точки в графических режимах работают настолько медленно, что не пригодны для практики. Между тем, в профессионально написанных программах (в том числе в Windows) и играх мы таких проблем не наблюдаем. Всё дело в том, что обмен компьютера с видеокартой, происходит примерно в 10 (а иногда в 50, см тесты) медленней, чем при работе центрального процессора с ОЗУ (RAM). Программа vidspeed.com наглядно демонстрирует это. Более того. Чтение из видеопамяти происходит ещё медленнее, чем запись, поэтому операция "чтение-модификация-запись" создает большие проблемы, если работать с видеоплатой напрямую. Есть выход: использовать описанные в книгах алгоритмы отображения графики, но в качестве видео буфера применять не видео память, а оперативную память компьютера. При этом сразу достигается выигрыш в быстродействии в несколько десятков раз. Затем особой подпрограммой (она у нас называется sync) результирующее изображение пересылается на видеокарту. Такой подход называется двойной буферизацией. Есть ещё вариант - переключение видеостраниц, когда вся память (например "старого" VGA 256 кбайт) разбивается на страницы (например на 4 по 64 кбайт). Видеокарта отображает одну страницу, а программа в это время рисует на другой (невидимой), затем страницы очень быстро переключаются с помощью регистров видеокарты. В плане быстродействия эти два способы сравнимы - на современных компьютерах быстрее работает двойная буферизация, в эмуляторе DOSBOX почти нет разницы. Однако переключение страниц имеет большой недостаток - например режим 320*200*256 цветов VGA с 4 страницами (mode X) совершенно не поддерживается BIOS. т е для того, чтобы вывести даже отладочную информацию, требуется сначала написать программу отрисовки букв. Очевидно, что этот режим слишком сложен. Поэтому мы будем использовать стандартный режим BIOS VGA 13h и рисовать изображение в обычном ОЗУ. Здесь есть ещё одна трудность: мы не видим результат при записи в буфер RAM до тех пор, пока не выполнена команда sync. Это очень осложняет отладку. Мы можем просто промахнуться при записи байта мимо нашего видео буфера, и программа или эмулятор зависнет, прежде чем мы выполним команду sync. Здесь можно предложить такой выход: мы сначала пишем и отлаживаем программу для работы в обычной видеопамяти, а затем переделываем низкоуровневые подпрограммы (plot, cls, sync) для работы с буфером RAM. Идея программы такая: мы в бесконечном цикле опрашиваем состояние мышки, и если левая кнопка мышки не нажата, то вызываем подпрограмму selectmobs, которая выбирает объект под курсором. Если же лкм нажата, мы вызываем подпрограммы
Может показаться, что подпрограммы cls и sync довольно медленные, так как они имеют дело с памятью целого экрана. Но на самом деле эти подпрограммы оптимизированы с помощью команды rep movsd, в то время как отрисовка линий в центральной подпрограмме drawtest требует массы операций с координатами и адресами точек. Для построения линий нам нужна быстродействующая подпрограмма. Такая подпрограмма основана на алгоритме Брезенхема и была переведена напрямую с примера на языке QBasic пример на QBasic
из ломаных, см подпрограмму drawshape. Нужно лишь рассчитать координаты точек линии относительно центра фигуры, например для квадрата:
Первое слово - число линий, далее идут координаты x,y относительно центра фигуры. Программа movobj написана как com файл, хотя сегмента фактически 2 - за вершиной стека идёт видеобуфер (64000 байт) Программа предназначена для запуска в DosBox, хотя у меня на XP нормально запускается и без эмулятора. bat - файл компиляции
Программа movobj.asm
2
|
||||||||||||||||||||||||||
|
Модератор
|
|
| 05.09.2020, 15:21 | |
|
qbfan, классно!
А если объекты характеризовать не только перечислением координат, а ещё и указателями на процедуры отрисовки - тогда окружность будет ближе к идеальной.
1
|
|
| 05.09.2020, 15:21 | |
|
Помогаю со студенческими работами здесь
7
Выделение и перемещение объектов мышкой Перемещение мышкой нарисованных объектов
Написать программу движения 3-х разных геометрических фигур по экрану Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|