Triangle de couleurs avec utilisation du barycentre

Soyez le premier à donner votre avis sur cette source.

Vue 8 071 fois - Téléchargée 393 fois

Description

Ce programme permet d'afficher 1 triangle de couleurs de 2 manières différentes (avec le barycentre et sans).
Le problème est qu'avec la méthode du barycentre, l'affichage est long (+ de 2 minutes); il doit y avoir moyent d'aller plus vite mais je ne sais pas comment faire.

Codes Sources

A voir également

Ajouter un commentaire

Commentaire

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
32
en reponse a une question posée il y a deux ans, comment aller plus vite :

pour la methode "Autre" l'affichage est instantané, pour la methode "Barycentre" l'affichage est beaucoup plus rapide.

type

TRGBRec = record
B,G,R : byte;
end;
TRGBRecArray = array[0..32767] of TRGBRec;
pRGBRecArray = ^TRGBRecArray;

procedure TForm1.Button1Click(Sender: TObject);
var
A, B, C, G : TPoint;
IndexRed, IndexGreen, IndexBlue : Integer;
IndexRed2, IndexGreen2, IndexBlue2 : Integer;
IndexX, IndexY : Integer;
Modulo : Integer;

BMP : TBitmap;
ScanLines : pRGBRecArray;
ScanColor : integer;
const
Cote = 622;
Cote255 = 255/Cote;

begin
Effacer;

BMP := TBitmap.Create;
with BMP do begin
Width := ClientWidth;
Height := ClientHeight;
PixelFormat := pf24bit;
Canvas.Brush.Color := color;
Canvas.Pen.Color := color;
Canvas.Rectangle(0,0,ClientWidth,ClientHeight);
end;

A.x := ClientWidth div 2;
A.y := 100;
B.x := A.X - Cote div 2;
B.y := Round(100 + Cote*Sqrt(3) / 2);
C.x := A.X + Cote div 2;
C.y := B.Y;

Case Tracage of
Barycentre : begin
Modulo := StrToInt(Edit1.Text);
for IndexRed := 0 to 255 do begin
for IndexGreen := 0 to 255 do begin
for IndexBlue := 0 to 255 do begin
if (IndexRed+IndexGreen+IndexBlue <> 0) and
(IndexRed mod Modulo = 0) and
(IndexGreen mod Modulo = 0) and
(IndexBlue mod Modulo = 0) then begin
G.x := (IndexRed*A.x + IndexGreen*B.x + IndexBlue*C.x) div (IndexRed+IndexGreen+IndexBlue);
G.y := (IndexRed*A.y + IndexGreen*B.y + IndexBlue*C.y) div (IndexRed+IndexGreen+IndexBlue);
ScanLines := BMP.ScanLine[G.Y];
with ScanLines[G.X] do begin
R := IndexRed;
G := IndexGreen;
B := IndexBlue;
end;
end;
end;
end;
if (indexred mod 10) = 0 then Canvas.Draw(0,0,BMP);
end;
end;

Autre : begin
for IndexX := B.x to C.x do begin
for IndexY := A.y to B.y do begin
IndexRed := Round(sqrt(sqr(IndexX - A.x)+sqr(IndexY - A.y)));
IndexGreen := Round(sqrt(sqr(IndexX - B.x)+sqr(IndexY - B.y)));
IndexBlue := Round(sqrt(sqr(IndexX - C.x)+sqr(IndexY - C.y)));
if (IndexRed < 622) and (IndexGreen < 622) and (IndexBlue < 622) then begin
IndexRed2 := 256 - Round(IndexRed * Cote255);
IndexGreen2 := 256 - Round(IndexGreen * Cote255);
IndexBlue2 := 256 - Round(IndexBlue * Cote255);
ScanLines := BMP.ScanLine[indexY];
with ScanLines[IndexX] do begin
B := IndexBlue2;
G := IndexGreen2;
R := IndexRed2;
end;
end;
end;
end;
end;
end;

Canvas.Draw(0,0,BMP);
BMP.Free;
end;

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.