Парабола в ассемблере под ДОС

Тема в разделе "WASM.BEGINNERS", создана пользователем dsoft, 20 май 2007.

  1. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Хочу нарисовать параболу, но вот незадача, не знаю как. Вывести точки не проблема, а как их потом соединить, чтобы получилась эта самая парабола? Знаний не хватает, последний раз занимался ассемблером еще во времена Спектрума. Если можно, то хотя бы скелет кода.
    Просмотрел соседнюю тему с предупреждением для студентов. Эта не студенческая задача и я давно уже вышел из того возраста, когда учатся в институте.
     
  2. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Алгоритм "ЦДА" позволит подобрать такой шаг по одной из осей дабы не делать лишних вычислений и все точки были слитными.
     
  3. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Это что за зверь и где его искать?
     
  4. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Цифровой дифференциальный алгоритм, для линий придумался но его можно приспособить для любой функции. Могу выслать методу по графике, где то должна быть:)
     
  5. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Жду с нетерпением.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну вообще не обязательно как-то по особому выбирать шаг. Главное уметь строить кривулины в граф режиме
     
  7. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    По абсциссе можно взять шаг, равный одной точке, рассчитав коэф. масштабирования, а по ординате достраивать от каждой точки вертикальные отрезки до середины расстояния до соседней и предыдущей точек. Это несколько напоминает алгоритм Брезенхема.
     
  8. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Вот как раз, как строить отрезки я и не знаю. Выводить же попиксельно - неправильно, как мне кажется.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Vov4ick
    Нннууу... Брезенхема напоминает с натяжкой...
    Ну да, будет набор разрозненных точек, а не кривая
     
  10. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Какие все-таки будут реальные советы?
     
  11. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    dsoft
    Ну почему же неправильно? Если ты строишь параболу с шагом в один пиксель, то это будет проще написать и быстрее работать, чем алгоритм Брезенхэма.

    Если же хочется реализовать именно Брезенхэма - то см., например, здесь: http://alglib.sources.ru/graphics/.
     
  12. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
  13. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    К сожалению там нет примеров на Ассемблере. Для Delphi у меня бы вопрос не возникал.
     
  14. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Я так понимаю никто такого вопроса раньше не решал?
     
  15. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    dsoft
    Вывод линии есть у Кулакова. Валяется в сети в электронном варианте.
     
  16. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    Код (Text):
    1. procedure line(x1,y1,x2,y2,color:word);far;assembler;
    2. asm
    3.   cli
    4.   mov ax, 0A000h
    5.   mov es, ax
    6.   mov ax, [bp+0Eh]
    7.   mov bx, [bp+0Ch]
    8.   mov cx, [bp+0Ah]
    9.   mov dx, [bp+08h]
    10.   sub cx, ax
    11.   jns @L00F0
    12.   mov byte ptr cs:[@L013E], 4Eh
    13.   mov byte ptr cs:[@L0168], 4Eh
    14.   neg cx
    15.   jmp @L00FC
    16. @L00F0:
    17.   mov byte ptr cs:[@L013E], 46h
    18.   mov byte ptr cs:[@L0168], 46h
    19. @L00FC:
    20.   sub dx, bx
    21.   jns @L0110
    22.   mov byte ptr cs:[@L0147+1], 0EEh
    23.   mov byte ptr cs:[@L015C+1], 0EEh
    24.   neg dx
    25.   jmp @L011C
    26. @L0110:
    27.   mov byte ptr cs:[@L0147+1], 0C6h
    28.   mov byte ptr cs:[@L015C+1], 0C6h
    29. @L011C:
    30.   xchg bl , bh
    31.   mov si, bx
    32.   shr bx, 2
    33.   add si, bx
    34.   add si, ax
    35.   inc cx
    36.   inc dx
    37.   xor ax, ax
    38.   mov bl , [bp+06h]
    39.   cmp cx, dx
    40.   jb @L014F
    41.   cli
    42.   mov di, cx
    43. @L0136:
    44.   mov es:[si], bl
    45. @L013E:
    46.   inc si
    47.   add ax, dx
    48.   cmp ax, di
    49.   jb @L014B
    50.   sub ax, di
    51. @L0147:
    52.   add si, 0140h
    53. @L014B:
    54.   loop @L0136
    55.   jmp @L016B
    56. @L014F:
    57.   cli
    58.   xchg cx, dx
    59.   mov di, cx
    60. @L0154:
    61.   mov es:[si], bl
    62. @L015C:
    63.   add si, 0140h
    64.   add ax, dx
    65.   cmp ax, di
    66.   jb @L0169
    67.   sub ax, di
    68. @L0168:
    69.   inc si
    70. @L0169:
    71.   loop @L0154
    72. @L016B:
    73.   sti
    74. end;
    в детсве написал (лет эдак 15 назад), особо не пинать (!!!) переносил с Z80 потом на интел ещё гдето валялась рисование эллипсов - помню что расчитывалось по таблице дуга помоему в 45гр. остальные точки достраивались отражением ( работало быстро на Z80 на i так и не перенёс помоему )
     
  17. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Где искать

    Dag

    Спасибо, попробую.
     
  18. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    www.google.ru
    www.eboogle.ru
     
  19. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    вывод линии и у зубкова есть. кстати именно брезенхама. даже вроде рисование круга есть. при чем под 16бит вроде
     
  20. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Ну если по хорошему, то нужно строить в два этапа.
    1. От 0 до X при котором производная дойдет до 1/2. Y=f(X)
    2. Потом от последнего Y и выше до требуемого значения. Ну тут нужно расчитывать X=f(Y)
    Тогда не будет пропусков в графике и не нужно рассчитывать некоторые точки по два раза.