home *** CD-ROM | disk | FTP | other *** search
- .MODEL SMALL,PASCAL
- .STACK 100h
- .DATA
-
- S_Punto STRUC
- Coor_X DB ?
- Coor_Y DB ?
- Coor_Z DB ?
- S_Punto ENDS
-
- R_circulo DB 50
- Dist_plano DB 10
- R_esfera DB ?
-
- Ancho_Img DB 120
- MatrizTrans DB 3600 DUP (0)
- Caracter DB '$'
- Pto_Q S_Punto <0,0,0>
- Pto_P S_Punto <0,0,0>
- Pto_I S_Punto <0,0,0>
-
- Distancia DB ?
-
- .CODE
-
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro que devuelve en AX el cuadrado del valor
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Cuadrado MACRO Valor
- mov al,Valor
- mul al
- ENDM
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro que calcula el valor de la variable Distancia
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Calc_Dist MACRO
- 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, bx ; Asignamos el valor a Distancia
- ENDM
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para calcular Pto_Q.Coor_Z
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Calc_Qz MACRO
- xor ax,ax
- Raiz Distancia ; Calculamos SQRT(D)
- add ax,1 ; Calculamos 1+SQRT(D)
- mov Pto_Q.Coor_Z, ax ; Asignamos el valor a la variable
- ENDM
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para calcular Pto_I.Coor_X
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Calc_Ix MACRO
- xor ax,ax
- mov ax, Dist_Plano
- mul Pto_P.Coor_X ; Calculamos (d * Px)
- push ax
- mov ax, Pto_Q.Coor_Z
- add ax, Dist_Plano ; Calculamos (Qz + d)
- push ax
- pop bx
- pop ax
- div bx ; Calculamos (d*Px) / (Qz +d)
- mov Pto_I.Coor_X, al ; Asignamos el valor a la variable
- ENDM
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para calcular Pto_I.Coor_Y
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Calc_Iy MACRO
- xor ax,ax
- mov ax, Dist_Plano
- mul Pto_P.Coor_Y ; Calculamos (d * Py)
- push ax
- mov ax, Pto_Q.Coor_Z
- add ax, Dist_Plano ; Calculamos (Qz + d)
- push ax
- pop bx
- pop ax
- div bx ; Calculamos (d*Py) / (Qz +d)
- mov Pto_I.Coor_Y, al ; Asignamos el valor a la variable
- ENDM
- ;###############################################
- ; Raiz devuelve en AX el valor de la raiz entera
- ;###############################################
- Raiz PROC NEAR USES cx bx , Operando : WORD
- ;pop bx
- mov bx, Operando
- xor cx,cx
- @bucle:
- inc cl
- Cuadrado cl
- cmp ax,bx
- jle @bucle
- dec cl
- xor ax,ax
- mov al,cl
- ret
- Raiz 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
- ;##################################################
- ; Crear_Matriz modifica la matriz de transformacion
- ;##################################################
- Crear_Matriz PROC USES bx cx dx
- LOCAL Cnt_X: BYTE,Cnt_Y:BYTE, Desp_Pant :WORD, Desp_Mat :WORD, \
- Medio_Ancho :BYTE
-
- mov al, Ancho_Img
- 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 Medio_Ancho para
- inc cl ; la coordenada X
- mov Cnt_X,cl
- xor cx,cx
- @Bucle_for2: ; Bucle FOR Cnt_Y = 0 TO Medio_Ancho para
- inc cl ; la coordenada Y
- mov Cnt_Y,cl
- push Cnt_X ; Paso de parametros del procedimiento
- push Cnt_Y ; Cateto que devuelve un valor en AX
- call Dar_Cateto
- mov bx,ax ; Cambiamos el valor de sitio
- mov ax,Cnt_Y ; Calculamos el desplazamiento dentro de la
- mul Medio_Ancho ; matriz de transformacion
- add ax,Cnt_X ; Cnt_Y * Medio_Ancho + Cnt_X
- mov Desp_Mat,ax ; el resultado a la pila
- IF bx GT R_circulo ; El punto esta fuera del circulo de
- ; corte del plano con la esfera
- mov bx,Desp_Mat
- mov MatrizTrans[bx], bx ; Asignamos el nuevo
- ; valor
- ELSE ; El punto esta en la lupa
- mov Pto_P.Coor_X, Cnt_X
- mov Pto_P.Coor_Y, Cnt_Y
- mov Pto_Q.Coor_X, Cnt_X
- mov Pto_Q.Coor_Y, Cnt_Y
- Calc_Dist ; Calculamos el valor de D
- Calc_Qz ; Calculamos Qz = 1 + SQRT(D)
- Calc_Ix ; Calculamos Ix = (d * Qx )/(d + Qz)
- Calc_Iy ; Calculamos Iy = (d + Qy )/(d + Qz)
- mov Pto_I.Coor_Z, 0
-
- mov ax, Medio_Ancho
- add ax, Pto_I.Coor_Y
- mul Medio_Ancho
- push ax
- mov ax, Medio_Ancho
- add ax, Pto_I.Coor_X
- pop bx
- add ax,bx
- mov bx, Desp_Mat
- mov MatrizTrans[bx], ax
- ENDIF
- mov cl,Cnt_Y
- cmp cl,Medio_Ancho
- jl @Bucle_for2
- mov cl,Cnt_X
- cmp cl, Medio_Ancho
- jl @Bucle_for1
- ret
- Crear_Matriz ENDP
- ;######################################
- Codigo PROC
- mov ax, @DATA
- mov ds, ax
-
- xor ax,ax
-
- mov al, Dist_plano
- push ax
- mov al, R_circulo
- push ax
-
- mov dx,OFFSET MatrizTrans
- mov ah, 09h
- int 21h
-
- call Crear_Matriz
- mov bx,ax
- mov dx,OFFSET MatrizTrans
-
- mov ah, 09h
- int 21h
- mov ax, 4C00h
- int 21h
- Codigo ENDP
- END Codigo
-
-
-