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.