![]() |
|
![]() ![]() ![]() |
|
CreatoR |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 8.4.2004 Репутация: нет Всего: нет |
Нужно средствами асемблера реализовать отрисовку примитивов:
- Прямоугольник - Круг - Прямоугольник с заливкой - Круг с заливкой Все эти функции должны вызыватся из С или же просто в него интернированны... Очень нужно информация по этому вопросу. желательно с кодом. |
|||
|
||||
Alexander77 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 27.4.2007 Репутация: нет Всего: нет |
Платформа какая (Windows/DOS)? Можно DLL-ку сделать, вызывать будешь на чём нравиццо. Ну и критично ли какой асм (masm/fasm/tasm/what else).
По поводу исходников: самое сложное — круг, поэтому вот что есть "в природе" из кода: http://www.programmersheaven.com/mb/x86_as...eadmessage.aspx |
|||
|
||||
Mikl__ |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 18.5.2007 Репутация: 1 Всего: 1 |
Если под DOS
У окружности координаты любой точки относительно ее центра вычисляются из соотношения R^2=X^2+Y^2, где R радиус окружности. С точки зрения программирования достаточно нарисовать 1/8 часть окружности, а симметрия закончит дело. В языках программирования высокого уровня существует специальная функция CIRCLE, которая строит окружность либо, вычисляя синус, либо, двигаясь например по оси X вычисляет на каждом шаге координату Y по формуле . В языке ассемблера для вычисления квадратного корня или функции синуса пришлось бы использовать обращение к сопроцессору, а такая программа с точки зрения ассемблера работает непозволительно долго. Подумаем, как нам реализовать более быстрый метод рисования окружностей используя только целочисленную арифметику, ведь на экране можно выводить точку только туда, где находится люминофор, а не между люминофорами, или смещать точку на долю микрона вправо или влево. Пусть центр окружности находится в точке (0, 0) Y=R=100 и X=0 по формуле Y2 равен R2-X2. По мере движения по оси X мы должны выяснить, когда нам необходимо уменьшить Y. Это нужно сделать если отклонение от Y будет больше 0,5 величины люминофора, т.е. больше должна засвечиваться соседняя точка. Вычисляем квадрат отклонения: (Y-0,5)^2=Y^2-Y+0,25. Выражение Y^2-Y вычисляется в целых числах, а 0,25 игнорируем. Если разность R^2-X^2 больше чем Y^2-Y необходимо уменьшить Y на единицу и опять пересчитать ту величину, когда необходимо будет снова изменить Y и так в цикле. Вы выводите N точек, где N вычисляется из значения L=2*Pi*R. Так как Вам надо нарисовать 1/8 окружности N=L/8=Pi*R/4≈157*R/200.
Данная программа выводит на экран окружность, заданного радиуса и цвета, с центром, определенным координатами (R, R). Скорость прорисовки окружности можно увеличить, если не вычислять координату в каждой точке, а вычислять координаты только в начале рисования 1/8 окружности, а далее прибавлять или вычитать 1 к содержимому регистра BP при изменении координаты X и прибавлять или вычитать 320 (длина строки в режиме 13h (320x200x256)) к содержимому регистра DI при изменении координаты Y. Также для увеличения скорости умножение координаты Y на 320 заменено на операции сдвига и сложения. |
|||
|
||||
Mikl__ |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 18.5.2007 Репутация: 1 Всего: 1 |
Для рисования окружности, круга под Win-32 используется функция WinAPI Ellipse
Описание: function Ellipse(DC: HDC, X1, Y1, X2, Y2: Integer): Bool; Рисует эллипс, центpиpованный в огpаничивающем пpямоугольнике, гpаница котоpого наpисована текущим пеpом и заполнена текущей кистью Паpаметpы: DC: Идентификатоp контекста устpойства. X1, Y1: Веpхний левый угол огpаничивающего пpямоугольника. X2, Y2: Пpавый нижний угол огpаничивающего пpямоугольника. Возвpащаемое значение: Не нуль, если эллипс наpисован; нуль - в пpотивном случае. функция находится в файле gdi32.dll Если элипс вписать в квадрат будет круг. Окружность будет нарисована цветом текущего пера (по умолчанию черный), заполнена текущей кистью (по умолчанию белой) Для отрисовки прямоугольника или прямоугольника с заливкой используй функцию WinAPI Rectangle Описание: function Rectangle(DC: HDC, X1, Y1, X2, Y2: Integer): Bool; Рисует пpямоугольник, используя выбpанное пеpо, и закpашивает его внутpенность с помощью текущей выбpанной кисти. Паpаметpы: DC: Идентификатоp контекста устpойства. X1, Y1: Веpхний левый угол пpямоугольника. X2, Y2: Пpавый нижний угол пpямоугольника. Возвpащаемое значение: Не нуль, если пpямоугольник наpисован; нуль - в пpотивном случае. функция находится в файле gdi32.dll |
|||
|
||||
LITEOMILL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 23.1.2023 Репутация: нет Всего: нет |
Модератор: Сообщение скрыто. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Asm: Общие вопросы" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |