Problème dans boucle for(programme de visualisation de fonctions z= f(x,y)

cs_avedis Messages postés 1 Date d'inscription mardi 24 octobre 2006 Statut Membre Dernière intervention 26 octobre 2006 - 26 oct. 2006 à 14:44
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 - 26 oct. 2006 à 15:07
Je suis sur Qbasic( j'ai pas le choix) et j'ai un problème dans une boucle for.
voilà le programme, c'est un programme pour dessiner des fonction de type z = f(x,y) dans l'espace par quadrillage, mais en tenant compte des "lignes cachées".
j'ai un problème dans ma boucle "FOR W=...", il ne l'a reconnait pas.
J'ai mis les passages concernés dans le programme en bleu.

si vous pouvez m'aider je vous en serais reconnaissant.
merci

' SUPERFICIES Z=F(X,Y)

'

SCREEN 11

PRINT "(ESCRIBA LA FUNCION z=f(x,y) EN LA RUTINA 'ECUACION')"
PRINT<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

INPUT "INTERVALO (X1,X2)"; X1, X2

INPUT "INTERVALO (Y1,Y2)"; Y1, Y2

INPUT "NO. DE LINEAS "; L0

INPUT "NO. DE PUNTOS/LINEA"; P0

CLS

MENU:

PRINT "DESEA UNA PROYECCION:": PRINT

PRINT " 1. PERSPECTIVA REAL"

PRINT " 2. PARALELA CUALQUIERA"

PRINT " 3. PARALELA DIMETRICA"

PRINT " 4. PARALELA ISOMETRICA"

INPUT "ELIJA NO. "; N

CLS

IF N = 1 THEN GOTO PERSPE

IF N = 2 THEN GOTO PARACU

IF N = 3 THEN GOTO DIMETR

IF N = 4 THEN GOTO ISOMET

PRINT CHR$(7): GOTO MENU

'

PERSPE:
INPUT "DISTANCIA OBSERVADOR RHO"; RH: D 1

PARACU:

INPUT "ANGULO THETA (grados)= "; TH

INPUT "ANGULO PHI (grados)= "; PH

GOTO CALC

'

DIMETR:
TH 22.20765: PH 20.704811#

GOTO CALC

'

ISOMET:
TH 45: PH 35.26439

'

CALC:

CLS

INPUT "VISTA <R>EAL O ESCALA NIFORME (R,U) "; V$

CLS : GOSUB INI
V1 5: V2 635: V3 = 5: V4 = 475: GV = 1E+20

LIM = 640: DIM MIN(LIM), MAX(LIM)
FOR I 1 TO LIM: MIN(I) GV: MAX(I) = -GV: NEXT I
X3 (X2 - X1) / P0: Y3 (Y2 - Y1) / L0

IF TH <= 0 OR TH >= 180 THEN AUX = X1: X1 = X2: X2 = AUX: AUX = Y1: Y1 = Y2: Y2 = AUX: X3 = -X3: Y3 = -Y3
W1 GV: W2 -GV: W3 = GV: W4 = -GV
FOR U 0 TO L0: Y Y2 - U * Y3
FOR V 0 TO P0: X X1 + V * X3

GOSUB ECUACION

IF XE < W1 THEN W1 = XE

IF XE > W2 THEN W2 = XE

IF YE < W3 THEN W3 = YE

IF YE > W4 THEN W4 = YE

NEXT V

NEXT U
U1 (V2 - V1) / (W2 - W1): U2 (V4 - V3) / (W4 - W3)

'

IF V$ <> "U" THEN
   IF U2 < U1 THEN U1 U2 ELSE U2 U1

END IF

'

' *** BUCLE U
FOR U 0 TO L0: Y Y2 - U * Y3: X = X1: GOSUB ECUACION
A1 (XE - W1) * U1 + V1: B1 CY - (YE - W3) * U2 - V3

P = 2

IF MAX(A1) <> -GV THEN
   P 0: IF MAX(A1) < B1 THEN P 2

   IF MIN(A1) > B1 THEN P = 1

END IF

'

' *** BUCLE W
FOR W 1 TO L0 + 1: Y Y2 - W * Y3: X = X1: GOSUB ECUACION
A2 (XE - W1) * U1 + V1: B2 CY - (YE - W3) * U2 - V3

GOSUB TRAZA: GOTO OTROV

'

' *** BUCLE V
FOR V 0 TO P0: X X1 + V * X3: GOSUB ECUACION
A2 (XE - W1) * U1 + V1: B2 CY - (YE - W3) * U2 - V3
Q P: IF MAX(A2) -GV THEN GOSUB TRAZA: GOTO OTROV
AIG 0: Q 0: IF MAX(A2) < B2 THEN Q = 2

IF MIN(A2) > B2 THEN Q = 1
IF P 0 AND Q 0 THEN GOTO OTROV
IF P 0 OR Q 0 THEN TB = P + Q: GOTO ONTB

IF P = Q THEN GOSUB TRAZA: GOTO OTROV
AIG 1: TB 1: IF P <> 1 THEN TB = 2

'

ONTB:

IF TB = 1 THEN

 DEN = MIN(A2) - MIN(A1) - B2 + B1

 IF DEN = 0 THEN GOSUB TRAZA: GOTO OTROV

 A3 = (B1 * A2 - B2 * A1 - MIN(A1) * A2 + MIN(A2) * A1) / DEN

 B3 = (B1 * MIN(A2) - B2 * MIN(A1)) / DEN

ELSE

 DEN = MAX(A2) - MAX(A1) - B2 + B1

 IF DEN = 0 THEN GOSUB TRAZA: GOTO OTROV

 A3 = (B1 * A2 - B2 * A1 - MAX(A1) * A2 + MAX(A2) * A1) / DEN

 B3 = (B1 * MAX(A2) - B2 * MAX(A1)) / DEN

END IF
IF P 0 THEN A1 A3: B1 = B3: GOSUB TRAZA: GOTO OTROV
A4 A2: B4 B2: A2 = A3: B2 = B3: GOSUB TRAZA: A2 = A4: B2 = B4

IF AIG = 0 THEN GOTO OTROV
AIG 0: P 0
IF TB 1 THEN TB 2 ELSE TB = 1

GOTO ONTB

'

OTROV:
P Q: A1 A2: B1 = B2

NEXT W

NEXT V

NEXT U

END

'

' >>> Inicializacion:

INI:
CX 639: CY 479

K0 = 3.14159265# / 180
TH TH * K0: PH PH * K0
S1 SIN(TH): S2 SIN(PH): C1 = COS(TH): C2 = COS(PH)
S3 C1 * S2: S4 S1 * S2: S5 = C1 * C2: S6 = S1 * C2

RETURN

'

' >>> Transformaciones:

ECUACION:

'*************************************

' Probar: X=[-3,3], Y=[-3,3], L0=23, P0=31

'Z = -8 * EXP(-X * X - Y * Y) * (X + Y)

' Probar: X=[-2,2], Y=[-2,2], L0=27, P0=27

'Z=80*(EXP(-X*X-Y*Y)*SIN(X)*SIN(Y))^2

' Probar: X=[-3,3], Y=[-3,3], L0=23, P0=31

'Z=3*SIN(X)^2*SIN(Y)

' Probar: X=[-3,3], Y=[-3,3], L0=31, P0=43

'Z=0.2*SIN(X)*COS(Y)-3/EXP(X*X+Y*Y)*COS(1.75*(X*X+Y*Y))

' Probar: X=[-13,13], Y=[-13,13], L0=31, P0=43

Z = 10 * SIN(SQR(X * X + Y * Y)) / SQR(X * X + Y * Y)

'*************************************

X0 = -X * S1 + Y * C1

Y0 = -X * S3 - Y * S4 + Z * C2
IF N <> 1 THEN XE X0: YE Y0: RETURN

Z0 = -X * S5 - Y * S6 - Z * S2 + RH

' Proyeccion y trazado
XE D * X0 / Z0: YE D * Y0 / Z0: RETURN

RETURN

'

' >>> Trazado de las lineas

TRAZA:

LINE (A1, B1)-(A2, B2)
I1 INT(A1 + .5): I2 INT(A2 + .5): IF I1 <> I2 THEN GOTO BUCLEK

IF B2 < MIN(I2) THEN MIN(I2) = B2

IF B2 > MAX(I2) THEN MAX(I2) = B2

RETURN

'

BUCLEK:

FOR K = I2 + 1 TO I1

  R = (K * (B2 - B1) + A2 * B1 - A1 * B2) / (A2 - A1)

  IF R < MIN(K) THEN MIN(K) = R

  IF R > MAX(K) THEN MAX(K) = R

NEXT K

RETURN
A voir également:

2 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
26 oct. 2006 à 14:58
Après un regard très rapide je dirait qu'il est possible que le problème se situe ici :
NEXT W

NEXT V

NEXT U

ça devrait pas etre plutot

NEXT V
NEXT W
NEXT U

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
26 oct. 2006 à 15:07
Et si tu fais la modif précédente, tu auras en plus un problème avec les GOTO OTROV.

L'étiquette va se retrouver à l'intérieur de la boucle V, donc le GOTO OTROV de la boucle W sera incorrecte. Si tu place l'étiquette à l'extérieur de la boucle V, c'est ceux de la boucle V qui seront incorrect

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
Rejoignez-nous