RUBIK'S CUBE

Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
- - Dernière réponse : Caribensila
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
- 9 mai 2011 à 15:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53132-rubik-s-cube

Afficher la suite 
Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32 -
Salut,

alors la ... !!
je dis bravo ... animations fluides, très beau rendu et pas une seule fuite de mémoire :D

Rien que pour ça et pour le travail fourni je mets un 10/10

Bien sur il y a des améliorations possibles mais il y en a qu'une que je ferais, non pas par soucis de vitesse mais par sécurité .. c'est de mettre un block "try finally end;" aux emplacements où tu crées des Bitmaps temporaires.

ex:

procedure DrawCube(P: TPaintBox; c: TRubik);
var
i,j,k: Integer;
Tmp: TBitmap;
begin
Tmp := TBitmap.Create;
try
...
finally
Tmp.Free
end;
end;

ce qui a pour effet de garantir la libération de Tmp même en cas de problèmes. ;)

Encore Bravo.
@++
Cirec
defis91
Messages postés
66
Date d'inscription
samedi 29 octobre 2005
Statut
Membre
Dernière intervention
8 août 2011
-
Bravo Bravo !
Vue 3D magnifique

ajoute un paintbox3.refresh de Uvue3D dans Button24click de Main si le radio bouton "original" est coché.

Super programme.
Désolé, pas assez fort au Rubik's pour t'aider à optimiser l'algo de résolution.
Dom
Caribensila
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13 -
Salut Barbichette,

Il y a des moments où on regrette d'avoir jeté le vieux Rubik's Cube de son enfance sous pretexte qu'il donnait des migraines. :'(

« ATTENTION, j'en entend déjà du haut de mes Alpes qui me disent que ce n'est pas optimisé. »
J'ai dû le penser trop fort... Mais tu as quand même l'ouïe fine. ;)

Bon, je ne critique pas ton algo, mais il y a des optimisations qui devraient se faire de façon automatique, je pense.

- Au lieu d'une unité uConst, j'aurais calculé tout ça dans le FormCreate et placé les résutats dans des tableaux dynamiques. Les accès aux données seraient ensuite même plus rapide que des Const car ils s'agit de pointeurs et, de plus, ça allègerait l'exe.

-------------------------------------------------------------

- SinCos est deux fois plus rapide qu'un appel à Sin suivi d'un appel à Cos pour le même angle. Mais je note que ça t'évite d'utiliser l'unité Math.
Cependant, bien que tu n'utilises Sin et Cos qu'à un seul endroit de ton code (RotationPoint), on peut quand même remarquer que cette fonction est appelée très souvent et constitue un goulet d'étranglement.
Et il serait encore mieux d'utiliser un tableau précalculé. Exemple avec la technique du tableau dynamique :

type
TSinCos = record
Sin : Single;
Cos : Single;
end
TSinCosArray = array of TSinCos;

var
SinCosArray : TSinCosArray;

procedure PreCalcSinCosArray;
var Angle : integer;
S,C : Extended;
begin
SetLength(SinCosArray,361); //Tableau dynamique pour perf'.
for Angle := 0 to 360 do begin
SinCos(DegToRad(Angle), S, C);//Optimisable.
with SinCosArray[Angle] do begin
Sin := S;
Cos := C;
end;
end;
SinCosArray[ 90].Cos := 0; // Corrections des approximations.
SinCosArray[180].Sin := 0; // "
SinCosArray[270].Cos := 0; // "
SinCosArray[360].Sin := 0;// "
end;

---------------------------------------------------------------------------------------------

Un dernier truc pas très connu et que je suis sûr que tu apprécieras et que tu sauras en tirer la substantifique moelle, c'est l'utilisation de la structure Windows XFORM et les Api's :
- SetGraphicsMode()
- SetMapMode()
- SetWorldTransform()

Je pense que tu aurais peut-être pu en tirer parti ici. Mais, de toute façon, c'est bon à connaître et j'en profite pour en parler, si tu ne connaissait pas.

-------------------------------------------------------------------------------------------

Bon, encore une fois, il ne s'agit pas de critiques mais de remarques qui peuvent être utiles aux chalands.
D'autant que je suppose que ton but était plus l'algo de résolution que l'interface. ;)

Je me joins donc au concert de louanges avec un 10/10 bien mérité.
Et un grand merci !
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
Salut Barbich'

comme d' hab', code très bien décomposé en plusieurs unités. J' avoue que je ne suis pas rentré dans les détails car j' ai encore des maux de tête depuis que j' ai crée le compo TcyMathParser grâce á ta source ^^

Par contre, qu' elle déception pour le rendu 3D! Je m' attendais à voir de l' openGL ou DirectX qui aurait simplifié (ou pas) le rendu.
Pour m' y être frotté il y a longtemps, ça m' aurait plu de voir un petit tutorial sur ce sujet. Enfin, faisons pas la fine bouche car les bonnes sources se font rares sur DelphiFr ...

A+
dje_jay
Messages postés
58
Date d'inscription
mercredi 17 décembre 2003
Statut
Membre
Dernière intervention
16 février 2011
1 -
Très beau projet!
Concernant l'optimisation, je ne suis pas dans le truc, mais tels que tu le décris ça me faisait penser à un "optimisateur" de BrainFuck basé sur un algo génétique...
J'ai retrouvé le lien : http://mivankovic.blogspot.com/2009/11/brainfuck-genetic-programming.html
Je l'avais testé, et il était efficace. Ça éviterait certainement de faire tourner une machine durant 35ans, comme tu l'indiques... ;-)
(Si quelqu'un a le courage et la curiosité de s'y mettre...)