ADru/Mod/S33_Sierpinski.odc

(*  Общие сведения о примерах: Справка *)
(*  Исправления и подготовка примеров: (С) Ф.В.Ткачев, 2009, info21 AT inr.ac.ru *)

MODULE  ADruS33_Sierpinski;  (* Рисование кривых Серпиньского, раздел 3.3. *)

	IMPORT  Log := StdLog,  Math,  Draw := ADruS33_Draw;
	
	CONST  в = 0;  с = 2;  з = 4;  ю = 6;  (*в = восток и т.д.*)
		св = 1;  сз = 3;  юз = 5;  юв = 7;  (*св = северо-восток и т.д.*)

	(* фрагмент из книги, с.141 ************************************)	
	VAR  h: INTEGER;
			(* необходимые упреждающие определения, отсутствующие в книге: *)
			PROCEDURE^ B ( k: INTEGER );
			PROCEDURE^ C ( k: INTEGER );
			PROCEDURE^ D ( k: INTEGER );
	
	PROCEDURE A ( k: INTEGER );
	BEGIN
		IF  k > 0  THEN
			A( k - 1 );  Draw.line( юв, h );
			B( k - 1 );  Draw.line( в, 2*h );
			D( k - 1 );  Draw.line( св, h );
			A( k - 1 )
		END
	END A;
	
	PROCEDURE B ( k: INTEGER );
	BEGIN
		IF  k > 0  THEN
			B( k - 1 );  Draw.line( юз, h );
			C( k - 1 );  Draw.line( ю, 2*h );
			A( k - 1 );  Draw.line( юв, h );
			B( k - 1 )
		END
	END B;
	
	PROCEDURE C ( k: INTEGER );
	BEGIN
		IF  k > 0  THEN
			C( k - 1 );  Draw.line( сз, h );
			D( k - 1 );  Draw.line( з, 2*h );
			B( k - 1 );  Draw.line( юз, h );
			C( k - 1)
		END
	END C;
	
	PROCEDURE D ( k: INTEGER );
	BEGIN
		IF  k > 0  THEN
			D( k - 1 );  Draw.line( св, h );
			A( k - 1 );  Draw.line( с, 2*h );
			C( k - 1 );  Draw.line( сз, h );
			D( k - 1 )
		END
	END D;
	
	PROCEDURE Sn* ( n: INTEGER );
		CONST  SquareSize = 256;
		VAR  i, x0, y0: INTEGER;
	BEGIN
		Draw.Clear;
		h := SquareSize DIV ASH( 2, n );
		x0 := 2 * h DIV 3;  y0 := Draw.width - x0;
		h := h DIV 2;  y0 := y0 + h;  Draw.SetPen( x0, y0 );
		A( n );  Draw.NextThick;  Draw.line( юв, h );
		B( n );  Draw.NextThick;  Draw.line( юз, h );
		C( n );  Draw.NextThick;  Draw.line( сз, h );
		D( n );  Draw.NextThick;  Draw.line( св, h );
	END Sn;

	PROCEDURE Sierpinski* ( n: INTEGER );
		CONST  SquareSize = 256;
		VAR  i, x0, y0: INTEGER;
	BEGIN
		Draw.Clear;
		h := SquareSize DIV 2;
		x0 := 2*h;  y0 := Draw.width - h;
		i := 0;
		REPEAT
			INC( i );  x0 := x0 - h;
			h := h DIV 2;  y0 := y0 + h;  Draw.SetPen( x0, y0 );
			A( i );  Draw.line( юв, h );
			B( i );  Draw.line( юз, h );
			C( i );  Draw.line( сз, h );
			D( i );  Draw.line( св, h )
		UNTIL  i = n
	END Sierpinski;
	
	(* конец фрагмента *****************************************)

END  ADruS33_Sierpinski.

При клике по одному из нижеприведенных командиров в отдельном окошке рисуется кривая Серпиньского соответствующего порядка.
При повторных кликах рисунок перерисовывается в том же окошке:

Если окошко с рисунком случайно закрылось, прежде чем пытаться нарисовать его снова, кликнуть сюда:
DevDebug.UnloadThis  ADruS33_Hilbert ADruS33_Sierpinski ADruS33_Draw

"ADruS33_Sierpinski.Sierpinski(1)"
"ADruS33_Sierpinski.Sierpinski(2)"
"ADruS33_Sierpinski.Sierpinski(3)"
"ADruS33_Sierpinski.Sierpinski(4)"
"ADruS33_Sierpinski.Sierpinski(5)"
"ADruS33_Sierpinski.Sierpinski(6)"

Отдельные кривые:
"ADruS33_Sierpinski.Sn(1)"
"ADruS33_Sierpinski.Sn(2)"
"ADruS33_Sierpinski.Sn(3)"
"ADruS33_Sierpinski.Sn(4)"
"ADruS33_Sierpinski.Sn(5)"
"ADruS33_Sierpinski.Sn(6)"

Для копирования получившихся картинок в текст (см. такую копию ниже): 
	отрегулировать размер окна, Ctrl+Space, Ctrl+C, 
в тексте, куда надо вставить картинку: 
	Edit, Paste Special..., выбрать Picture (Metafile).