![]() |
|
|
![]()
|
|
| jaAlex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 31.5.2006 Где: Краснодар Репутация: нет Всего: нет |
Помогите, пожалуйста, решить такую задачку: нужно в графическом режиме 320x200 256 цветов нарисовать буковку "К" так, что ее высота 100 (50 сверху, 50 снизу), толщина 25, и полукруглые очертания. Желательно с примером. Заранее спасибо всем откликнувшимся.
P.S. Я насколько знаю, делается это прорисовкой по пикселам. Дк каждую линию отдельно прорисовывать чтоли? |
|||
|
||||
| makwen |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 163 Регистрация: 9.11.2005 Где: Киев Репутация: нет Всего: 1 |
код для установки режима 320х200 256 цветов:
используй функцию 0Ch прерывания INT 10h, которая рисует пиксель. Пример:
Создавай циклы и прорисовуй свою букву "К"! Удачи! |
||||
|
|||||
| jaAlex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 31.5.2006 Где: Краснодар Репутация: нет Всего: нет |
А как циклы - то создавать? Вот, к примеру, в твоем втором коде как сделать так, чтобы dx увеличивалась с 50 до 75? И еще такой вопрос: как задать условие типа if...then? Ну, все в том же коде надо так: когда dx=75, то прибавить к cx 1 и чтобы dx опять стала равна 50. Ну и снова цикл пошел, разумеется. Как вот все это, подскажи пожалуйста.
|
|||
|
||||
| makwen |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 163 Регистрация: 9.11.2005 Где: Киев Репутация: нет Всего: 1 |
мда... я думаю, что за один пост не смогу описать синтаксис языка Assembler. Так что бери любую книгу по асму, и читай, там все ясно написано!
Например Питер Абель "Ассемблер. Язык и программирование для IBM PC" |
|||
|
||||
| anwe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 1 Всего: 23 |
Даю наводку. Заметь слово пишеться слитно, тот есть не даю на выпивку!
Для примера - код, выводящий вертикальную составляющую буквы "К"
Остальное, таким же способом, додумывай сам. Можно еще посоветовать, чтобы было легче расчитать букву, сделай сначала ее на бумаге и просчитай координаты граничных точек. Лучше сначала прорисовать верхнюю линию буквы, потом нижнюю. Там надо за раз менять и di и bx. То есть не то хотел сказать. Хотел сказать, что надо отдельно прорисовывать верхнюю линию, потом нижнюю. Так не то, что надо, так просто удобней. Это сообщение отредактировал(а) anwe - 20.10.2006, 21:27 |
|||
|
||||
| jaAlex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 31.5.2006 Где: Краснодар Репутация: нет Всего: нет |
Вот такая буковка получилась. Но что - то какая - то она некрасивая anwe, с твоим кодом не разобрался пока, только напортачил - TP повис, и все... |
|||
|
||||
| jaAlex |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 31.5.2006 Где: Краснодар Репутация: нет Всего: нет |
Вот код программы, которая рисует линию. Я хочу, чтобы таких линий было 100, и чтобы они были друг под другом. Для чего делаю так:
Помоему, все правильно, но программа виснет, и не воспринимает нажатия никаких кнопок с клавиатуры. Цикл в цикле неправильно делаю, чтоли, а может еще чего. Что тут не так? Почему виснет? Подскажите плз!!! Заранее спасибо всем откликнувшимся. |
||||
|
|||||
| anwe |
|
||||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 1 Всего: 23 |
Не знаю, что там можно напортачить. Ну да ладно. В твоем последнем коде 3 ошибки. 1. Не верно указан адрес ячейки памяти в видеопамяти. Не там стоит скобка. Вместо
надо
2. Не верный цикл в цикле.
Не верное использование регистра cx. Второй цикл начнется с нулевым его значением. Для этого нужно использовать либо стек, где хранить cx для внешнего цикла, либо другой регистр. Использование стека в цикле -
3. Я тебе предложил функцию DOS, которую правильнее использовать для целей выхода по нажатию клавиши. Выбранная тобой функция BIOS имеет другие цели. Ну да ладно. Не это главное. Главное то, что для выхода при нажатии надо же ведь проверять результат!!! Для твоей функции надо проверять содержимое ah:
И напоследок 2 примечания. 1) При выходе в DOS лучше перевести видеорежим в текстовый:
2)У тебя не прорисует толстую линию, так как при каждом внешнем цикле bx получает значение 16020. Его надо вынести за пределы внешнего цикла. |
||||||||||||||
|
|||||||||||||||
| jaAlex |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 31.5.2006 Где: Краснодар Репутация: нет Всего: нет |
Вот такая буковка "К" у меня получилась. По - моему, нормально. И вот у меня такой еще вопрос появился. Вот линия:
А как сделать ее такой, чтобы ее угол наклона был меньше, т.е. вот чтобы каждая следующяя линия сдвигалась налево не на 1 пиксель, а, скажем, на 0.5? |
||||
|
|||||
| anwe |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 1 Всего: 23 |
Нормально.
|
||||
|
|||||
| jaAlex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 31.5.2006 Где: Краснодар Репутация: нет Всего: нет |
А как можно повысить разрешение? И еще: как задать пропорцию? Я еще до этого думал, что пропорция какая - то должна быть, посчитал так, чтоб линию из угла экрана в угол наискосок пропорция 5/8 выходит. Но где ее задать - незнаю. И как задать тоже незнаю. Если не составит труда, подскажи пожалуйста. |
|||
|
||||
| anwe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 1 Всего: 23 |
Установи SVGA режим. Здесь техника такая.
Так как одного сегмента DOS для всего изображения в SVGA режиме недостаточно, необходимо перемещать окна (так называемые банки) видео памяти. Делает это функция BIOS $4F. Вобщем давай так. Вот тебе пример, где прорисована линия на экране с разрешением 640х480. Выход из программы - по нажатию клавиши. Попробуй сам разобраться, у меня сейчас нет времени. Если что - позже. Вот код:
|
|||
|
||||
| jaAlex |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 31.5.2006 Где: Краснодар Репутация: нет Всего: нет |
Вроде разобрался. Но вот это у меня TP никак воспринимать нехочет, ругается сильно:
Я что только уж не делал, никак не хочет. Как тут вот поступить надо? В коде вроде бы разобрался, но получается разрешение, по - моему, не 640х480, а 640х400, ведь разрешение стандартного графического режима 320х200, а мы его увеличиваем с угла. Вот с разрешением еще пока не разобрался. |
||||
|
|||||
| anwe |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 1 Всего: 23 |
Переменную надо объявлять так:
Не, здесь тупое умножение на коэффициент не правильно. А как же быть, по-твоему, с другими разрешениями, к примеру 800х600? |
||||
|
|||||
| jaAlex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 31.5.2006 Где: Краснодар Репутация: нет Всего: нет |
Тут сразу уйма вопросов возникла по поводу этого графического режима. Но не буду тебя грузить, и так достал уже наверно...
Но все же, ответь пожалуйста еще на парочку вопросов. Вот наклонная линия:
Но почему - то она как зебра. Точнее даже я примерно предполагаю почему она такая, но сделать ее не в полосочку никак не получается. Помоги пожалуйста исправить мои ошибки и нарисовать ее нормально, не в полосочку. Заранее большое спасибо. P.S. Угол наклона именно такой вот должен быть, это я буковку "А" нарисовать пытаюсь. Это сообщение отредактировал(а) jaAlex - 22.10.2006, 23:47 |
|||
|
||||
| anwe |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 1 Всего: 23 |
Но есть "но". Такую ошибку, а скорее недочет ты бы и сам нашел. Это же элементарно. Пробуй! Программирование - наука экспериментальная. У тебя разрешение 320х200, что значит 320 точек в строке, а строк 200. Нас сейчас интересует количество точек в строке. Ты добавляешь 616 и перескакиваешь через строку: 320*2=660 плюс наклон и минус длина линии. А ты сделай тоже, но в следующей строке: 320-25 (длина линии) + 1 (смещение для наклона). Но тогда, возможно, изменится наклон. Проверь. Скорее всего да. Сейчас, просто поздно Если так, тогда оставляй все как есть, но прорисовывай две линии. То есть прямо в цикле делай так:
Тогда у тебя, как бы утолщится каждая линия и они дожны слиться воедино. И наклон не должен изменится. Вот тебе два варианта. Это сообщение отредактировал(а) anwe - 24.10.2006, 00:05 |
||||
|
|||||
| jaAlex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 31.5.2006 Где: Краснодар Репутация: нет Всего: нет |
anwe, большое спасибо за помощь. В итоге я почитал тут умные книжки и сделал все заливкой, с закругленными краями. Ну, в общем, красиво.
|
|||
|
||||
| anwe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 1 Всего: 23 |
А полюбоваться можно? прикрепи, если не сложно, результат.
|
|||
|
||||
| jaAlex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 31.5.2006 Где: Краснодар Репутация: нет Всего: нет |
||||
|
||||
| jaAlex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 31.5.2006 Где: Краснодар Репутация: нет Всего: нет |
Долго не отвечал, занят был... В общем, вот что у меня получилось. Шахматная однобайтовая заливка. А написаны мои инициалы. По - моему, нормально получилось. |
|||
|
||||
| anwe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 1 Всего: 23 |
Ну ты и приколист!
Только у букв "А" сверху не хватает по одной линии справа. Присмотрись. |
|||
|
||||
| jaAlex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 31.5.2006 Где: Краснодар Репутация: нет Всего: нет |
anwe, дк на скорую руку делал... Еще хотел спросить, как сделать заливку этих буковок таким же способом, но 4 - байтовой заливкой???
|
|||
|
||||
| anwe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 1 Всего: 23 |
При 4-байтовой байт 0 содержит значение синего цвета, 1 - зеленого, 2 - красного, 3 - резервный. И еще при разрешении 320х200 это номер функции... забыл
|
|||
|
||||
![]()
|
| Правила форума "Asm: Общие вопросы" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |