PROGRAM DOMAINE; {$I TYPEDEF.SYS} {$I GRAPHIX.HGC} {$I KERNEL.SYS} {$I WINDOWS.SYS} {$I AXIS.HGH} {$I POLYGON.HGH} (*****************************************************************************) (* *) (* Ce programme permet de tracer le domaine de vol d'un avion ;c.a.d. ses *) (* domaines de manoeuvre et de rafales … partir de donn‚es d'entr‚e telles *) (* que : les masses maxi et mini ,la surface de r‚f‚rence , le coefficient *) (* de p‚n‚tration dans l'air , le coefficient de train‚e , etc ... *) (* *) (*****************************************************************************) CONST LEGEND: ARRAY[2..4] OF STRING[50]=('DOMAINE DE MANOEUVRES','DOMAINE DE RAFALES','DOMAINES DE RAFALES ET DE MANOEUVRES'); LETTRE: ARRAY[1..12] OF STRING[1]=('A','B','C','D','I','J','K','L','M','N','O','P'); LETTRE2:ARRAY[1..4] OF STRING[1]=('E','F','R','S'); CHOIX: ARRAY[1..2] OF STRING[20]=('les valeurs','la courbe'); TYPE LETCOEF= ARRAY[1..12] OF REAL; VAR ETITRE:WRKSTRING; DAT:ARRAY [10..21] OF REAL; NR: ARRAY [1..6] OF REAL; NF: ARRAY [1..4] OF REAL; NL,VL,VK,VARI,VARN:LETCOEF; TOUCHE,R,CARA:CHAR; M,MMAX,MMIN,SREF,N,RHO,G,CZMAX,CZMIN,CXMAX,CXMIN,CZMAXDOS,CZMINDOS:REAL; N1,NA1,NA2,VA,VAM,VAD,VD,VB,VS,VS1,VS2,VSD,VS1D,VS2D,VSM,VG,VF,VD1,VDK1:REAL; TUP,TDO,LM,CZA,MU,K,COEF,V2,V2D,COEF2,RAP2,RAC:REAL; VSK,VS1K,VS2K,VSDK,VS1DK,VS2DK,VAK,VADK,VDK:REAL; VMAX,VMAX1,VDMAX,VDMAX1,VGMAX,VGMAX1,VFMAX,VFMAX1,VAMAX,VBMAX,VD1MAX,VD1MAX1,VS2I,VS2I1,VS2I2:INTEGER; AA,II,I,J,Z,V,REP1,CODE,NN,PMAX,MEM1,MEM2,TEST1,TEST2,ET,ERREUR,X,Y:INTEGER; TITRE: STRING[99]; REP,CAT,LET:STRING[1]; ECRI,CHAIN,MOT,CONS:STRING[50]; A,B,A1,B1,A2,B2,C,D,E,F,H:PLOTARRAY; {************** SOUS PROGRAMME DE PROTECTION DES REPONSES OUI-NON ***********} PROCEDURE OUINON; BEGIN REPEAT READ(KBD,R); UNTIL ORD(R) IN [78,79]; WRITE(R) END; {*************************** FIN DE OUI-NON ********************************} {***************** SOUS PROGRAMME D'ENVOI SUR IMPRIMANTE ********************} PROCEDURE IMPCOURB; LABEL RETOUR; BEGIN RETOUR: GOTOXY(25,24); IF (REP1=1) OR (REP1=5) OR (REP1=6) THEN ECRI:=CHOIX[1] ELSE ECRI:=CHOIX[2]; WRITE('Voulez vous imprimer '+ECRI+' (O/N) :'); OUINON; CASE ORD(R) OF 79: BEGIN GOTOXY(25,24); WRITE('L imprimante est-elle prˆte (O/N) : '); OUINON; CASE ORD(R) OF 79: BEGIN GOTOXY(25,24); WRITE(' '); HARDCOPY(FALSE,1) END; 78: GOTO RETOUR END END; 78: CLEARSCREEN END END; {******************** FIN D'ENVOI SUR IMPRIMANTE ***************************} {******************** AFFICHAGE DU MENU A L'ECRAN ***************************} PROCEDURE MENU; BEGIN INITGRAPHIC; CLEARSCREEN; LOADWINDOW(1,-1,-1,'MENU3.FEN') END; {*********************** FIN D'AFFICHAGE MENU ******************************} {******************* SOUS PROGRAMME DE SITUATION DU CURSEUR ****************} PROCEDURE CURSEUR; BEGIN GOTOXY(I,J); WRITE(' '); GOTOXY(I,J); WRITE('?'); GOTOXY(I,J) END; {*************************** FIN DE CURSEUR ********************************} {********************* SOUS PROGRAMME DE DEPLACEMENT CURSEUR ***************} PROCEDURE DEPCURS; BEGIN STR(DAT[J],CONS); IF J=6 THEN Z:=1 ELSE Z:=LENGTH(CONS)-10; X:=TRUNC(I*9/8)-1; Y:=J*14; GOTOXY(I,J); DEFINEWINDOW(2,X,Y-15,X+Z,Y); SELECTWINDOW(2); INVERTWINDOW END; {****************************** FIN DE DEPCURS *****************************} {****************** SOUS PROGRAMME DE PROTECTION DES ENTREES ***************} PROCEDURE PROTECT; VAR OK:BOOLEAN; BEGIN REPEAT CURSEUR; {$I-} READ(DAT[J]) {$I+}; OK:= (IORESULT=0); UNTIL OK END; {**************************** FIN DE PROTECT *******************************} {**************************** SOUS PROGRAMME VIS ***************************} PROCEDURE VIS; LABEL STOP; VAR REEL:REAL; OK: BOOLEAN; II,IMAX:INTEGER; CHIF: ARRAY[1..8] OF CHAR; BEGIN GOTOXY(5,1); WRITE('AprŠs chaque valeur saisie tapez sur la touche : RETURN'); GOTOXY(5,25); WRITE('Quand vous aurez termin‚ les modifications tapez sur la touche : F'); DEPCURS; REPEAT READ(KBD,TOUCHE); CASE ORD(TOUCHE) OF 80: BEGIN J:=J+1; IF J=7 THEN J:=10; IF J=15 THEN J:=18; IF J=22 THEN J:=6; INVERTWINDOW; DEPCURS END; 72: BEGIN J:=J-1; IF J=5 THEN J:=21; IF J=9 THEN J:=6; IF J=17 THEN J:=14; INVERTWINDOW; DEPCURS END; 13: BEGIN J:=J+1; IF J=7 THEN J:=10; IF J=15 THEN J:=18; IF J=22 THEN J:=6; INVERTWINDOW; DEPCURS END; 65,85:BEGIN TEST1:=0; TEST2:=0; IF J=6 THEN BEGIN SETBACKGROUND(0); CAT:=TOUCHE; WRITE(CAT); J:=10; DEPCURS END END; 48..57:BEGIN TEST1:=0; TEST2:=0; IF J<>6 THEN BEGIN SETBACKGROUND(0); WRITE(TOUCHE); CHAIN:=''; CHAIN:=TOUCHE+CHAIN; II:=0; REPEAT II:=II+1; READ(KBD,CHIF[II]); CASE ORD(CHIF[II]) OF 46,48..57 : BEGIN GOTOXY(58+II,J); WRITE(CHIF[II]); END; 8 : BEGIN IF II<=1 THEN BEGIN II:=II-1; GOTO STOP; END; IF II>1 THEN BEGIN GOTOXY(58+II-1,J); WRITE(' '); II:=II-2; END; STOP: END END; UNTIL ORD(CHIF[II])=13; IMAX:=II; FOR II:=1 TO IMAX DO CHAIN:=CHAIN+CHIF[II]; VAL(CHAIN,DAT[J],ERREUR); J:=J+1; IF J=15 THEN J:=18; IF J=22 THEN J:=6; DEPCURS END END END; UNTIL ORD(TOUCHE)=70; INVERTWINDOW; GOTOXY(5,1); WRITE(' '); GOTOXY(5,25); WRITE(' ') END; {**************************** FIN DE VIS ***********************************} {******************** SOUS PROGRAMME DE SAISIE DES DONNEES *****************} PROCEDURE SAISIE; VAR OK:BOOLEAN; BEGIN CLEARSCREEN; LOADWINDOW(1,-1,-1,'SAISIE.FEN'); WRITE(' Entrez le nom du Planeur :'); READ(ETITRE); GOTOXY(5,1); WRITE('AprŠs chaque valeur saisie tapez sur la touche : RETURN'); DEFINEHEADER(1,'CARACTERISTIQUES DU PLANEUR : '+ETITRE); SETHEADERON; SELECTWINDOW(1); DRAWBORDER; I:=58; J:=6; REPEAT REPEAT CURSEUR; {$I-} READ(CAT) {$I+}; OK:= (IORESULT =0); UNTIL OK; GOTOXY(I,J); UNTIL UPCASE(CAT) IN ['A','U']; FOR J:=10 TO 14 DO PROTECT; FOR J:=18 TO 21 DO PROTECT; GOTOXY(5,1); WRITE(' '); GOTOXY(15,25); WRITE(' Voulez vous modifier des valeurs ? (O/N) :'); OUINON; GOTOXY(15,25); WRITE(' '); IF ORD(R)=79 THEN BEGIN I:=58; J:=6; VIS END; SAVEWINDOW(1,'VALEURS.FEN'); REP1:=1; IMPCOURB END; {****************************** FIN DE SAISIE *******************************} {******************** SOUS PROGRAMME DE TRANSFERT DES DONNEES **************} { } { Les variables saisies sont nomm‚es DAT[J] ; ce sous programme } { renomme les DAT[J] en : } { M : Masse de l'essai (Kg) } { MMAX : Masse maxi du planeur (Kg) } { MMIN : Masse mini du planeur (Kg) } { SREF : Surface de r‚f‚rence (surface de la voilure prolong‚e dans le fuselage en mý)} { LM : Longueur moyenne de la corde (m) } { CXMIN : Coefficient de train‚e mini } { CZMAX : Coefficient de portance maxi } { CZMAXDOS: Coefficient de portance en vol dos } { CZA : Gradient de portance (rad-1) } { } {*****************************************************************************} PROCEDURE DATA; BEGIN IF CAT='A' THEN BEGIN NF[1]:=7; NF[2]:=7; NF[3]:=-5; NF[4]:=-5 END ELSE BEGIN NF[1]:=5.3; NF[2]:=4; NF[3]:=-1.5; NF[4]:=-2.65 END; M:=DAT[10]; MMAX:=DAT[11]; MMIN:=DAT[12]; SREF:=DAT[13]; LM:=DAT[14]; CXMIN:=DAT[18]; CZMAX:=DAT[19]; CZMAXDOS:=DAT[20]; CZA:=DAT[21]; RHO:=1.225; G:=9.81; MU:=(2*M)/(SREF*RHO*LM*CZA); K:=(0.88*MU)/(5.3+MU); COEF:=(K*RHO*CZA*SREF)/(2*M*G) END; {***************************** FIN DE DATA *********************************} {********************* SOUS PROGRAMME DE CALCUL DES VITESSES ***************} PROCEDURE CALVIT; BEGIN VS:=SQRT((2*M*G)/(RHO*SREF*CZMAX)); VS1:=SQRT((2*MMAX*G)/(RHO*SREF*CZMAX)); VS2:=SQRT((2*MMIN*G)/(RHO*SREF*CZMAX)); VSD:=SQRT((2*M*G)/(RHO*SREF*CZMAXDOS)); VS1D:=SQRT((2*MMAX*G)/(RHO*SREF*CZMAXDOS)); VS2D:=SQRT((2*MMIN*G)/(RHO*SREF*CZMAXDOS)); VAM:=VS*SQRT(NF[1]); VA:=VS1*SQRT(NF[1]); VAD:=VSD*SQRT(-NF[4]); VD:=(180/36)*EXP((1/3)*LN(M*G*0.1/(SREF*CXMIN))); VB:=VA; {********************** VITESSES EXPRIMEES EN Km/h *************************} VSK:=VS*3.6; VS1K:=VS1*3.6; VS2K:=VS2*3.6; VSDK:=VSD*3.6; VS1DK:=VS1D*3.6; VS2DK:=VS2D*3.6; VAK:=VA*3.6; VADK:=VAD*3.6; VDK:=VD*3.6 END; {*********************** FIN DE CALCUL DES VITESSES ************************} {***************** SOUS PROGRAMME DE TRACE CADRE TITRE AXES ****************} (* *) (* Le domaine de vol est d‚fini de fa‡on … avoir sur l'axe des abscisses *) (* les vitesses de vol allant de 0 … 100 m/s et en ordonn‚es les facteurs *) (* de charge allant de -8 … 10 . *) (* *) {*****************************************************************************} PROCEDURE TRACATITAXES; BEGIN INITGRAPHIC; SETCOLORWHITE; SETBACKGROUND(0); DEFINEHEADER(1,TITRE); SETHEADERON; DEFINEWORLD(1,0,10,100,-8); SELECTWORLD(1); SELECTWINDOW(1); DRAWBORDER; DRAWAXIS(7,7,5,20,5,25,0,0,TRUE) END; {********************** FIN TRACE CADRE TITRE AXES *************************} {*************** SOUS PROGRAMME DE POSITIONNEMENT DES POINTS ***************} (* *) (* Ce sous programme permet de tracer le domaine de manoeuvres *) (* *) (*****************************************************************************) PROCEDURE DOMAIN; BEGIN V2:=VS*VS; VMAX:=TRUNC(VAM); VMAX1:=VMAX+1; FOR V:=0 TO VMAX DO BEGIN A[V,1]:=V; A[V,2]:=(V/VS)*(V/VS); END; A[VMAX1,1]:=VAM; A[VMAX1,2]:=NF[1]; VL[1]:=VAM; VK[1]:=VAM*3.6; NL[1]:=A[VMAX1,2]; VDMAX:=TRUNC(VD); VDMAX1:=VDMAX+1; FOR V:=VMAX1 TO VDMAX DO BEGIN A[V,1]:=V; A[V,2]:=((NL[1]-NF[2])/(VAM-VD))*V+NL[1]-((NL[1]-NF[2])/(VAM-VD))*VAM; END; A[VDMAX1,1]:=VD; A[VDMAX1,2]:=NF[2]; VL[2]:=VD; VK[2]:=VD*3.6; NL[2]:=A[VDMAX1,2]; A[VDMAX1+1,1]:=VD; A[VDMAX1+1,2]:=0; VG:=VSD*SQRT(-NF[4]); VGMAX:=TRUNC(VG); VGMAX1:=VGMAX+1; FOR V:=0 TO VGMAX DO BEGIN B[V,1]:=V; B[V,2]:=-(V/VSD)*(V/VSD); END; B[VGMAX1,1]:=VG; B[VGMAX1,2]:=NF[4]; VL[4]:=VG; VK[4]:=VG*3.6; NL[4]:=B[VGMAX1,2]; FOR V:=VGMAX1 TO VDMAX DO BEGIN B[V,1]:=V; B[V,2]:=((NF[4]-NF[3])/(VG-VD))*V+NF[4]-((NF[4]-NF[3])/(VG-VD))*VG; END; B[VDMAX1,1]:=VD; B[VDMAX1,2]:=NF[3]; VL[3]:=VD; VK[3]:=VD*3.6; NL[3]:=B[VDMAX1,2]; B[VDMAX1+1,1]:=VD; B[VDMAX1+1,2]:=0; PMAX:=4; DRAWPOLYGON(A,1,VDMAX1+1,2,0,0); AXISGLB:=TRUE; DRAWPOLYGON(B,1,VDMAX1+1,2,0,0); IF VAM<55 THEN VSM:=(1+(55-VAM)*0.004)*VAM ELSE VSM:=(1-(VAM-55)*0.003)*VAM; DRAWTEXTW(VSM,3.3-NL[1],2,'A'); IF VD<55 THEN VSM:=(1+(55-VG)*0.003)*VD ELSE VSM:=(1-(VD-40)*0.0025)*VD; DRAWTEXTW(VSM,2.7-NF[2],2,'B'); DRAWTEXTW(VSM,0.8-NF[3],2,'C'); IF VG<55 THEN VSM:=(1+(55-VG)*0.004)*VG ELSE VSM:=(1-(VG-55)*0.003)*VG; DRAWTEXTW(VSM,0.2-NF[4],2,'D'); GOTOXY(65,22); WRITE('Masse =',M:5:1,' Kg'); END; {**************** FIN DU TRACE DU DOMAINE DE MANOEUVRE *********************} {******** SOUS PROGRAMME DE POSITIONNEMENT DES POINTS SUPLEMENTAIRES *******} { } { Ce sous programme permet de tracer les points supl‚mentaires } { du domaine de vol introduits par la nouvelle valeur de la } { vitesse de d‚crochage . } { } {*****************************************************************************} PROCEDURE DOMAIN2; BEGIN VD1MAX:=TRUNC(VD1); VD1MAX1:=VD1MAX+1; FOR V:=VMAX1 TO VD1MAX DO BEGIN A2[V,1]:=V; A2[V,2]:=((NL[1]-NF[2])/(VAM-VD1))*V+NL[1]-((NL[1]-NF[2])/(VAM-VD1))*VAM; END; A2[VD1MAX1,1]:=VD1; A2[VD1MAX1,2]:=NF[2]; ET:=TRUNC(10*NF[2]); FOR I:=1 TO ET DO BEGIN A2[VD1MAX1+I,1]:=VD1; A2[VD1MAX1+I,2]:=NF[2]-0.1*I; END; A2[VD1MAX1+ET+1,1]:=VD1; A2[VD1MAX1+ET+1,2]:=0; FOR V:=VGMAX1 TO VD1MAX DO BEGIN B2[V,1]:=V; B2[V,2]:=((NF[4]-NF[3])/(VG-VD1))*V+NF[4]-((NF[4]-NF[3])/(VG-VD1))*VG; END; B2[VD1MAX1,1]:=VD1; B2[VD1MAX1,2]:=NF[3]; ET:=TRUNC(-10*NF[3]); FOR I:=1 TO ET DO BEGIN B2[VD1MAX1+I,1]:=VD1; B2[VD1MAX1+I,2]:=NF[3]+0.1*I; END; B2[VD1MAX1+ET+1,1]:=VD1; B2[VD1MAX1+ET+1,2]:=0; AXISGLB:=TRUE; DRAWPOLYGON(A2,VMAX1,VD1MAX1+ET+1,9,0,0); AXISGLB:=TRUE; DRAWPOLYGON(B2,VGMAX1,VD1MAX1+ET+1,9,0,0); IF VD1<50 THEN VSM:=(1+(VD1-50)*0.002)*VD1 ELSE VSM:=(1-(VD1-50)*0.002)*VD1; DRAWTEXTW(VSM,1.7-NF[2],2,'E'); DRAWTEXTW(VSM,1.8-NF[3],2,'F'); END; {****************************** FIN DE DOMAIN2 *****************************} {**************** SOUS PROGRAMME DE POSITIONNEMENT DES POINTS **************} (* *) (* Ce sous programme permet de tracer le domaine de rafales *) (* *) (*****************************************************************************) PROCEDURE DOMRAF; LABEL INTER; BEGIN MEM1:=0; MEM2:=0; V2:=VS*VS; V2D:=VSD*VSD; COEF2:=COEF*COEF; NR[1]:=1+COEF*15*VA; NR[2]:=1+COEF*7.5*VD; NR[3]:=1-COEF*7.5*VD; NR[4]:=1-COEF*15*VA; NA1:=1.25*(VA/VS)*(VA/VS); NA2:=-1.25*(VA/VSD)*(VA/VSD); VMAX:=TRUNC(VA); VMAX1:=VMAX+1; A1[1,1]:=VS; A1[1,2]:=0; FOR NN:=2 TO 10 DO BEGIN A1[NN,1]:=VS; A1[NN,2]:=1.25*(VS/VS)*(VS/VS)*(0.1*NN); END; VL[5]:=VS; VK[5]:=VS*3.6; NL[5]:=A1[10,2]; IF VS>25 THEN DRAWTEXTW(VS,1.6-NL[5],2,'I') ELSE DRAWTEXTW(1.2*VS,1.6-NL[5],2,'I'); IF NA1<=NR[1] THEN BEGIN FOR V:=1 TO VMAX DO BEGIN A[V,1]:=V; A[V,2]:=1.25*(V/VS)*(V/VS); END; A[VMAX1,1]:=VA; A[VMAX1,2]:=1.25*(VA/VS)*(VA/VS); VL[6]:=VA; VK[6]:=VA*3.6; NL[6]:=A[VMAX1,2]; DRAWTEXTW(VA,2-NL[6],2,'J'); END ELSE BEGIN VF:=(6*V2*COEF)+(2*VS/SQRT(5))*SQRT(45*V2*COEF2+1); VFMAX:=TRUNC(VF); VFMAX1:=VFMAX+1; FOR V:=1 TO VFMAX DO BEGIN A[V,1]:=V; A[V,2]:=1.25*(V/VS)*(V/VS); END; A[VFMAX1,1]:=VF; A[VFMAX1,2]:=1.25*(VF/VS)*(VF/VS); VL[6]:=VF; VK[6]:=VF*3.6; NL[6]:=A[VFMAX1,2]; DRAWTEXTW(VF,2-NL[6],2,'J'); FOR V:=VFMAX1 TO VMAX DO BEGIN A[V,1]:=V; A[V,2]:=1+15*COEF*V; END; A[VMAX1,1]:=VA; A[VMAX1,2]:=1+15*COEF*VA; VL[7]:=VA; VK[7]:=VA*3.6; NL[7]:=A[VMAX1,2]; DRAWTEXTW(VA,2-NL[7],2,'K'); MEM1:=1; END; VDMAX:=TRUNC(VD); VDMAX1:=VDMAX+1; IF MEM1=0 THEN N1:=NL[6] ELSE N1:=NL[7]; FOR V:=VMAX1 TO VDMAX DO BEGIN A[V,1]:=V; A[V,2]:=((N1-NR[2])/(VA-VD))*V+N1-((N1-NR[2])/(VA-VD))*VA; END; A[VDMAX1,1]:=VD; A[VDMAX1,2]:=NR[2]; IF MEM1=0 THEN I:=7 ELSE I:=8; VL[I]:=VD; VK[I]:=VD*3.6; NL[I]:=A[VDMAX1,2]; IF MEM1=0 THEN DRAWTEXTW(VD,2-NR[2],2,'K') ELSE DRAWTEXTW(VD,2-NR[2],2,'L'); A[VDMAX1+1,1]:=VD; A[VDMAX1+1,2]:=0; IF NA2>=NR[4] THEN BEGIN B1[1,1]:=VSD; B1[1,2]:=0; FOR NN:=2 TO 10 DO BEGIN B1[NN,1]:=VSD; B1[NN,2]:=-1.25*(VSD/VSD)*(VSD/VSD)*(0.1*NN); END; VL[I+1]:=VSD; VK[I+1]:=VSD*3.6; NL[I+1]:=B1[10,2]; IF VSD>25 THEN VSM:=VSD ELSE VSM:=1.2*VSD; IF MEM1=0 THEN DRAWTEXTW(VSM,1.6-NL[I+1],2,'L') ELSE DRAWTEXTW(VSM,1.6-NL[I+1],2,'M'); FOR V:=1 TO VMAX DO BEGIN B[V,1]:=V; B[V,2]:=-1.25*(V/VSD)*(V/VSD); END; B[VMAX1,1]:=VA; B[VMAX1,2]:=-1.25*(VA/VSD)*(VA/VSD); VL[I+2]:=VA; VK[I+2]:=VA*3.6; NL[I+2]:=B[VMAX1,2]; IF MEM1=0 THEN DRAWTEXTW(VA,1.6-NL[I+2],2,'M') ELSE DRAWTEXTW(VA,1.6-NL[I+2],2,'N'); END ELSE BEGIN RAC:=45*V2D*COEF2-1; VS2I:=TRUNC(VSD); VS2I1:=VS2I+1; VS2I2:=VS2I1+1; IF RAC<0 THEN BEGIN FOR V:=1 TO VS2I DO BEGIN B[V,1]:=V; B[V,2]:=0; END; B[VS2I1,1]:=VSD; B[VS2I1,2]:=0; B[VS2I2,1]:=VSD; B[VS2I2,2]:=1-15*COEF*VSD; VL[I+1]:=VSD; VK[I+1]:=VSD*3.6; NL[I+1]:=B[VS2I2,2]; IF VS2D>25 THEN VSM:=VSD ELSE VSM:=1.2*VSD; IF MEM1=0 THEN DRAWTEXTW(VSM,1.6-NL[I+1],2,'L') ELSE DRAWTEXTW(VSM,1.6-NL[I+1],2,'M'); FOR V:=VS2I2+1 TO VMAX DO BEGIN B[V,1]:=V; B[V,2]:=1-15*COEF*V; END; GOTO INTER; END; VG:=(6*V2D*COEF)+(2*VSD/SQRT(5))*SQRT(RAC); VGMAX:=TRUNC(VG); VGMAX1:=VGMAX+1; B1[1,1]:=VSD; B1[1,2]:=0; FOR NN:=2 TO 10 DO BEGIN B1[NN,1]:=VSD; B1[NN,2]:=-1.25*(VSD/VSD)*(VSD/VSD)*(0.1*NN); END; VL[I+1]:=VSD; VK[I+1]:=VSD*3.6; NL[I+1]:=B1[10,2]; IF VSD>25 THEN VSM:=VSD ELSE VSM:=1.2*VSD; IF MEM1=0 THEN DRAWTEXTW(VSM,1.6-NL[I+1],2,'L') ELSE DRAWTEXTW(VSM,1.6-NL[I+1],2,'M'); FOR V:=1 TO VGMAX DO BEGIN B[V,1]:=V; B[V,2]:=-1.25*(V/VSD)*(V/VSD); END; B[VGMAX1,1]:=VG; B[VGMAX1,2]:=-1.25*(VG/VSD)*(VG/VSD); VL[I+2]:=VG; VK[I+2]:=VG*3.6; NL[I+2]:=B[VGMAX1,2]; IF MEM1=0 THEN DRAWTEXTW(VG,1.6-NL[I+2],2,'M') ELSE DRAWTEXTW(VG,1.6-NL[I+2],2,'N'); MEM2:=1; FOR V:=VGMAX1 TO VMAX DO BEGIN B[V,1]:=V; B[V,2]:=1-15*COEF*V; END; INTER: B[VMAX1,1]:=VA; B[VMAX1,2]:=1-15*COEF*VA; IF MEM2=0 THEN BEGIN VL[I+2]:=VA; VK[I+2]:=VA*3.6; NL[I+2]:=B[VMAX1,2]; IF MEM1=0 THEN DRAWTEXTW(VA,1.6-NL[I+2],2,'M') ELSE DRAWTEXTW(VA,1.6-NL[I+2],2,'N'); END ELSE BEGIN VL[I+3]:=VA; VK[I+3]:=VA*3.6; NL[I+3]:=B[VMAX1,2]; IF MEM1=0 THEN DRAWTEXTW(VA,1.6-NL[I+3],2,'N') ELSE DRAWTEXTW(VA,1.6-NL[I+3],2,'O'); END; END; VDMAX:=TRUNC(VD); VDMAX1:=VDMAX+1; N1:=B[VMAX1,2]; FOR V:=VMAX1 TO VDMAX DO BEGIN B[V,1]:=V; B[V,2]:=((N1-NR[3])/(VA-VD))*V+N1-((N1-NR[3])/(VA-VD))*VA; END; B[VDMAX1,1]:=VD; B[VDMAX1,2]:=NR[3]; B[VDMAX1+1,1]:=VD; B[VDMAX1+1,2]:=0; IF VD<75 THEN VSM:=VD ELSE VSM:=0.8*VD; IF MEM2=0 THEN BEGIN VL[I+3]:=VD; VK[I+3]:=VD*3.6; NL[I+3]:=B[VDMAX1,2]; PMAX:=I+3; IF MEM1=0 THEN DRAWTEXTW(VSM,1.6-NL[I+3],2,'N') ELSE DRAWTEXTW(VSM,1.6-NL[I+3],2,'O'); END ELSE BEGIN VL[I+4]:=VD; VK[I+4]:=VD*3.6; NL[I+4]:=B[VDMAX1,2]; PMAX:=I+4; IF MEM1=0 THEN DRAWTEXTW(VSM,1.6-NL[I+4],2,'O') ELSE DRAWTEXTW(VSM,1.6-NL[I+4],2,'P'); END; SETLINESTYLE(0); AXISGLB:=TRUE; DRAWPOLYGON(A1,1,NN,0,0,0); AXISGLB:=TRUE; DRAWPOLYGON(A,1,VDMAX1+1,0,0,0); AXISGLB:=TRUE; DRAWPOLYGON(B1,1,NN,0,0,0); AXISGLB:=TRUE; DRAWPOLYGON(B,1,VDMAX1+1,0,0,0); FOR V:=0 TO VDMAX+5 DO BEGIN C[V,1]:=V; C[V,2]:=1+15*COEF*V; END; FOR V:=0 TO VDMAX+5 DO BEGIN D[V,1]:=V; D[V,2]:=1+7.5*COEF*V; END; FOR V:=0 TO VDMAX+5 DO BEGIN E[V,1]:=V; E[V,2]:=1-7.5*COEF*V; END; FOR V:=0 TO VDMAX+5 DO BEGIN F[V,1]:=V; F[V,2]:=1-15*COEF*V; END; SETLINESTYLE(1); AXISGLB:=TRUE; DRAWPOLYGON(C,1,VDMAX1+3,0,0,0); AXISGLB:=TRUE; DRAWPOLYGON(D,1,VDMAX1+3,0,0,0); AXISGLB:=TRUE; DRAWPOLYGON(E,1,VDMAX1+3,0,0,0); AXISGLB:=TRUE; DRAWPOLYGON(F,1,VDMAX1+3,0,0,0); SETLINESTYLE(0); GOTOXY(65,22); WRITE('Masse =',M:5:1,' Kg'); END; {****************** FIN DU TRACE DU DOMAINE DE RAFALES *********************} {******** SOUS PROGRAMME DE POSITIONNEMENT DES POINTS SUPLEMENTAIRES *******} { } { Ce sous programme permet de tracer les points supl‚mentaires } { du domaine de vol en rafale introduits par la nouvelle valeur } { de la vitesse de d‚crochage . } { } {*****************************************************************************} PROCEDURE DOMRAF2; BEGIN NR[5]:=1+COEF*7.5*VD1; NR[6]:=1-COEF*7.5*VD1; IF MEM1=0 THEN N1:=NL[6] ELSE N1:=NL[7]; VD1MAX:=TRUNC(VD1); VD1MAX1:=VD1MAX+1; FOR V:=VMAX1 TO VD1MAX DO BEGIN A2[V,1]:=V; A2[V,2]:=((N1-NR[5])/(VA-VD1))*V+N1-((N1-NR[5])/(VA-VD1))*VA; END; A2[VD1MAX1,1]:=VD1; A2[VD1MAX1,2]:=NR[5]; ET:=TRUNC(10*NR[5]); FOR I:=1 TO ET DO BEGIN A2[VD1MAX1+I,1]:=VD1; A2[VD1MAX1+I,2]:=NR[5]-0.1*I; END; A2[VD1MAX1+ET+1,1]:=VD1; A2[VD1MAX1+ET+1,2]:=0; IF MEM2=0 THEN BEGIN IF MEM1=0 THEN N1:=NL[9] ELSE N1:=NL[10]; END ELSE BEGIN IF MEM1=0 THEN N1:=NL[10] ELSE N1:=NL[11]; END; FOR V:=VMAX1 TO VD1MAX DO BEGIN B2[V,1]:=V; B2[V,2]:=((N1-NR[6])/(VA-VD1))*V+N1-((N1-NR[6])/(VA-VD1))*VA; END; B2[VD1MAX1,1]:=VD1; B2[VD1MAX1,2]:=NR[6]; ET:=TRUNC(-10*NR[6]); FOR I:=1 TO ET DO BEGIN B2[VD1MAX1+I,1]:=VD1; B2[VD1MAX1+I,2]:=NR[6]+0.1*I; END; B2[VD1MAX1+ET+1,1]:=VD1; B2[VD1MAX1+ET+1,2]:=0; AXISGLB:=TRUE; DRAWPOLYGON(A2,VMAX1,VD1MAX1+ET+1,9,0,0); AXISGLB:=TRUE; DRAWPOLYGON(B2,VGMAX1,VD1MAX1+ET+1,9,0,0); IF VD1<50 THEN VSM:=(1+(VD1-50)*0.002)*VD1 ELSE VSM:=(1-(VD1-50)*0.002)*VD1; DRAWTEXTW(VSM,1.7-NR[5],2,'R'); DRAWTEXTW(VSM,1.8-NR[6],2,'S'); END; {*************************** FIN DE DOMRAF2 ********************************} {************** SOUS PROGRAMME DE FENETRE AFFICHANT LES DONNEES ************} PROCEDURE FENETRE; BEGIN LOADWINDOW(2,-1,-1,'TITRE.FEN'); IF PMAX=4 THEN J:=1 ELSE J:=5; IF TEST1=1 THEN AA:=3 ELSE AA:=1; DEFINEWINDOW(3,68,26,89,(15*(PMAX+AA-J))+24); DEFINEWORLD(3,0,1000,1000,0); SELECTWORLD(3); SELECTWINDOW(3); SETBACKGROUND(0); DRAWBORDER; Z:=0; FOR I:=J TO PMAX DO BEGIN LET:=LETTRE[I]; Z:=Z+1; GOTOXY(62,2+Z); WRITE(' ',LET,' ³ ',VL[I]:5:2,' ³ ',NL[I]:4:2); END; IF TEST1=1 THEN BEGIN IF TEST2=2 THEN BEGIN FOR I:=1 TO 2 DO BEGIN LET:=LETTRE2[I]; Z:=Z+1; GOTOXY(62,2+Z); WRITE(' ',LET,' ³ ',VD1:5:2,' ³ ',NL[I+1]:4:2); END; END ELSE BEGIN FOR I:=1 TO 2 DO BEGIN LET:=LETTRE2[I+2]; Z:=Z+1; GOTOXY(62,2+Z); WRITE(' ',LET,' ³ ',VD1:5:2,' ³ ',NR[I+4]:4:2); END; END; END; SAVEWINDOW(3,'COORDON.FEN'); END; {**************** FIN DE CREATION DE LA FENETRE DES DONNEES ****************} {********** SOUS PROGRAMME DE CREATION D UNE FENETRE DES VITESSES **********} PROCEDURE IMPVIT; CONST PI=3.1415927; TYPE LIGNE=STRING[80]; VAR TITRE:WRKSTRING; FENETRE:TEXT; L:LIGNE; BEGIN FOR I:=1 TO 4 DO BEGIN VARI[I]:=0; VARN[I]:=0; END; FOR I:=5 TO PMAX DO BEGIN VARI[I]:=0; VARN[I]:=0; IF VL[I]=VD THEN BEGIN VARI[I]:=K*7.5*180/(PI*VL[I]); VARN[I]:=COEF*7.5*VL[I]; END; IF VL[I]=VA THEN BEGIN VARI[I]:=K*15*180/(PI*VL[I]); VARN[I]:=COEF*15*VL[I]; END; END; IF TEST1=1 THEN DEFINEWINDOW(1,7,10,83,15*(PMAX+4)+60) ELSE DEFINEWINDOW(1,7,10,83,15*(PMAX)+60); DEFINEHEADER(1,'TABLEAU DES VITESSES DU '+ETITRE); SETHEADERON; SETBACKGROUND(0); DEFINEWORLD(1,0,1000,1000,0); SELECTWINDOW(1); SELECTWORLD(1); DRAWBORDER; GOTOXY(8,3); WRITE(' Point ³ Vit.(m/s) ³ Vit.(Km/h) ³ Fact.Charge ³ Var.à ³ Var.Char '); GOTOXY(8,4); WRITE('ÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄ'); FOR I:=1 TO 4 DO BEGIN LET:=LETTRE[I]; GOTOXY(8,4+I); IF NL[I]>0 THEN WRITE(' ',LET,' ³ ',VL[I]:5:2,' ³ ',VK[I]:5:1,' ³ ',NL[I]:4:2,' ³ ',VARI[I]:4:1,' ³ ',VARN[I] :3:1,' ') ELSE WRITE(' ',LET,' ³ ',VL[I]:5:2,' ³ ',VK[I]:5:1,' ³ ',NL[I]:4:2,' ³ ',VARI[I]:4:1,' ³ ',VARN[I]: 3:1,' '); END; IF TEST1=1 THEN FOR I:=1 TO 2 DO BEGIN LET:=LETTRE2[I]; GOTOXY(8,8+I); IF NL[2*I]>0 THEN WRITE(' ',LET,' ³ ',VD1:5:2,' ³ ',VDK1:5:1,' ³ ',NL[2*I]:4:2,' ³ ',VARI[I]:4:1,' ³ ',VARN[I]: 3:1,' ') ELSE WRITE(' ',LET,' ³ ',VD1:5:2,' ³ ',VDK1:5:1,' ³ ',NL[2*I]:4:2,' ³ ',VARI[I]:4:1,' ³ ',VARN[I]:3 :1,' '); END; IF PMAX>4 THEN BEGIN IF TEST1=1 THEN GOTOXY(8,11) ELSE GOTOXY(8,9); WRITE('ÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄ'); Z:=0; FOR I:=5 TO PMAX DO BEGIN LET:=LETTRE[I]; Z:=Z+1; IF TEST1=1 THEN GOTOXY(8,11+Z) ELSE GOTOXY(8,9+Z); IF NL[I]>0 THEN WRITE(' ',LET,' ³ ',VL[I]:5:2,' ³ ',VK[I]:5:1,' ³ ',NL[I]:4:2,' ³ ',VARI[I]:4:1,' ³ ',VARN[I] :3:1,' ') ELSE WRITE(' ',LET,' ³ ',VL[I]:5:2,' ³ ',VK[I]:5:1,' ³ ',NL[I]:4:2,' ³ ',VARI[I]:4:1,' ³ ',VARN[I]: 3:1,' '); END; IF TEST2=3 THEN FOR I:=1 TO 2 DO BEGIN LET:=LETTRE2[I+2]; GOTOXY(8,7+PMAX+I); IF NR[I+4]>0 THEN WRITE(' ',LET,' ³ ',VD1:5:2,' ³ ',VDK1:5:1,' ³ ',NR[I+4]:4:2,' ³ ',VARI[I]:4:1,' ³ ',VARN[I]: 3:1,' ') ELSE WRITE(' ',LET,' ³ ',VD1:5:2,' ³ ',VDK1:5:1,' ³ ',NR[I+4]:4:2,' ³ ',VARI[I]:4:1,' ³ ',VARN[I]:3 :1,' '); END; END; END; {************************** FIN DE IMPVIT **********************************} {*********************** SOUS PROGRAMME DE PARAMETRES **********************} PROCEDURE PARAM; BEGIN GOTOXY(11,2); WRITE('Facteur d att‚nuation de rafale : k = ',K:5:3); GOTOXY(11,3); WRITE('Parametre de masse : æ = ',MU:5:3); GOTOXY(11,21); WRITE('Droite de rafale … 7.5 m/s : n = 1+',(COEF*7.5):8:6,'*V'); GOTOXY(11,22); WRITE('Droite de rafale … 15 m/s : n = 1+',(COEF*15):8:6,'*V'); END; {***************************** FIN DE PARAM ********************************} {*********************** SOUS PROGRAMME VSF ********************************} PROCEDURE VSF; BEGIN SAISIE; DATA; CALVIT; MENU; REPEAT GOTOXY(67,22); REPEAT READ(KBD,R); UNTIL ORD(R) IN [49..55]; WRITE(R); REP:=R; VAL(REP,REP1,CODE); TITRE:=LEGEND[REP1]+' DU '+ETITRE; CASE REP OF '1':BEGIN CLEARSCREEN; LOADWINDOW(1,-1,-1,'VALEURS.FEN'); IMPCOURB; MENU; END; '2':BEGIN TRACATITAXES; IF TEST1=1 THEN BEGIN DOMAIN; DOMAIN2; TEST1:=1; TEST2:=2; END ELSE DOMAIN; FENETRE; IMPCOURB; LEAVEGRAPHIC; MENU; END; '3':BEGIN TRACATITAXES; IF TEST1=1 THEN BEGIN DOMRAF; DOMRAF2; TEST1:=1; TEST2:=3; END ELSE DOMRAF; FENETRE; IMPCOURB; LEAVEGRAPHIC; MENU; END; '4':BEGIN TRACATITAXES; DOMAIN; DOMRAF; PARAM; IMPCOURB; LEAVEGRAPHIC; MENU; END; '5':BEGIN CLEARSCREEN; IMPVIT; GOTOXY(12,23); WRITE('La vitesse VD minimale est de ',VD:5:2,' m/s ou de ',VDK:6:2,' km/h'); GOTOXY(25,24); WRITE(' Voulez vous la modifier ? (O/N)'); OUINON; IF ORD(R)=79 THEN BEGIN TEST1:=1; REPEAT GOTOXY(15,24); WRITE(' Quelle valeur de VD en km/h choisissez vous ? '); READ(VDK1); UNTIL (VDK1>VD) AND (VDK1<360); VD1:=VDK1*10/36; END; FOR II:=22 TO 24 DO BEGIN GOTOXY(10,II); WRITE(' '); END; IMPCOURB; MENU; END; '6':BEGIN CLEARSCREEN; LOADWINDOW(1,-1,-1,'VALEURS.FEN'); I:=58; J:=6; GOTOXY(5,1); WRITE('Nouveau Planeur ? (O/N) '); OUINON; IF ORD(R)=79 THEN BEGIN GOTOXY(1,1); WRITE('Entrez le nom du nouveau Planeur : '); READ(ETITRE); GOTOXY(1,1); WRITE(' '); DEFINEHEADER(1,'CARACTERISTIQUES DU PLANEUR : '+ETITRE); SETHEADERON; SELECTWINDOW(1); DRAWBORDER; END; VIS; SAVEWINDOW(1,'VALEURS.FEN'); IMPCOURB; DATA; CALVIT; MENU; END; END; UNTIL REP = '7'; END; (******************** FIN DE VSF **********************) (******************** PROGRAMME PRINCIPAL *************) BEGIN INITGRAPHIC; VSF; LEAVEGRAPHIC END. (****************** FIN PROGRAMME PRINCIPAL ***********)