浏览代码

capture datapoints with NaN that disturb system stability.
problem may need to be handled in WMGraphics.Mod, however

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7213 8c9fc860-2736-0410-a75d-ab315db34111

eth.hunzikerp 8 年之前
父节点
当前提交
382ba84f2d
共有 1 个文件被更改,包括 33 次插入26 次删除
  1. 33 26
      source/WMSimpleGraphs.Mod

+ 33 - 26
source/WMSimpleGraphs.Mod

@@ -9,6 +9,7 @@ IMPORT Strings, WMGraphics, WMRectangles, Modules, Reals, WM:=WMWindowManager, M
 
 CONST Colors=[WMGraphics.Red,WMGraphics.Blue,WMGraphics.Green,WMGraphics.Yellow, WMGraphics.Magenta, WMGraphics.Cyan, WMGraphics.Gray];
 		MinSize=30;
+		MaxSize=2048;
 	
 TYPE 
 	Regressor=PROCEDURE{DELEGATE}(CONST data: ARRAY [*,*] OF LONGREAL; VAR slope,intercept: LONGREAL);
@@ -28,7 +29,7 @@ TYPE
 			SELF.data:=data;
 			max:=MAX(data);
 			width:=LEN(data,0); height:=ENTIER(max)+1;
-			IF (width<MinSize) THEN w0:=10*width ELSE w0:=width END;
+			IF (width<MinSize) THEN w0:=10*width ELSE w0:=MIN(width,MaxSize) END;
 			IF height<MinSize THEN h0:=10*height ELSE h0:=height END;
 			Init(w0,h0,FALSE);
 			WM.GetDefaultManager().Add(PosX, PosY, SELF, {WM.FlagFrame,WM.FlagClose});
@@ -70,8 +71,8 @@ TYPE
 			max:=MAX(ABS(min), ABS(max));
 			min:=MIN(0, min); 
 			IF max=0 THEN max:=1 END;
-			width:=MAX(1,LEN(data,0)); 
-			height:=MAX(1,LEN(data,1));
+			width:=MIN(MaxSize, MAX(1,LEN(data,0))); 
+			height:=MIN(MaxSize, MAX(1,LEN(data,1)));
 			Init(width, height, TRUE);
 			offset:=0; gain:=255/max;
 			IF( width<10) OR (height<10) THEN 
@@ -130,8 +131,8 @@ TYPE
 			width:=LEN(data,0); height:=ENTIER(max-min)+1;
 			IF Reals.IsNaNL(width) THEN width:=100 END;
 			IF Reals.IsNaNL(height) THEN height:=100 END;
-			IF (width<MinSize) THEN w0:=10*width ELSE w0:=width END;
-			IF height<MinSize THEN h0:=10*height ELSE h0:=height END;
+			IF (width<MinSize) THEN w0:=10*width ELSE w0:=MIN(MaxSize, width) END;
+			IF height<MinSize THEN h0:=10*height ELSE h0:=MIN(MaxSize, height) END;
 			Init(w0,h0,FALSE);
 			WM.GetDefaultManager().Add(PosX, PosY, SELF, {WM.FlagFrame,WM.FlagClose});
 			NewWindowPos(GetWidth());
@@ -155,11 +156,13 @@ TYPE
 			mn:=-border+ENTIER(0.5+min*h / height);
 			mx:=ENTIER(0.5+max*h / height);
 			FOR i:=0 TO LEN(data,0)-2 DO
-				x0:=border+i*w DIV width;
-				y0:=h+mn-ENTIER(0.5+data[i]*h / height);
-				x1:=border+(i+1)*w DIV width;
-				y1:=h+mn-ENTIER(0.5+data[i+1]*h / height); 
-				canvas.Line(x0,y0,x1,y1, WMGraphics.Black, WMGraphics.ModeCopy);
+				IF ~Reals.IsNaNL(data[i]) &~Reals.IsNaNL(data[i+1]) THEN
+					x0:=border+i*w DIV width;
+					y0:=h+mn-ENTIER(0.5+data[i]*h / height);
+					x1:=border+(i+1)*w DIV width;
+					y1:=h+mn-ENTIER(0.5+data[i+1]*h / height); 
+					canvas.Line(x0,y0,x1,y1, WMGraphics.Black, WMGraphics.ModeCopy);
+				END;
 			END;
 			IF mn#0 THEN canvas.Line(0, h+mn, w, h+mn, WMGraphics.Black, WMGraphics.ModeCopy);	END;
 			INC(timestamp);
@@ -178,11 +181,11 @@ Graphs* = OBJECT (Window);
 			SELF.data:=data;
 			max:=MAX(1, MAX(data));
 			min:=MIN(0, MIN(data)); 
-			width:=LEN(data,1); height:=ENTIER(max-min)+1;
+			width:=MAX(2,LEN(data,1)); height:=MAX(2, ENTIER(max-min)+1);
 			IF Reals.IsNaNL(width) THEN width:=100 END;
 			IF Reals.IsNaNL(height) THEN height:=100 END;
