Ecran Form1

 

On affiche les vecteurs transformés successifs verticalement. Lorsque la permutation est correcte, toutes les composantes

du vecteur, représentées chacune par un point sont visibles.

 

 

Lorsque les conditions de permutation ne sont pas respectées certaines adresses calculées se recouvrent.

 

 

 

Merci à JC Armici pour son cours "utilisation du graphisme avec Delphi"

 

 

unit VectChaos;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs,Math, StdCtrls, ExtCtrls;

 

type

  TForm1 = class(TForm)

    Fin: TButton;

    Debut: TButton;

    Edit1: TEdit;

    Label1: TLabel;

    Edit2: TEdit;

    Label2: TLabel;

    Edit3: TEdit;

    Label3: TLabel;

 

    procedure debutClick(Sender: TObject);

    procedure Edit1Change(Sender: TObject);

    procedure Edit2Change(Sender: TObject);

    procedure Edit3Change(Sender: TObject);

    procedure FinClick(Sender: TObject);

  private

    { Déclarations privées }

  public

    { Déclarations publiques }

  end;

 

var

  Form1: TForm1;

  var VarPass:string;

  var N,Nplus1:integer;

  var x,b,a,delta,pas:Real;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.debutClick(Sender: TObject);

 

// on redéfinit la fonction modulo car la fonction mod

// n'accepte que des entiers

 

function modulo(nb:Extended;md:Extended):Real;

begin

RESULT:=nb-floor(nb/md)*md;

end;

 

var i,j:integer;

//si Nplus1 est premier

//on parcourt toutes les permutations possibles

//en incrémentant b de 1 (ramené entre 0 et ]1)

 

begin

x := 0; // il n'y a pas de composante 0 dans un vecteur de 1 à N

a:= StrToInt(Edit1.Text);

b:=StrToInt(Edit2.Text); // b est le pas en integer

N:= StrToInt(Edit3.Text);

// nombre de composantes du vecteur

Nplus1:=N+1;

delta:=1/Nplus1;//delta*Nplus1 = 1 (valeur exclue)

pas:=modulo(b*delta,1);//le pas est ramené à l'échelle 0,]1

b:=0;//chaque vecteur transformé commence à zéro

 

//intitialisation graphique

Canvas.Brush.Color:=clWhite; //fond blanc

Canvas.Pen.Color:=clBlue; //cadre bleu

Canvas.Rectangle(20,95,425,305); //tracé rectangle

 

for i:=1 to N do  // on parcourt toutes les permutations possibles

//au dela on n'observe que des récurrences

begin

  b:=b+pas;

  x:=0;

  for j:=1 to N do  // on calcule la nouvelle adresse x

  // pour chaque composante du vecteur

              begin

                        x := modulo(a*x+b,1);

                        Canvas.Pixels[20+4*i,300-2*floor(100*x)] :=clBlack;

              end;

end;

end;

 

procedure CheckInteger(Var EdBox : TEdit);

 

Var

  I, Code : Integer;

Begin

  { Get text from TEdit control }

  Val(EdBox.Text, I, Code);

 

  { Error during conversion to Integer? }

  If Code<>0 Then

  Begin

    I:=0;

    MessageDlg('Entrez un nombre entier', mtError, [mbOk], 0);

    EdBox.Text := '0';

    { Get focus back to edit box }

    EdBox.SetFocus;

  End Else

    { Pass the integer value to edit box }

    EdBox.Text := IntToStr(I);

    VarPass:=EdBox.Text;

End;

 

procedure TForm1.Edit1Change(Sender: TObject);

begin

            CheckInteger(Edit1);

            Edit1.Text:=VarPass;

end;

 

procedure TForm1.Edit2Change(Sender: TObject);

begin

            CheckInteger(Edit2);

            Edit2.Text:=VarPass;;

end;

 

procedure TForm1.Edit3Change(Sender: TObject);

begin

            CheckInteger(Edit3);

            Edit3.Text:=VarPass;

end;

 

procedure TForm1.FinClick(Sender: TObject);

begin

            Close;

end;

 

end.