Вывод спирали на экран в DOS

Тема в разделе "WASM.DOS/BIOS/Vesa/ports", создана пользователем Mikl___, 14 мар 2017.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792

    Вывод спирали на экран в DOS


    Теория


    Архимедова спираль — спираль, плоская кривая, траектория точки [math]M[/math], которая равномерно движется вдоль луча [math]OV[/math] с началом в [math]O[/math], в то время как сам луч [math]OV[/math] равномерно вращается вокруг [math]O[/math]. Другими словами, расстояние [math]\rho=OM[/math] пропорционально углу поворота [math]\varphi[/math] луча [math]OV[/math]. Повороту луча [math]OV[/math] на один и тот же угол [math]\varphi[/math] соответствует одно и то же приращение [math]\rho[/math].
    Уравнение Архимедовой спирали в полярной системе координат записывается так:
    [math]\rho=k\cdot \varphi[/math] где [math]k[/math] — смещение точки [math]M[/math] по лучу [math]r[/math], при повороте на угол равный одному радиану.
    Повороту прямой на [math]2\cdot\pi[/math] соответствует смещение [math]a=|BM|=|MA|=2\cdot k\cdot\pi[/math]. Число [math]a[/math] — называется шагом спирали. Уравнение Архимедовой спирали можно переписать так: [math]\rho=\frac{a}{2\cdot \pi}\cdot\varphi[/math] (1)
    При вращении луча против часовой стрелки получается правая спираль, при вращении — по часовой стрелке — левая спираль. Обе ветви спирали (правая и левая) описываются одним уравнением (1). Положительным значениям [math]\varphi[/math] соответствует правая спираль, отрицательным — левая спираль. Если точка [math]M[/math] будет двигаться по прямой [math]UV[/math] из отрицательных значений через центр вращения [math]O[/math] и далее в положительные значения, вдоль прямой [math]UV[/math], то точка [math]M[/math] опишет обе ветви спирали.
    Луч [math]OV[/math], проведенный из начальной точки [math]O[/math], пересекает спираль бесконечное число раз — точки [math]B[/math], [math]M[/math], [math]A[/math] и так далее. Расстояния между точками [math]B[/math] и [math]M[/math], [math]M[/math] и [math]A[/math] равны шагу спирали [math]a=2\cdot k\cdot\pi[/math]. При раскручивании спирали, расстояние от точки [math]O[/math] до точки [math]M[/math] стремится к бесконечности, при этом шаг спирали остается постоянным (конечным), то есть, чем дальше от центра, тем ближе витки спирали, по форме, приближаются к окружности.

    Практика


    Две пересекающиеся спирали. [math]X[/math] и [math]Y[/math] рассчитываются по формулам:
    • [math]X=\alpha\cdot a\cdot Cos(\alpha)[/math]
    • [math]Y=\alpha\cdot a\cdot Sin(\alpha)[/math]
    Код (ASM):
    1. ; masm dos exe #
    2. .model small
    3. .data
    4. delta dd 0.001 ;величина изменения
    5. divK dd 5.0 ;расстояние между дугами
    6. xr dw 0 ;координаты выводимой точки
    7. yr dw 0
    8. .code
    9. .486
    10. start:mov ax,@data
    11.     mov ds,ax
    12.     mov cx,0C470h ;количество итераций цикла
    13.     mov ax,12h   ;инициализация графического режима 640х480х16 цветов
    14.     int 10h
    15. ;------------------------------------------------------------------
    16.     finit ;инициализация сопроцессора
    17.     fldz
    18.     mov ah,0Ch; функция 10h прерывания - установить точку
    19.     xor bx,bx
    20. l1: fld st
    21.     fld st
    22.     fsincos      
    23.     fmul divK
    24.     fmul st,st(2)
    25.     fistp word ptr xr ;заносим X в переменную для вывода на экран
    26.     fmul divK
    27.     fmul
    28.     fistp word ptr yr ;заносим Y в переменную для вывода на экран
    29.     push cx
    30.     mov cx,xr
    31.     mov dx,yr
    32.     add dx,240; 240 - половина высоты экрана в этом режиме
    33.     add cx,320; 320 - половина ширины экрана в этом режиме
    34.     mov al,0A3h; цвет правой спирали
    35.     int 10h           ;выводим точку заданным цветом
    36.     sub dx,yr
    37.     sub dx,yr
    38.     mov al,0A4h; цвет левой спирали
    39.     int 10h           ;выводим точку заданным цветом
    40.     pop cx
    41.     fadd delta;вычисляем новое значение alpha
    42.     loop l1 ;цикл по cx
    43. ;--------------------------------------------------------------------
    44.     mov ah,0 ;ожидание нажатия клавиши
    45.     int 16h
    46.     mov ax,3 ;перевод обратно в TextMode
    47.     int 10h
    48.     mov ah,4Ch ;стандартный выход
    49.     int 21h
    50. end start
     
    Последнее редактирование: 15 мар 2017
    Коцит нравится это.