RUBIK'S CUBE

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 8 mai 2011 à 13:13
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

Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
9 mai 2011 à 15:07
« j'ai effectivement eu connaissance des algorithmes génétiques pour résoudre le cube »

A priori, la principale difficulté que je vois est de décider efficacement au cours de l'algo qu'une configuration du cube est meilleure qu'une autre.
Je vois mal comment cela peut se faire... Mais bon, je ne suis ni spécialiste du Rubik's Cube ni des algos génétiques. :)
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
9 mai 2011 à 13:55
@DJE_JAY: j'ai effectivement eu connaissance des algorithmes génétiques pour résoudre le cube.
Mais je n'ai pas encore compris le principe. Quand je serai grand, peut-être.

Pour la 3D, je ne voulais pas sortir la grosse grosse artillerie pour afficher 270 polygones unicolore, En sachant que c'est largement fluide comme ça... Et que mon but premier, c'était surtout de résoudre mon P..?!#~@ de cube, ou de faire de jolies figures... Et la 3D, c'était surtout pour m'aider à ne pas faire de bêtise en suivant la formule de résolution.

Je vais quand-même regarder les deux trois astuces citées plus haut... On en apprend toujours plus chaque jour...
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
9 mai 2011 à 12:27
@DJE_JAY: On va peut être éviter cela car Skynet est né grâce à un algo pour jouer super bien aux échecs et puis ça a fini avec des Terminators liquides ...
dje_jay Messages postés 58 Date d'inscription mercredi 17 décembre 2003 Statut Membre Dernière intervention 16 février 2011 2
9 mai 2011 à 12:24
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...)
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
9 mai 2011 à 11:37
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+
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
8 mai 2011 à 19:46
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 !
defis91 Messages postés 65 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 8 août 2011
8 mai 2011 à 16:45
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
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
8 mai 2011 à 13:13
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
Rejoignez-nous