home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 9 / CDACTUAL9.iso / share / Dos / VARIOS / lente / BAK / MATRIZ_1.ASM < prev    next >
Encoding:
Assembly Source File  |  1996-05-15  |  6.9 KB  |  215 lines

  1. .MODEL SMALL,PASCAL
  2. .STACK 100h
  3. .DATA
  4.  
  5. S_Punto STRUC
  6.         Coor_X DB ?
  7.         Coor_Y DB ?
  8.         Coor_Z DB ?
  9. S_Punto ENDS
  10.  
  11.         R_circulo DB 50
  12.         Dist_plano DB 10
  13.         R_esfera DB ?
  14.  
  15.         Ancho_Img DB 120
  16.         MatrizTrans DB 3600 DUP (0)
  17.         Caracter DB '$'
  18.         Pto_Q S_Punto <0,0,0>
  19.         Pto_P S_Punto <0,0,0>
  20.         Pto_I S_Punto <0,0,0>
  21.  
  22.         Distancia DB ?
  23.  
  24. .CODE
  25.  
  26. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  27. ; Macro que devuelve en AX el cuadrado del valor
  28. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  29. Cuadrado MACRO Valor
  30.         mov al,Valor
  31.         mul al
  32. ENDM
  33. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  34. ; Macro que calcula el valor de la variable Distancia
  35. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  36. Calc_Dist MACRO
  37.         xor ax,ax
  38.         xor bx,bx
  39.         Cuadrado Dist_plano     ; Obtenemos D^2
  40.         push ax
  41.         Cuadrado Pto_P.Coor_X   ; Obtenemos Px^2
  42.         push ax
  43.         Cuadrado Pto_P.Coor_Y   ; Obtenemos Py^2
  44.         pop bx
  45.         add ax,bx               ; Calculamos Px^2 + Py^2
  46.         push ax
  47.         Cuadrado R_circulo      ; Obtenemos Rc^2
  48.         pop bx
  49.         sub bx,ax               ; Calculamos (Px^2 + Py^2) - Rc^2
  50.         pop ax
  51.         sub ax,bx               ; Calculamos D^2 -((Px^2 + Py^2) -Rc^2)
  52.         mov Distancia, bx       ; Asignamos el valor a Distancia
  53. ENDM
  54. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  55. ; Macro para calcular Pto_Q.Coor_Z 
  56. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  57. Calc_Qz MACRO
  58.         xor ax,ax
  59.         Raiz Distancia          ; Calculamos SQRT(D)
  60.         add ax,1                ; Calculamos 1+SQRT(D)
  61.         mov Pto_Q.Coor_Z, ax    ; Asignamos el valor a la variable
  62. ENDM
  63. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  64. ; Macro para calcular Pto_I.Coor_X
  65. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  66. Calc_Ix MACRO
  67.         xor ax,ax
  68.         mov ax, Dist_Plano      
  69.         mul Pto_P.Coor_X        ; Calculamos (d * Px)
  70.         push ax
  71.         mov ax, Pto_Q.Coor_Z
  72.         add ax, Dist_Plano      ; Calculamos (Qz + d)
  73.         push ax
  74.         pop bx
  75.         pop ax
  76.         div bx                  ; Calculamos (d*Px) / (Qz +d)
  77.         mov Pto_I.Coor_X, al    ; Asignamos el valor a la variable
  78. ENDM
  79. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  80. ; Macro para calcular Pto_I.Coor_Y
  81. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  82. Calc_Iy MACRO
  83.         xor ax,ax
  84.         mov ax, Dist_Plano      
  85.         mul Pto_P.Coor_Y        ; Calculamos (d * Py)
  86.         push ax
  87.         mov ax, Pto_Q.Coor_Z
  88.         add ax, Dist_Plano      ; Calculamos (Qz + d)
  89.         push ax
  90.         pop bx
  91.         pop ax
  92.         div bx                  ; Calculamos (d*Py) / (Qz +d)
  93.         mov Pto_I.Coor_Y, al    ; Asignamos el valor a la variable
  94. ENDM
  95. ;###############################################
  96. ; Raiz devuelve en AX el valor de la raiz entera
  97. ;###############################################
  98. Raiz PROC NEAR USES cx bx , Operando : WORD 
  99.         ;pop bx
  100.         mov bx, Operando
  101.         xor cx,cx
  102. @bucle:
  103.         inc cl
  104.         Cuadrado cl
  105.         cmp ax,bx
  106.         jle @bucle
  107.         dec cl
  108.         xor ax,ax
  109.         mov al,cl
  110.         ret
  111. Raiz ENDP
  112. ;################################################
  113. ; Dar_Cateto devuelve en AX el valor del cateto
  114. ; opuesto segĂșn el Teorema de Pitagoras
  115. ;################################################
  116. Dar_Cateto PROC NEAR USES bx ,Base:BYTE, Cateto: BYTE
  117.         Cuadrado Base
  118.         push ax
  119.         Cuadrado Cateto
  120.         pop bx
  121.         add ax,bx
  122.         push ax
  123.         call Raiz
  124.         ret
  125. Dar_Cateto ENDP
  126. ;##################################################
  127. ; Crear_Matriz modifica la matriz de transformacion
  128. ;##################################################
  129. Crear_Matriz PROC USES bx cx dx
  130. LOCAL Cnt_X: BYTE,Cnt_Y:BYTE, Desp_Pant :WORD, Desp_Mat :WORD, \
  131. Medio_Ancho :BYTE
  132.  
  133.         mov al, Ancho_Img       
  134.         shr al,1                ; Dividimos por dos el Ancho
  135.         mov Medio_Ancho, al     ; Lo almacenamos en Medio_Ancho
  136.         xor cx,cx
  137. @Bucle_for1:                    ; Bucle FOR Cnt_X = 0 TO Medio_Ancho para 
  138.         inc cl                  ; la coordenada X
  139.         mov Cnt_X,cl
  140.         xor cx,cx
  141.    @Bucle_for2:                 ; Bucle FOR Cnt_Y = 0 TO Medio_Ancho para
  142.                 inc cl          ; la coordenada Y
  143.                 mov Cnt_Y,cl
  144.                 push Cnt_X      ; Paso de parametros del procedimiento
  145.                 push Cnt_Y      ; Cateto que devuelve un valor en AX 
  146.                 call Dar_Cateto
  147.                 mov bx,ax       ; Cambiamos el valor de sitio
  148.                 mov ax,Cnt_Y    ; Calculamos el desplazamiento dentro de la
  149.                 mul Medio_Ancho ; matriz de transformacion
  150.                 add ax,Cnt_X    ; Cnt_Y * Medio_Ancho + Cnt_X
  151.                 mov Desp_Mat,ax         ; el resultado a la pila
  152.                 IF bx GT R_circulo       ; El punto esta fuera del circulo de            
  153.                                         ; corte del plano con la esfera
  154.                         mov bx,Desp_Mat
  155.                         mov MatrizTrans[bx], bx         ; Asignamos el nuevo
  156.                                                         ; valor
  157.                 ELSE                    ; El punto esta en la lupa
  158.                         mov Pto_P.Coor_X, Cnt_X
  159.                         mov Pto_P.Coor_Y, Cnt_Y
  160.                         mov Pto_Q.Coor_X, Cnt_X
  161.                         mov Pto_Q.Coor_Y, Cnt_Y
  162.                         Calc_Dist       ; Calculamos el valor de D
  163.                         Calc_Qz         ; Calculamos Qz = 1 + SQRT(D)
  164.                         Calc_Ix         ; Calculamos Ix = (d * Qx )/(d + Qz)
  165.                         Calc_Iy         ; Calculamos Iy = (d + Qy )/(d + Qz)
  166.                         mov Pto_I.Coor_Z, 0
  167.  
  168.                         mov ax, Medio_Ancho
  169.                         add ax, Pto_I.Coor_Y
  170.                         mul Medio_Ancho
  171.                         push ax
  172.                         mov ax, Medio_Ancho
  173.                         add ax, Pto_I.Coor_X
  174.                         pop bx
  175.                         add ax,bx
  176.                         mov bx, Desp_Mat
  177.                         mov MatrizTrans[bx], ax
  178.                 ENDIF
  179.                 mov cl,Cnt_Y
  180.                 cmp cl,Medio_Ancho
  181.                 jl @Bucle_for2
  182.         mov cl,Cnt_X
  183.         cmp cl, Medio_Ancho
  184.         jl @Bucle_for1
  185.         ret
  186. Crear_Matriz ENDP
  187. ;######################################
  188. Codigo PROC
  189.         mov ax, @DATA
  190.         mov ds, ax
  191.  
  192.         xor ax,ax
  193.         
  194.         mov al, Dist_plano
  195.         push ax
  196.         mov al, R_circulo
  197.         push ax
  198.  
  199.         mov dx,OFFSET MatrizTrans
  200.         mov ah, 09h
  201.         int 21h
  202.  
  203.         call Crear_Matriz
  204.         mov bx,ax
  205.         mov dx,OFFSET MatrizTrans
  206.  
  207.         mov ah, 09h
  208.         int 21h
  209.         mov ax, 4C00h
  210.         int 21h
  211. Codigo ENDP
  212.         END Codigo
  213.      
  214.  
  215.