| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > Отрисовка символов |
| Автор: jaAlex 20.10.2006, 18:07 |
| Помогите, пожалуйста, решить такую задачку: нужно в графическом режиме 320x200 256 цветов нарисовать буковку "К" так, что ее высота 100 (50 сверху, 50 снизу), толщина 25, и полукруглые очертания. Желательно с примером. Заранее спасибо всем откликнувшимся. P.S. Я насколько знаю, делается это прорисовкой по пикселам. Дк каждую линию отдельно прорисовывать чтоли? |
| Автор: makwen 20.10.2006, 19:30 | ||||
код для установки режима 320х200 256 цветов:
используй функцию 0Ch прерывания INT 10h, которая рисует пиксель. Пример:
Создавай циклы и прорисовуй свою букву "К"! Удачи! |
| Автор: jaAlex 20.10.2006, 19:51 |
| А как циклы - то создавать? Вот, к примеру, в твоем втором коде как сделать так, чтобы dx увеличивалась с 50 до 75? И еще такой вопрос: как задать условие типа if...then? Ну, все в том же коде надо так: когда dx=75, то прибавить к cx 1 и чтобы dx опять стала равна 50. Ну и снова цикл пошел, разумеется. Как вот все это, подскажи пожалуйста. |
| Автор: makwen 20.10.2006, 20:00 |
| мда... я думаю, что за один пост не смогу описать синтаксис языка Assembler. Так что бери любую книгу по асму, и читай, там все ясно написано! Например Питер Абель "Ассемблер. Язык и программирование для IBM PC" |
| Автор: anwe 20.10.2006, 21:21 | ||
| Даю наводку. Заметь слово пишеться слитно, тот есть не даю на выпивку! Для примера - код, выводящий вертикальную составляющую буквы "К"
Остальное, таким же способом, додумывай сам. Можно еще посоветовать, чтобы было легче расчитать букву, сделай сначала ее на бумаге и просчитай координаты граничных точек. Лучше сначала прорисовать верхнюю линию буквы, потом нижнюю. Там надо за раз менять и di и bx. То есть не то хотел сказать. Хотел сказать, что надо отдельно прорисовывать верхнюю линию, потом нижнюю. Так не то, что надо, так просто удобней. |
| Автор: jaAlex 20.10.2006, 22:11 | ||
Вот такая буковка получилась. Но что - то какая - то она некрасивая anwe, с твоим кодом не разобрался пока, только напортачил - TP повис, и все... |
| Автор: jaAlex 20.10.2006, 23:20 | ||||
Вот код программы, которая рисует линию. Я хочу, чтобы таких линий было 100, и чтобы они были друг под другом. Для чего делаю так:
Помоему, все правильно, но программа виснет, и не воспринимает нажатия никаких кнопок с клавиатуры. Цикл в цикле неправильно делаю, чтоли, а может еще чего. Что тут не так? Почему виснет? Подскажите плз!!! Заранее спасибо всем откликнувшимся. |
| Автор: anwe 21.10.2006, 00:34 | ||||||||||||||
Не знаю, что там можно напортачить. Ну да ладно. В твоем последнем коде 3 ошибки. 1. Не верно указан адрес ячейки памяти в видеопамяти. Не там стоит скобка. Вместо
надо
2. Не верный цикл в цикле.
Не верное использование регистра cx. Второй цикл начнется с нулевым его значением. Для этого нужно использовать либо стек, где хранить cx для внешнего цикла, либо другой регистр. Использование стека в цикле -
3. Я тебе предложил функцию DOS, которую правильнее использовать для целей выхода по нажатию клавиши. Выбранная тобой функция BIOS имеет другие цели. Ну да ладно. Не это главное. Главное то, что для выхода при нажатии надо же ведь проверять результат!!! Для твоей функции надо проверять содержимое ah:
И напоследок 2 примечания. 1) При выходе в DOS лучше перевести видеорежим в текстовый:
2)У тебя не прорисует толстую линию, так как при каждом внешнем цикле bx получает значение 16020. Его надо вынести за пределы внешнего цикла. |
| Автор: jaAlex 21.10.2006, 01:17 | ||||
Вот такая буковка "К" у меня получилась. По - моему, нормально. И вот у меня такой еще вопрос появился. Вот линия:
А как сделать ее такой, чтобы ее угол наклона был меньше, т.е. вот чтобы каждая следующяя линия сдвигалась налево не на 1 пиксель, а, скажем, на 0.5? |
| Автор: anwe 21.10.2006, 01:40 | ||||
Нормально.
|
| Автор: jaAlex 21.10.2006, 05:48 |
А как можно повысить разрешение? И еще: как задать пропорцию? Я еще до этого думал, что пропорция какая - то должна быть, посчитал так, чтоб линию из угла экрана в угол наискосок пропорция 5/8 выходит. Но где ее задать - незнаю. И как задать тоже незнаю. Если не составит труда, подскажи пожалуйста. |
| Автор: anwe 21.10.2006, 11:45 | ||
| Установи SVGA режим. Здесь техника такая. Так как одного сегмента DOS для всего изображения в SVGA режиме недостаточно, необходимо перемещать окна (так называемые банки) видео памяти. Делает это функция BIOS $4F. Вобщем давай так. Вот тебе пример, где прорисована линия на экране с разрешением 640х480. Выход из программы - по нажатию клавиши. Попробуй сам разобраться, у меня сейчас нет времени. Если что - позже. Вот код:
|
| Автор: jaAlex 21.10.2006, 22:04 | ||||
Вроде разобрался. Но вот это у меня TP никак воспринимать нехочет, ругается сильно:
Я что только уж не делал, никак не хочет. Как тут вот поступить надо? В коде вроде бы разобрался, но получается разрешение, по - моему, не 640х480, а 640х400, ведь разрешение стандартного графического режима 320х200, а мы его увеличиваем с угла. Вот с разрешением еще пока не разобрался. |
| Автор: anwe 21.10.2006, 22:15 | ||||
Переменную надо объявлять так:
Не, здесь тупое умножение на коэффициент не правильно. А как же быть, по-твоему, с другими разрешениями, к примеру 800х600? |
| Автор: jaAlex 22.10.2006, 23:43 | ||
| Тут сразу уйма вопросов возникла по поводу этого графического режима. Но не буду тебя грузить, и так достал уже наверно... Но все же, ответь пожалуйста еще на парочку вопросов. Вот наклонная линия:
Но почему - то она как зебра. Точнее даже я примерно предполагаю почему она такая, но сделать ее не в полосочку никак не получается. Помоги пожалуйста исправить мои ошибки и нарисовать ее нормально, не в полосочку. Заранее большое спасибо. P.S. Угол наклона именно такой вот должен быть, это я буковку "А" нарисовать пытаюсь. |
| Автор: anwe 23.10.2006, 23:59 | ||||
Но есть "но". Такую ошибку, а скорее недочет ты бы и сам нашел. Это же элементарно. Пробуй! Программирование - наука экспериментальная. У тебя разрешение 320х200, что значит 320 точек в строке, а строк 200. Нас сейчас интересует количество точек в строке. Ты добавляешь 616 и перескакиваешь через строку: 320*2=660 плюс наклон и минус длина линии. А ты сделай тоже, но в следующей строке: 320-25 (длина линии) + 1 (смещение для наклона). Но тогда, возможно, изменится наклон. Проверь. Скорее всего да. Сейчас, просто поздно Если так, тогда оставляй все как есть, но прорисовывай две линии. То есть прямо в цикле делай так:
Тогда у тебя, как бы утолщится каждая линия и они дожны слиться воедино. И наклон не должен изменится. Вот тебе два варианта. |
| Автор: jaAlex 31.10.2006, 01:23 |
| anwe, большое спасибо за помощь. В итоге я почитал тут умные книжки и сделал все заливкой, с закругленными краями. Ну, в общем, красиво. |
| Автор: anwe 31.10.2006, 14:17 |
| А полюбоваться можно? прикрепи, если не сложно, результат. |
| Автор: jaAlex 3.11.2006, 01:36 |
Вот только сделаю еще парочку фишек с книжки и выложу. Ну, в общем, скоро будет. |
| Автор: jaAlex 14.11.2006, 11:32 | ||
Долго не отвечал, занят был... В общем, вот что у меня получилось. Шахматная однобайтовая заливка. А написаны мои инициалы. По - моему, нормально получилось. |
| Автор: anwe 14.11.2006, 18:57 |
| Ну ты и приколист! Только у букв "А" сверху не хватает по одной линии справа. Присмотрись. |
| Автор: jaAlex 16.11.2006, 23:20 |
| anwe, дк на скорую руку делал... Еще хотел спросить, как сделать заливку этих буковок таким же способом, но 4 - байтовой заливкой??? |
| Автор: anwe 20.11.2006, 01:24 |
| При 4-байтовой байт 0 содержит значение синего цвета, 1 - зеленого, 2 - красного, 3 - резервный. И еще при разрешении 320х200 это номер функции... забыл |