Нарисовать эллипс

Тема в разделе "WASM.DOS/BIOS/Vesa/ports", создана пользователем dessaber, 20 ноя 2011.

  1. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    а затем, что увеличивая на единицу [math]X[/math] от [math]-A[/math] до [math]A[/math], по формуле [math]B\sqrt{1–X^{2}/A^{2}}[/math] ты бы вычислял [math]Y[/math] и рисовал эллипс, точка за точкой, ну, а если не хочешь, то тогда подбирай, подбирай... нарисуешь эллипс не забудь выложить результат. [​IMG]
     
  2. dessaber

    dessaber New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2011
    Сообщения:
    26
    Mikl___
    Не ну а если чисто разобраться, что не так? Недостаточная, как ты говоришь, плавность прорисовки? Ну так он и у тебя не сплошняком рисует.

    Да и почему CBW не помогает?
    Код (Text):
    1. aw dw 0
    2. ...
    3. mul x ;makin AХ equal to X^2
    4. mov dx,ax
    5. xor ax,ax
    6. mov al,a
    7. cbw
    8. mov aw,ax
    9. xor ax,ax
    10. mov ax,dx
    11. div aw
    Под А размерностью в слово править больше надо
     
  3. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    dessaber
    потому что cbw используется с командой idiv а у тебя div
    а кто сказал, что будет легко?
     
  4. dessaber

    dessaber New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2011
    Сообщения:
    26
    Mikl___
    Ок я поменял на idiv и все то же самое.
     
  5. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    dessaber
    Меняй не меняй -- идея с подбором "тупая", но это ТВОЯ идея -- вот тебе с ней и возится, на много проще было взять мою готовую программу и добавить туда ввод твоих радиусов, насколько я понимаю преподавателей, подошла бы и программа с подстановкой в текст программы любого радиуса с перекомпиляцией на глазах преподавателя и повторным запуском, тут главное в том, что ты якобы понял, как этот эллипс рисуется, ввод радиуса это уже не так интересно, и оценивается меньшим количеством баллов, но я об этом уже писал...
     
  6. dessaber

    dessaber New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2011
    Сообщения:
    26
    Mikl___
    Почему?

    Это не суть, но ты не правильно понимаешь. Здесь не баллы, здесь сдал/не сдал. В данном случае - нет ввода => нет зачета.

    Все-таки почему не работает не понятно...
     
  7. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    dessaber
    программа-отладчик -- отличное подспорье в изучении ассемблера [​IMG]
     
  8. dessaber

    dessaber New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2011
    Сообщения:
    26
    Mikl___
    Все смотрел, все на месте.

    Разобрались уже что переменные не нули, т.е. проблема в размерностях. По коду проблем с ними быть не должно.
     
  9. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    то есть вас там несколько? ну, надеюсь, что к утру готовую программу выложите на сайт...
     
  10. dessaber

    dessaber New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2011
    Сообщения:
    26
    Mikl___
    Я смотрю ты заинтересован в этом сильно. Хотя нет, пожалуй не очень.
     
  11. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    dessaber
    Если, честно, даже спортивного интереса в этом нет...
     
  12. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Зачем вообще деление? У вас же [math]A[/math] и [math]B[/math] - константы. Умножайте на обратные величины

    [math](X*P)^{2}+(Y*K)^{2} < 1[/math], где [math]P=1/A[/math], [math]K=1/B[/math] - заранее посчитанные константы. А чтоб работать с целыми числами - умножьте неравенство на достаточно большое число [math]R^2[/math] (скажем, на [math]2^{32}[/math], то есть, [math]R=2^{16}[/math]):
    [math](X*M)^2+(Y*N)^2 < R^2[/math], где [math]M=R/A[/math], [math]N=R/B[/math].
     
  13. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    В топике #7 объясняется, как обойтись без деления и вычисления квадратного корня
     
  14. dessaber

    dessaber New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2011
    Сообщения:
    26
    Dmitry_Milk
    ну так то да, разумно

    а не, не разумно. Как 1/A, 1/B будут константами, если A, B вводиться должны?
     
  15. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    dessaber, ну выберите тогда R=A*B :derisive:
     
  16. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    dessaber, а еще воспользуйтесь такими моментами, что [math](X+1)^2=X^2+2\cdot X+1[/math] (и то же самое для [math]Y[/math]), то есть, при изменении координаты на 1 нет необходимости вычислять квадрат заново, а можно получить его из предыдущего значения квадрата и исходного значения умножением на 2 (простой сдвиг) и сложениями - и вы проложите тропу для велосипеда Брезенхема :)
     
  17. dessaber

    dessaber New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2011
    Сообщения:
    26
    Блин, народ приделайте ввод плз. Хотя бы к тем прогам что уже были написаны здесь. У меня не получается.
     
  18. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    dessaber, проблема то в чем? если целочисленный ввод - то обычный цикл по последовательности цифр, в каждой итерации - умножение временного результата на 10 и добавление очередной цифры (естественно не кода символа цифры, а значения).
     
  19. dessaber

    dessaber New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2011
    Сообщения:
    26
    Dmitry_Milk
    по уже написанной проге Mikl___'a так просто не получится (во всяком случае мне так кажется). Там все переменные, связи между ними определены заранее. Чуть попробовал подправить, все сразу полетело, размерности, обращения к переменным и т.д. и т.п. Еще пробовал к примеру сделать все также как у него, только в объявления написал вместо equ =, чтобы по ходу программы можно было значения править и создал переменные двойники чтобы в них залить значения со ввода, и потом в оригиналы через = закинуть. Но я как понял вместе со значение наследуются и свойства, размерность к примеру. Т.е. тоже самый косяк получился.
     
  20. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    А не надо equ на = заменять. Надо творчески:

    Код (Text):
    1. radius  dw   99
    2. .....................
    3.        mov   ax,radius
    4.        sub    ax,1
    5.        mov   bx,ax
    И т.д. Ну и следить чтобы не затереть по ходу другие данные в ax :)