-			IF width<MinSize THEN w0:=10*width ELSE w0:=width END;
-			IF height<MinSize THEN h0:=10*height ELSE h0:=height END;
+			IF width<MinSize THEN w0:=10*width ELSE w0:=MIN(width,MaxSize) END;
+			IF height<MinSize THEN h0:=10*height ELSE h0:=MIN(height,MaxSize) END;
 			Init(w0,h0,FALSE);
 			WM.GetDefaultManager().Add(PosX, PosY, SELF, {WM.FlagFrame,WM.FlagClose});
 			NewWindowPos(GetWidth());
@@ -206,11 +209,13 @@ Graphs* = OBJECT (Window);
 			mx:=ENTIER(0.5+max*h / height);
 			FOR j:=0 TO LEN(data,0)-1 DO
 				FOR i:=0 TO LEN(data,1)-2 DO
-					x0:=border+i*w DIV width;
-					y0:=h+mn-ENTIER(0.5+data[j,i]*h / height);
-					x1:=border+(i+1)*w DIV width;
-					y1:=h+mn-ENTIER(0.5+data[j,i+1]*h / height);
-					canvas.Line(x0, y0,	x1, y1, Colors[j MOD LEN(Colors,0)], WMGraphics.ModeCopy);
+					IF ~Reals.IsNaNL(data[j,i]) &~Reals.IsNaNL(data[j,i+1]) THEN
+						x0:=border+i*w DIV width;
+						y0:=h+mn-ENTIER(0.5+data[j,i]*h / height);
+						x1:=border+(i+1)*w DIV width;
+						y1:=h+mn-ENTIER(0.5+data[j,i+1]*h / height);
+						canvas.Line(x0, y0,	x1, y1, Colors[j MOD LEN(Colors,0)], WMGraphics.ModeCopy);
+					END;
 				END;
 			END;
 			IF mn#0 THEN canvas.Line(0, h+mn, w, h+mn, WMGraphics.Black, WMGraphics.ModeCopy); END;
@@ -234,8 +239,8 @@ GraphXY* = OBJECT (Window);
 			width:=ENTIER(maxx-minx)+1; height:=ENTIER(maxy-miny)+1;
 			IF Reals.IsNaNL(width) THEN width:=100 END;
 			IF Reals.IsNaNL(height) THEN height:=100 END;
-			IF (width<MinSize) THEN w0:=10*width ELSE w0:=width END;
-			IF height<MinSize THEN h0:=10*height ELSE h0:=height END;
+			IF (width<MinSize) THEN w0:=10*width ELSE w0:=MIN(MaxSize,width) END;
+			IF height<MinSize THEN h0:=10*height ELSE h0:=MIN(MaxSize, height) END;
 			Init(w0,h0,FALSE);
 			WM.GetDefaultManager().Add(PosX, PosY, SELF, {WM.FlagFrame,WM.FlagClose});
 			NewWindowPos(GetWidth());
@@ -291,11 +296,13 @@ GraphXY* = OBJECT (Window);
 			mnw:=-border+ENTIER(0.5+minx* scalex);	mxw:=ENTIER(0.5+maxx* scalex);
 			mnh:=-border+ENTIER(0.5+miny* scaley);	mxh:=ENTIER(0.5+maxy* scaley);
 			FOR i:=0 TO LEN(data,1)-2 DO
-				x0:=-mnw+ENTIER(0.5+data[0,i]*scalex);
-				y0:= h+mnh-ENTIER(0.5+data[1,i]*scaley);
-				x1:= -mnw+ENTIER(0.5+data[0,i+1]*scalex);
-				y1:= h+mnh-ENTIER(0.5+data[1,i+1]*scaley); 
-				canvas.Line(x0,y0,x1,y1, WMGraphics.Blue, WMGraphics.ModeCopy);
+				IF ~Reals.IsNaNL(data[0,i]) &~Reals.IsNaNL(data[1,i]) & ~Reals.IsNaNL(data[0,i+1]) &~Reals.IsNaNL(data[1,i+1])THEN
+					x0:=-mnw+ENTIER(0.5+data[0,i]*scalex);
+					y0:= h+mnh-ENTIER(0.5+data[1,i]*scaley);
+					x1:= -mnw+ENTIER(0.5+data[0,i+1]*scalex);
+					y1:= h+mnh-ENTIER(0.5+data[1,i+1]*scaley); 
+					canvas.Line(x0,y0,x1,y1, WMGraphics.Blue, WMGraphics.ModeCopy);
+				END;
 			END;
 			Axes(canvas, w,h,mnw,mnh,scalex,scaley);
 			INC(timestamp);
@@ -449,7 +456,7 @@ END Cleanup;
 
 BEGIN
 	Modules.InstallTermHandler(Cleanup);
-	Pos:=0; NewWindowPos(0);
+	Pos:=50; NewWindowPos(0);
 END WMSimpleGraphs.
 
 SystemTools.Free WMSimpleGraphs ~