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

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

  1. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    valterg
    можно было вместо константы: radius equ 99
    завести переменную: radius dw 99
    и шаг за шагом переделать всю программу, а затем добавить кусок, где радиус вводится с клавиатуры в переменную, но dessaber хочет чтобы писали за него
     
  2. dessaber

    dessaber New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2011
    Сообщения:
    26
    Mikl___
    Я бы так не сказал. Я бы сказал, что у меня не получается.
     
  3. dessaber

    dessaber New Member

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

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    dessaber
    Про удочку это правильно. А с точки зрения программиста - эти программы одинаковы.
    Но ты же не программист :)
     
  5. dessaber

    dessaber New Member

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

    просто это абсурд какой-то, блин. "Я дико крутой программист, ты лопух, я вот тебе чуток намекну, делай сам, ведь это настолько просто, что мне ажно лениво".
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Если бы люди учились сразу, то тыбы сейчас не задавал вопрос как сделать.
    Вот для обучения тебе, вернее тебе и надо тренироваться набивать шишки. Поэтому и надо переписывать программу.
     
  7. dessaber

    dessaber New Member

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

    Вопрос, при использовании equ переменная какой размерности получается?
     
  8. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    equ это не переменная. Это константа, подставляемая прямо по месту. И будет той размерности, которую по месту получило бы просто число, подставленное в этом месте.
     
  9. ejbfcrfvyr

    ejbfcrfvyr New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2011
    Сообщения:
    18
    В своё время я довольно много почерпнул инфы из speccy 48k. Особенно по части алго. Разумно и вам посмотреть алго оттуда. Стоит сказать что камень там был 8-мибитный и не мог делить даже. Рисовалось всё в памяти и весьма быстро.
    Там кстате и родильсь идеи виртуализации - был p-код и виртуальная машина для вычисления математики. Сейчас же псевдо-виртуальные машины того уровня не достигли.
     
  10. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    dessaber
    Мы же тоже не бездельники и другие дела есть. Я например мало загружен и показал тебе идею, как надо переделывать.
    Думал сообразишь и неохота было еще пару примеров давать... Поэтому не сердись, а прояви терпение.
    Просто тут в основном в новичках ленивый народ попадается, вот ты и попал под раздачу.
    А главное ты тут долго сопротивлялся нормально задачу запрограммировать - это не дело. Репутацию свою испортил.
     
  11. dessaber

    dessaber New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2011
    Сообщения:
    26
    valterg
    о боже, жалость-то какая.

    не получается, вот и сопротивляюсь. И я же ведь не выкладываю сюда все свои потуги написать чего-нибудь.
     
  12. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Забыл кавычки поставить :) "Репутацию испортил"...
     
  13. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    Извращенцы гы. Агло Брезенхема есть и юзалось есчо в древние времена, када пэвм были большими и медленными.
    ftp://ftp.worldofspectrum.org/pub/sinclair/books/CompleteSpectrumROMDisassemblyThe.pdf
    Код (Text):
    1. THE 'DRAW' ALGORITHM
    2. The following BASIC program illustrates the essential parts of the DRAW operation when being used to produce a straight line. The
    3. program in its present form only allows for lines where X > Y.
    4.  
    5.    10   REM DRAW 255,175 PROGRAM
    6.    20   REM SET ORIGIN
    7.    30   LET PLOTx=0: LET PLOTy=0
    8.    40   REM SET LIMITS
    9.    50   LET X=255: LET Y=175
    10.    60   REM SET INCREMENT,i
    11.    70   LET i=X/2
    12.    80   REM ENTER LOOP
    13.    90   FOR B=X TO 1 STEP -1
    14.   100  LET A=Y+i
    15.   110  IF X> A THEN GO TO 160
    16.   120  REM UP A PIXEL ON THIS PASS
    17.   130  LET A=A-X
    18.   140  LET PLOTy=PLOTy+1
    19.   150  REM RESET INCREMENT,i
    20.   160  LET i=A
    21.   170  REM ALWAYS ALONG ONE PIXEL
    22.   180  LET PLOTx=PLOTx+1
    23.   190  REM NOW MAKE A PLOT
    24.   200  PLOT PLOTx,PLOTy
    25.   210  NEXT B
    26.  
    27. A complete algorithm is to found in the following program, as a subroutine that will 'DRAW A LINE' from the last position to X,Y.
     
  14. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    kejcerfcrv
    О алгоритме Брезенхема говорится на первой странице, dessaber нужно чтобы за него написали программу, а ты еще и на Бейсике пример привёл [​IMG], сейчас ТС монитор слюнями забрызгает... [​IMG]
     
  15. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    kejcerfcrv
    Какая кавайная книжка... А лет ...дцать назад её на барахолке барыжили едва ли не за четверть цены самого Спектрума.
     
  16. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    Там просто по возможности авторы пытались обойти всякие плавающие вычисления, так как это програмный эмулятор делал и весьма медленно. Поэтому алгоритмы от туда весьма эффективны, в отличие от ваших, где на каждой операции fpu дёргается.
     
  17. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    kejcerfcrv
    FPU в #7 использовалось, чтобы наглядно показать, как от уравнения эллипса [math]X^{2}/A^{2}+Y^{2}/B^{2}=1[/math], при заданном [math]X[/math] рассчитать [math]Y=B\sqrt{1-X^{2}/A^{2}}[/math], чуть выше в #5 вывод окружности используя целочисленные операции. Здесь дальнейшее развитие темы вывода эллипса
     
  18. dessaber

    dessaber New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2011
    Сообщения:
    26
    Кароче, вот он, первый в истории рунета эллипс для дебилов (со вводом :)).
    Код (Text):
    1. .MODEL small
    2. .386
    3. .STACK 100h
    4. .DATA
    5.  step dq 0.01  ;инкрементарная величина угла
    6.  R dw 10        ;константа для ввода
    7.  a dw 0          ;горизонтальный радиус
    8.  b dw 0          ;вертикальный радиус
    9.  tmp dw ?      ;величина для промежуточных вычислений
    10.  t dq 0           ;угол поворота
    11.  message1 db  0dh,'Enter A :  $'      
    12.  message2 db  0ah,0dh, 'Enter B: $'
    13. .CODE
    14.  mov ax, @data
    15.  mov ds, ax
    16.  
    17.  xor ax,ax
    18.  
    19.  mov ah,9                               ;функция вывода строки
    20.  mov dx, offset message1       ;отправка строки в dx
    21.  int 21h
    22.  xor ah,ah
    23.  mov ah,1
    24.  int 21h
    25.  xor ah,ah
    26.  sub ax,30h
    27.  mul R
    28.  mov a,ax                              
    29.  
    30.  xor ax,ax
    31.  
    32.  mov ah,1
    33.  int 21h
    34.  xor ah,ah
    35.  sub ax,30h
    36.  add a,ax                              
    37.  
    38.  xor ax,ax
    39.  
    40.  mov ah,9                              
    41.  mov dx, offset message2              
    42.  int 21h
    43.  xor ah,ah
    44.  mov ah,1
    45.  int 21h
    46.  xor ah,ah
    47.  sub ax,30h
    48.  mul R
    49.  mov b,ax
    50.  
    51.  xor ax,ax
    52.  
    53.  mov ah,1
    54.  int 21h
    55.  xor ah,ah
    56.  sub ax,30h
    57.  add b,ax
    58.  
    59.  xor ax,ax
    60.  
    61.  mov al, 12h    ;видеорежим 640*480
    62.  xor ah, ah    
    63.  int 10h        
    64.  
    65.  finit              ;инициализация сопроцессора
    66.  mov cx, 629    ;число итераций (обусловлено шагом 0.01)
    67.  
    68. next:
    69.  push cx         ;помещение числа итераций в стек из сх
    70.  
    71.  fld t          ;вещественное помещение t в стек сопроцессора
    72.  fld t          ;да еще раз; st(0) = st(1) = t
    73.  fsin          ;st(0) = sin(t), st(1) = t    
    74.  fild b        ;st(0) = b, st(1) = sin (t), st(2) = t
    75.  fmul         ;st(0) = b*sin(t), st(1) = t
    76.  fistp tmp        ;целочисленное изъятие st(0) -> tmp
    77.  mov dx, tmp   ;координата у
    78.  add dx, 240    ;середина экрана (по вертикали)
    79.  fcos         ;st(0) = cos(t)
    80.  fild a        ;st(0) = a, st(1) = cos(t)
    81.  fmul         ;st(0) = a*cos(t)
    82.  fistp tmp
    83.  mov cx, tmp   ;координата х
    84.  add cx, 320    ;середина экрана (по горизонтали)
    85.  
    86.  mov ah, 0ch   ;рисование точки
    87.  mov al, 1     ;цвет (синий)
    88.  int 10h
    89.  
    90.  fld t           ;st(0) = t
    91.  fld step      ;st(0) = step, st(1) = t
    92.  fadd           ;st(0) = step + t
    93.  fstp t          ;t = step + t
    94.  
    95.  pop cx        ;забираем число итераций из стека в сх
    96.  loop next    
    97.  
    98.  mov ah, 4ch ;корректный выход
    99.  int 21h
    100.  
    101. END
     
  19. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    dessaber
    Ровно месяц! Поздравляю!
    Замечания:
    1) радиусы от 0 до 99, хотя видеорежим позволяет ввести радиус до 240
    2) после процедуры рисования сразу выход, дай людям посмотреть на свой эллипс
    3) перед выходом восстанови текстовый режим, иначе, чтобы убрать муть с экрана приходится жать на Ctrl+Alt+Del
    4)
    Код (ASM):
    1.  finit              ;инициализация сопроцессора
    2.  mov cx, 629    ;число итераций (обусловлено шагом 0.01)
    3. next: push cx         ;помещение числа итераций в стек из сх
    4.  fld t          ;вещественное помещение t в стек сопроцессора
    5.  fsincos          ;st(0) = sin(t), st(1) = cos(t)    
    6.  fimul b        ;st(0) = b*sin(t), st(1) = cos(t)
    7.  fistp tmp        ;целочисленное изъятие st(0) -> tmp
    8.  mov dx, tmp   ;координата у
    9.  add dx, 240    ;середина экрана (по вертикали)
    10.  fimul a         ;st(0) = a*cos(t)
    11.  fistp tmp
    используй команду fsincos и сразу умножай на A и B без загрузки их в FPU
     
  20. dessaber

    dessaber New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2011
    Сообщения:
    26
    Mikl___
    я не я, кобыла не моя. Смотрят люди спокойно, до нажатия enter.

    аналогично. 99 на каждый, сойдет в общем.

    аналогично.