trace.mod 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. MODULE trace;
  2. IMPORT IO,Graph,Lib,MATHLIB;
  3. TYPE t_fenetre = RECORD (* 1,2 = X; 3,4 = Y *)
  4. W1,W2,W3,W4 : REAL; (* monde r‚el *)
  5. V1,V2,V3,V4 : CARDINAL; (* monde graphique *)
  6. temp1,temp2,
  7. temp3,temp4 : REAL;
  8. END;
  9. PROCEDURE window ( VAR a : t_fenetre;
  10. i,j,k,l : REAL);
  11. BEGIN
  12. WITH a DO
  13. W1 := i;
  14. W2 := j;
  15. W3 := k;
  16. W4 := l;
  17. END;
  18. END window;
  19. PROCEDURE viewport ( VAR a : t_fenetre;
  20. x1,x2,y1,y2: CARDINAL);
  21. (* d‚pend de la r‚solution de l'‚cran *)
  22. BEGIN
  23. WITH a DO
  24. IF x1 < 0 THEN V1 := 0 ELSE V1 := x1 END;
  25. IF y1 < 0 THEN V3 := 0 ELSE V3 := y1 END;
  26. IF x2 > 640 THEN V2 := 640 ELSE V2 := x2 END;
  27. IF y2 > 480 THEN V4 := 480 ELSE V4 := y2 END;
  28. temp1 := (VAL(REAL,V2)-VAL(REAL,V1))/(W2-W1);
  29. temp2 := ((VAL(REAL,V1)*W2)-(VAL(REAL,V2)*W1))/(W2-W1);
  30. temp3 := (VAL(REAL,V4)-VAL(REAL,V3))/(W4-W3);
  31. temp4 := ((VAL(REAL,V3)*W4)-(VAL(REAL,V4)*W3))/(W4-W3);
  32. Graph.SetClipRgn(V1,V3,V2,V4);
  33. END;
  34. END viewport;
  35. PROCEDURE ROUND( x : REAL): CARDINAL;
  36. BEGIN
  37. RETURN(ABS(TRUNC(x+0.5)))
  38. END ROUND;
  39. PROCEDURE fx( VAR a : t_fenetre;
  40. b : REAL ):CARDINAL;
  41. BEGIN
  42. WITH a DO
  43. RETURN ROUND(temp1 * b + temp2);
  44. END;
  45. END fx;
  46. PROCEDURE fy( VAR a : t_fenetre;
  47. b : REAL ): CARDINAL;
  48. BEGIN
  49. WITH a DO
  50. RETURN ROUND(temp3 * b + temp4)
  51. END;
  52. END fy;
  53. PROCEDURE cadrage ( VAR a : t_fenetre);
  54. BEGIN
  55. WITH a DO
  56. (* Graph.Rectangle(V1,V3,V2,V4,5,TRUE );*)
  57. END;
  58. END cadrage;
  59. PROCEDURE axis ( VAR a : t_fenetre);
  60. VAR p,q : REAL;
  61. BEGIN
  62. WITH a DO
  63. p := W1;
  64. q := W3;
  65. IF (W1 < 0.0) AND (W2 > 0.0) THEN p := 0.0 END;
  66. IF (W3 < 0.0) AND (W4 > 0.0) THEN q := 0.0 END;
  67. Graph.HLine(fx(a,W1),fy(a,q),fx(a,W2),15);
  68. Graph.Line( fx(a,p), fy(a,W3),fx(a,p),fy(a,W4),15);
  69. END;
  70. END axis;
  71. VAR t : t_fenetre;
  72. i : BOOLEAN;
  73. video : Graph.VideoConfig;
  74. PROCEDURE fonction (x : REAL) : REAL;
  75. BEGIN
  76. RETURN VAL(REAL,MATHLIB.Sin(2.0*VAL(LONGREAL,x)) * MATHLIB.Exp(-0.1*VAL(LONGREAL,x)))
  77. END fonction;
  78. VAR f : INTEGER;
  79. g : REAL;
  80. BEGIN
  81. Graph.GetVideoConfig(video);
  82. (* i := Graph.SetVideoMode(video.mode);*)
  83. Graph.InitVGA;
  84. Graph.GraphMode;
  85. window(t,-10.0,+20.0,-1.6,+1.7);
  86. cadrage(t);
  87. viewport(t,100,400,100,400);
  88. axis(t);
  89. FOR f := -200 TO 900-1 DO
  90. g := VAL(REAL,f)/10.0;
  91. Graph.Line(fx(t,g),fy(t,fonction(g)),fx(t,g+0.1),fy(t,fonction(g+0.1)),15);
  92. END;
  93. REPEAT UNTIL IO.KeyPressed();
  94. i := Graph.SetVideoMode(Graph._TEXTC80);
  95. END trace.
  96.