home *** CD-ROM | disk | FTP | other *** search
- .MODEL SMALL,PASCAL
- .STACK 500h
- .DATA
-
- S_Punto STRUC
- Coor_X DB ?
- Coor_Y DB ?
- Coor_Z DB ?
- S_Punto ENDS
- Cad_Null DB'$'
- Cad_Dist DB 'Esta es la distancia d^2 -Px^2-Py^2+Rc^2 $'
- Cad_Px DB 'Esta es Px ( Cont_X - Med ) $'
- Cad_Py DB 'Esta es Py ( Cont_Y - Med ) $'
- Cad_Qz DB 'Esta es Qz (1 + SQRT(Dist) $'
- Cad_Ix DB 'Esta es Ix (d * Qx)/(d+ Qz) $'
- Cad_Iy DB 'Esta es Iy (d * Qy)/(d+ Qz) $'
- Cad_Desp DB 'Desplazamiento (Px*Ancho + Py) $'
-
-
- R_circulo DB 18
- Dist_plano DB 9
- R_esfera DB ?
-
- Pto_Q S_Punto <0,0,0>
- Pto_P S_Punto <0,0,0>
- Pto_I S_Punto <0,0,0>
-
- Distancia DW ?
- Desplaza_Mat DW 0
- Ventana1 EQU 0A000h
- NombreTGA DB 'LENS.TGA',0
- HandleTGA DW ?
-
- Ancho_Img DW 40
- Ancho_Pant DW 320
- Alto_Pant DB 200
- Area DW 1600
- Buffer_Fuente DB 1600 DUP(?)
- Buffer_Destino DB 1600 DUP(?)
- MatrizTrans DW 1600 DUP(0)
- BufferTGA DB 1024 DUP(?)
- ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
- .CODE
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para desactivar el modo 13h y salir al sistema
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Salir MACRO
- mov ax,4C00h ; Funcion 4Ch: Salir al sistema
- int 21h
- ENDM
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro que devuelve en AX el cuadrado del valor
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Cuadrado MACRO Valor
- xor ax,ax
- mov al,Valor
- imul al
- ENDM
- ;###############################################
- ; Raiz devuelve en AX el valor de la raiz entera
- ;###############################################
- Raiz PROC NEAR USES cx bx , Operando : WORD
- mov bx, Operando
- jns @Continua
- neg bx
- @Continua:
- xor cx,cx
- @bucle:
- inc cl
- Cuadrado cl
- cmp ax,bx
- jle @bucle
- dec cl
- xor ax,ax
- mov al,cl
- ret
- Raiz ENDP
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro que calcula el valor de la variable Distancia
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Calc_Dist PROC
- xor ax,ax
- xor bx,bx
- Cuadrado Dist_plano ; Obtenemos d^2
- push ax
- Cuadrado Pto_P.Coor_X ; Obtenemos Px^2
- push ax
- Cuadrado Pto_P.Coor_Y ; Obtenemos Py^2
- pop bx
- add ax,bx ; Calculamos Px^2 + Py^2
- push ax
- Cuadrado R_circulo ; Obtenemos Rc^2
- pop bx
- sub bx,ax ; Calculamos (Px^2 + Py^2) - Rc^2
- pop ax
- sub ax,bx ; Calculamos d^2 -((Px^2 + Py^2) -Rc^2)
- mov Distancia, ax ; Asignamos el valor a Distancia
- ; push ax
- ; mov bx, OFFSET Cad_Dist
- ; push bx
- ; call Imprime
- ret
- Calc_Dist ENDP
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para calcular Pto_Q.Coor_Z
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Calc_Qz PROC USES ax bx
- xor ax,ax
- push Distancia
- call Raiz ; Calculamos SQRT(D)
- add al,1 ; Calculamos 1+SQRT(D)
- mov Pto_Q.Coor_Z, al ; Asignamos el valor a la variable
- ; cbw
- ; push ax
- ; mov bx, OFFSET Cad_Qz
- ; push bx
- ; call Imprime
- ret
- Calc_Qz ENDP
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para calcular Pto_I.Coor_X
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Calc_Ix PROC USES ax bx
- xor ax,ax
- mov al, Pto_Q.Coor_Z
- add al, Dist_Plano ; Calculamos (Qz + d)
- push ax
- xor ax,ax
- mov al, Dist_Plano
- imul Pto_P.Coor_X ; Calculamos (d * Px)
- pop bx
- idiv bl ; Calculamos (d*Px) / (Qz +d)
- mov Pto_I.Coor_X, al ; Asignamos el valor a la variable
- ; cbw
- ; push ax
- ; mov bx, OFFSET Cad_Ix
- ; push bx
- ; call Imprime
-
- ret
- Calc_Ix ENDP
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para calcular Pto_I.Coor_Y
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Calc_Iy PROC USES ax bx
- xor ax,ax
- mov al, Pto_Q.Coor_Z
- add al, Dist_Plano ; Calculamos (Qz + d)
- push ax
- xor ax,ax
- mov al, Dist_Plano
- imul Pto_P.Coor_Y ; Calculamos (d * Py)
- pop bx
- idiv bl ; Calculamos (d*Py) / (Qz +d)
- mov Pto_I.Coor_Y, al ; Asignamos el valor a la variable
- ; cbw
- ; push ax
- ; mov bx, OFFSET Cad_Iy
- ; push bx
- ; call Imprime
-
- ret
- Calc_Iy ENDP
-
- ;################################################
- ; Dar_Cateto devuelve en AX el valor del cateto
- ; opuesto según el Teorema de Pitagoras
- ;################################################
- Dar_Cateto PROC NEAR USES bx ,Base:BYTE, Cateto: BYTE
- Cuadrado Base
- push ax
- Cuadrado Cateto
- pop bx
- add ax,bx
- push ax
- call Raiz
- ret
- Dar_Cateto ENDP
-
- ;##################################################
- ; Transformacion de un punto ,devuelve en AX
- ;##################################################
- Trans_Pto PROC USES bx cx , Cnt_X :BYTE, Cnt_Y:BYTE, Ancho:BYTE
- LOCAL Medio_Ancho: BYTE
-
- mov al, Ancho
- shr al,1 ; Dividimos por dos el Ancho
- mov Medio_Ancho, al ; Lo almacenamos en Medio_Ancho
- xor ax,ax
- call Calc_Dist ; Calculamos el valor de D
- call Calc_Qz ; Calculamos Qz = 1 + SQRT(D)
- call Calc_Ix ; Calculamos Ix = (d * Qx )/(d + Qz)
- call Calc_Iy ; Calculamos Iy = (d * Qy )/(d + Qz)
- mov Pto_I.Coor_Z, 0
- mov al, Medio_Ancho
- add al, Pto_I.Coor_Y
- imul Ancho
- push ax
- mov al, Medio_Ancho
- add al, Pto_I.Coor_X
- pop bx
- cbw
- add ax,bx
- ; push ax
- ; mov dx, OFFSET Cad_Desp
- ; push dx
- ; call Imprime
- ret
- Trans_Pto ENDP
-
- Calc_Pxy PROC USES bx cx dx, Medio_Ancho:BYTE,Cnt:WORD
- mov ax,Cnt
- mov cl,ah
- sub cl,Medio_Ancho
- xor bx,bx
- mov bl,al
- sub bl,Medio_Ancho
- ; xchg ax,cx
- ; cbw
- ; xchg ax,cx
- ; push cx
- ; mov dx, OFFSET Cad_Py
- ; push dx
- ; call Imprime
- ; xchg ax,bx
- ; cbw
- ; xchg ax,bx
- ;: push bx
- ;: mov dx, OFFSET Cad_Px
- ; push dx
- ; call Imprime
- mov Pto_P.Coor_X, bl
- mov Pto_P.Coor_Y, cl
- mov Pto_Q.Coor_X, bl
- mov Pto_Q.Coor_Y, cl
- ret
- Calc_Pxy ENDP
- ;##################################################
- ; Crear_Matriz modifica la matriz de transformacion
- ;##################################################
- Crear_Matriz PROC USES bx cx dx, Ancho : BYTE
- LOCAL Cnt_X: BYTE,Cnt_Y:BYTE, Desp_Pant :WORD, Desp_Mat :WORD, \
- Medio_Ancho :BYTE
-
- mov al, Ancho
- shr al,1 ; Dividimos por dos el Ancho
- mov Medio_Ancho, al ; Lo almacenamos en Medio_Ancho
- xor cx,cx
- @Bucle_for1: ; Bucle FOR Cnt_X = 0 TO Ancho para
- ; la coordenada X
- mov Cnt_Y,cl
- xor cx,cx
- @Bucle_for2: ; Bucle FOR Cnt_Y = 0 TO Ancho -1 para
- ; la coordenada Y
- mov Cnt_X,cl
- xor ah,ah
- mov al, Medio_Ancho
- push ax
- mov ah,Cnt_Y
- mov al,Cnt_X
- push ax
- call Calc_Pxy
- xor ah,ah
- mov al, Pto_P.Coor_X
- push ax
- mov al, Pto_P.Coor_Y
- push ax
-
- ; Paso de parametros del procedimiento
- ; Cateto que devuelve un valor en AX
- call Dar_Cateto
- xor bx,bx
- mov bx,ax ; Cambiamos el valor de sitio
- mov al,Cnt_Y ; Calculamos el desplazamiento dentro de la
- imul Ancho ; matriz de transformacion
- mov cl,Cnt_X ;\
- xchg ax,cx ; > Para rellenar ch con 0000h
- cbw ;/
- add ax,cx ; Cnt_Y * Medio_Ancho + Cnt_X
- mov Desp_Mat,ax ; almacenamos el resultado
- mov cl, R_circulo ;\
- xchg ax,cx ; > Para rellenar ch con 0000h
- cbw ;/
- cmp ax, bx ; El punto esta fuera del circulo de
- mov ax, Desp_Mat
- jle @Es_Menor ; corte del plano con la esfera
- ;; El punto esta en la lupa
- xor bx,bx
- mov bl,Cnt_X
- push bx
- mov bl,Cnt_Y
- push bx
- mov bl,Ancho
- push bx
- call Trans_Pto
-
- @Es_Menor: ; corte del plano con la esfera
- mov bx,Desp_Mat
- shl bx,1
- mov MatrizTrans[bx], ax ; Asignamos el nuevo
- ; valor
- mov cl,Cnt_X
- inc cl
- cmp cl,Ancho
- jl @Bucle_for2
- mov cl,Cnt_Y
- inc cl
- mov ch,Ancho
- cmp cl, ch
- jl @Bucle_for1
- ret
- Crear_Matriz ENDP
-
- ;###############################
- ;Procedimiento que imprime el valor
- ;###############################
- Imprime PROC USES ax bx cx dx si, Valor:WORD, Cadena:PTR BYTE
-
- mov ah ,09h
- mov dx ,OFFSET Cadena
- int 21h
-
- mov ax,Valor
- cmp ax,0h
- jg @Sigue
- neg ax
- push ax
- mov ah, 0Eh
- mov al,'-'
- int 10h
- pop ax
- @Sigue:
- mov bx,10000
- mov si,0
- @Bucle:
- xor dx,dx
- div bx
- cmp ax,0
- jnz @Imp_Num
- cmp si,0
- jz @Cero
- @Imp_Num:
- mov si,1
- mov cx,'0'
- add ax,cx
- mov ah, 0Eh
- int 10h
- @Cero:
- push dx
- mov ax,bx
- xor dx,dx
- mov cx,10
- div cx
- cmp ax,0
- jz @Fin
- mov bx,ax
- pop ax
- jmp @Bucle
- @Fin:
- pop ax
- mov al, si
- cmp al, 0
- jnz @NoCero
-
- mov ah, 0Eh
- mov al, 0ah
- int 10h
- @Nocero:
- mov ah, 01h
- int 21h
- ret
- Imprime ENDP
-
-
-
- Codigo PROC
- mov ax,@data
- mov ds,ax
-
- mov al, Ancho_img
- push ax
- call Crear_Matriz
- mov cx, Area
- shl cx,1
- xor bx,bx
- @Bucle:
- push cx
- mov ax,MatrizTrans[bx]
- push ax
- mov dx,OFFSET R_Circulo
- push dx
- call imprime
- inc bx
- inc bx
- pop cx
- cmp bx,cx
- jl @Bucle
-
- Salir
- Codigo ENDP
-
- END Codigo
-