DECLARE FUNCTION MIN! (A!, B!)
DECLARE FUNCTION MAX! (A!, B!)
DECLARE SUB TRAS (XC!, YC!, ZC!)
DECLARE SUB DIRP (XP!, YP!, ZP!)
DECLARE SUB MMAT (A!(), B!())
DECLARE SUB PROYECTA (P!(), Q!())
DECLARE SUB ROTA (EJE$, A!)
DIM SHARED MATP!(4, 4): DIM SHARED MATR!(4, 4): DIM SHARED MATT!(4, 4)
DIM P1!(4), P2!(4), Q1!(4), Q2!(4)
MATP(1, 1) = 1: MATP(1, 2) = 0: MATP(1, 3) = 0: MATP(1, 4) = 0
MATP(2, 1) = 0: MATP(2, 2) = 1: MATP(2, 3) = 0: MATP(2, 4) = 0
MATP(3, 1) = 0: MATP(3, 2) = 0: MATP(3, 3) = 1: MATP(3, 4) = 0
MATP(4, 1) = 0: MATP(4, 2) = 0: MATP(4, 3) = 0: MATP(4, 4) = 1
CLS: FILES "*.geo": PRINT
INPUT "FICHERO: "; FICH$: OPEN FICH$ FOR INPUT AS #1
INPUT #1, NP, NE, DUMMY: DIM XMAT!(NP), YMAT!(NP), ZMAT!(NP)
XMIN = 999999!: YMIN = 999999!: ZMIN = 999999!
XMAX = -XMIN: YMAX = -YMIN: ZMAX = -ZMIN
FOR I = 1 TO NP
INPUT #1, XMAT!(I), YMAT!(I), ZMAT!(I)
XMIN = MIN(XMIN, XMAT(I))
YMIN = MIN(YMIN, YMAT(I))
ZMIN = MIN(ZMIN, ZMAT(I))
XMAX = MAX(XMAX, XMAT(I))
YMAX = MAX(YMAX, YMAT(I))
ZMAX = MAX(ZMAX, ZMAT(I))
NEXT I
ROTA "Z", 30: MMAT MATR(), MATP()
ROTA "X", 30: MMAT MATR(), MATP()
DIRP 0, 0, 1: MMAT MATT(), MATP()
P1(1) = XMIN: P1(2) = YMIN: P1(3) = ZMAX: P1(4) = 1
PROYECTA P1(), Q1()
P2(1) = XMAX: P2(2) = YMAX: P2(3) = ZMIN: P2(4) = 1
PROYECTA P2(), Q2()
SCREEN 12: BORDER = 2
XS = ABS(Q2(1) - Q1(1)): YS = ABS(Q2(2) - Q1(2))
XC = .5 * (Q1(1) + Q2(1)): YC = .5 * (Q1(2) + Q2(2))
IF (XS / 4 > YS / 3) THEN
SXMIN = Q1(1): SXMAX = Q2(1)
SYMIN = YC - .5 * XS * 3 / 4
SYMAX = YC + .5 * XS * 3 / 4
ELSE
SXMIN = XC - .5 * YS * 4 / 3
SXMAX = XC + .5 * YS * 4 / 3
SYMIN = Q1(2): SYMAX = Q2(2)
END IF
WINDOW (BORDER * SXMIN, BORDER * SYMAX)-(BORDER * SXMAX, BORDER * SYMIN)
FOR I = 1 TO NE
INPUT #1, NV, NI: NF = NI
FOR K = 2 TO NV
INPUT #1, NJ
P1(1) = XMAT(NI): P1(2) = YMAT(NI): P1(3) = ZMAT(NI): P1(4) = 1
P2(1) = XMAT(NJ): P2(2) = YMAT(NJ): P2(3) = ZMAT(NJ): P2(4) = 1
PROYECTA P1(), Q1(): PROYECTA P2(), Q2()
LINE (Q1(1) + XC, Q1(2) + YC)-(Q2(1) + XC, Q2(2) + YC)
NI = NJ
NEXT K
P1(1) = XMAT(NI): P1(2) = YMAT(NI): P1(3) = ZMAT(NI): P1(4) = 1
P2(1) = XMAT(NF): P2(2) = YMAT(NF): P2(3) = ZMAT(NF): P2(4) = 1
PROYECTA P1(), Q1(): PROYECTA P2(), Q2()
LINE (Q1(1) + XC, Q1(2) + YC)-(Q2(1) + XC, Q2(2) + YC)
NEXT I
SLEEP: CLOSE
SUB DIRP (XP!, YP!, ZP!)
MATT(1, 1) = 1: MATT(1, 2) = 0: MATT(1, 3) = 0: MATT(1, 4) = 0
MATT(2, 1) = 0: MATT(2, 2) = 1: MATT(2, 3) = 0: MATT(2, 4) = 0
MATT(3, 1) = -XP / ZP: MATT(3, 2) = -YP / ZP: MATT(3, 3) = 0: MATT(3, 4) = 0
MATT(4, 1) = 0: MATT(4, 2) = 0: MATT(4, 3) = 0: MATT(4, 4) = 1
END SUB
FUNCTION MAX (A, B)
IF (A > B) THEN
MAX = A
ELSE
MAX = B
END IF
END FUNCTION
FUNCTION MIN (A, B)
IF (A < B) THEN
MIN = A
ELSE
MIN = B
END IF
END FUNCTION
SUB MMAT (A(), B())
DIM C!(4, 4)
FOR I = 1 TO 4
FOR J = 1 TO 4
C(I, J) = 0
FOR K = 1 TO 4
C(I, J) = C(I, J) + A(I, K) * B(K, J)
NEXT K
NEXT J
NEXT I
FOR I = 1 TO 4
FOR J = 1 TO 4
B(I, J) = C(I, J)
NEXT J
NEXT I
END SUB
SUB PROYECTA (P(), Q())
FOR I = 1 TO 4
Q(I) = 0
FOR J = 1 TO 4
Q(I) = Q(I) + P(J) * MATP(I, J)
NEXT J
NEXT I
Q(1) = Q(1) / Q(4): Q(2) = Q(2) / Q(4): Q(3) = Q(3) / Q(4)
END SUB
SUB ROTA (EJE$, A!)
CONST PI = 3.141592654#
ANG = A * PI / 180!
IF (EJE$ = "X") THEN
MATR(1, 1) = 1: MATR(1, 2) = 0: MATR(1, 3) = 0: MATR(1, 4) = 0
MATR(2, 1) = 0: MATR(2, 2) = COS(ANG): MATR(2, 3) = SIN(ANG): MATR(2, 4) = 0
MATR(3, 1) = 0: MATR(3, 2) = -SIN(ANG): MATR(3, 3)= COS(ANG): MATR(3, 4) = 0
MATR(4, 1) = 0: MATR(4, 2) = 0: MATR(4, 3) = 0: MATR(4, 4) = 1
END IF
IF (EJE$ = "Y") THEN
MATR(1, 1)= COS(ANG): MATR(1, 2) = 0: MATR(1, 3) = -SIN(ANG): MATR(1, 4) = 0
MATR(2, 1) = 0: MATR(2, 2) = 1: MATR(2, 3) = 0: MATR(2, 4) = 0
MATR(3, 1) = SIN(ANG): MATR(3, 2) = 0: MATR(3, 3) = COS(ANG): MATR(3, 4) = 0
MATR(4, 1) = 0: MATR(4, 2) = 0: MATR(4, 3) = 0: MATR(4, 4) = 1
END IF
IF (EJE$ = "Z") THEN
MATR(1, 1) = COS(ANG): MATR(1, 2) = SIN(ANG): MATR(1, 3) = 0: MATR(1, 4) = 0
MATR(2, 1)= -SIN(ANG): MATR(2, 2) = COS(ANG): MATR(2, 3) = 0: MATR(2, 4) = 0
MATR(3, 1) = 0: MATR(3, 2) = 0: MATR(3, 3) = 1: MATR(3, 4) = 0
MATR(4, 1) = 0: MATR(4, 2) = 0: MATR(4, 3) = 0: MATR(4, 4) = 1
END IF
END SUB
Índice
© 1996-99, euitmt WWW team
Última modificación: 9 de Julio de 1999 - 13:38:22