Demande d'aide pour programmer un cube en PASCAL

benzoolique Messages postés 4 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 5 mars 2005 - 4 mars 2005 à 14:45
EddiTheHead Messages postés 58 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 2 juin 2006 - 5 mars 2005 à 19:14
Dans le cadre d'un projet informatique en ecole d'ingenieur ( 1 ere année)
Je dois faire un programme en pascal qui modélise un cube (dont on voit toutes
les arretes) tournoyant et sur lequel il est ecrit une phrase sur une des faces.
Je n'ai aucune idée de comment proceder.
Si quelqu'un pouvait m'aider.
Sachant que j'ai telecharger la version zip d'un cube en pascal et que je ne la
comprend vraiment pas.
Merci d'avance.

10 réponses

jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
4 mars 2005 à 15:10
Hello,



Donne nous le lien du code que tu as téléchargé pour commencer.

Bonne prog,
JMP77.

N'oubliez pas de cliquer sur réponse acceptée.
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
4 mars 2005 à 16:46
Salut,

Y a trois problèmes :

1 - Faire "tourner" un cube si l'axe de rotation est fixe, il suffit(!)
d'appliquer une matrice correcte à chaque point (8 pour un cube)

exemple : si l'axe de rotation est l'axe Z

|X1| | cos(x) sin(x) 0 | |X|

|Y1| = |-sin(x) cos(x) 0 | x |Y|

|Z1| | 0 0 1 | |Z|



2 - dessiner le volume dans un plan
(ben oui , l'écran est plan !) donc une matrice 3x2 (ou 2x3 je sais
plus dans quel sens on compte)



|Xe| | 1 cos(-a)sin(a) 0 | |X|

|Ye| = | 0 sin(-a)sin(a) 1 | x |Y|



|Z|



et on tace les arrêtes.








3 - projeter sur un plan un texte. Et là, à mon avis, il y a le plus gros problème !




Ken@vo

____________________

Code, Code, Codec !
0
benzoolique Messages postés 4 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 5 mars 2005
4 mars 2005 à 16:54
Je preférerais commencer par le début si ca ne vous derange pas car le cube que j'ai telecharger ne marche pas.
Quand je le compile il y a plein d' erreur que je ne comprend pas .
Je ne sais pas si je dois utiliser une fonction speciale pour faire ce cube ou utiliser simplement des lignes.
Merci d'avance
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
4 mars 2005 à 17:21
Par le debut !



Donc : une Form : Form1

dessus un TPaintBox : PaintBox1 (environ 600 x 600)

et le code suivant :



type

TVolPoint = Record

X : real;

Y : real;

Z : real;

end;



var

Cube : Array[0..7] of TVolPoint;

DessinCube : Array[0..7] of TPoint;

Alpha : real;



procedure TForm1.FormCreate(Sender: TObject);

begin

Alpha := pi/6; // par exemple



Cube[0].X := 1;

Cube[0].Y := 1;

Cube[0].Z := 1;



Cube[1].X := 1;

Cube[1].Y := -1;

Cube[1].Z := 1;



Cube[2].X := -1;

Cube[2].Y := -1;

Cube[2].Z := 1;



Cube[3].X := -1;

Cube[3].Y := 1;

Cube[3].Z := 1;



Cube[4].X := 1;

Cube[4].Y := 1;

Cube[4].Z := -1;



Cube[5].X := 1;

Cube[5].Y := -1;

Cube[5].Z := -1;



Cube[6].X := -1;

Cube[6].Y := -1;

Cube[6].Z := -1;



Cube[7].X := -1;

Cube[7].Y := 1;

Cube[7].Z := -1;



end;





procedure TForm1.Affichage(Sender: TObject);

var

i : Integer;

begin

// projection

For i :=0 to 7 do

begin

DessinCube[i].X := round(100*(Cube[i].X + Cube[i].Y * sin(Alpha) * cos(-Alpha)))+300;

DessinCube[i].Y := round(100*(Cube[i].Z + Cube[i].Y * sin(Alpha) * sin(-Alpha)))+300;

end;

// Dessin

With PaintBox1.Canvas do

begin

Brush.Color := clBlack;

Rectangle(0,0,width,Height);

Pen.Color := clWhite;

Moveto(DessinCube[0].X,DessinCube[0].Y);

Lineto(DessinCube[1].X,DessinCube[1].Y);

Lineto(DessinCube[2].X,DessinCube[2].Y);

Lineto(DessinCube[3].X,DessinCube[3].Y);

Lineto(DessinCube[0].X,DessinCube[0].Y);

Moveto(DessinCube[4].X,DessinCube[4].Y);

Lineto(DessinCube[5].X,DessinCube[5].Y);

Lineto(DessinCube[6].X,DessinCube[6].Y);

Lineto(DessinCube[7].X,DessinCube[7].Y);

Lineto(DessinCube[4].X,DessinCube[4].Y);

Moveto(DessinCube[0].X,DessinCube[0].Y);

Lineto(DessinCube[4].X,DessinCube[4].Y);

Moveto(DessinCube[1].X,DessinCube[1].Y);

Lineto(DessinCube[5].X,DessinCube[5].Y);

Moveto(DessinCube[2].X,DessinCube[2].Y);

Lineto(DessinCube[6].X,DessinCube[6].Y);

Moveto(DessinCube[3].X,DessinCube[3].Y);

Lineto(DessinCube[7].X,DessinCube[7].Y);

end;

end;



procedure TForm1.Rotation(Sender: TObject);

var

i : Integer;

X,Y,Z : real;

begin

For i :=0 to 7 do

begin

X := Cube[i].X * cos(pi /16) + Cube[i].Y * sin(pi /16);

Y := -Cube[i].X * sin(pi /16) + Cube[i].Y * cos(pi /16);

Z := Cube[i].Z;

Cube[i].X:=X;

Cube[i].Y:=Y;

Cube[i].Z:=Z;

end;



end;



Tu peux faire exécuter les procedures avec des boutons .....

Tu peux modifier Alpha (perspective)

Après, tu peux ajouter un timer à 50 ms



procedure TForm1.Timer1Timer(Sender: TObject);

begin

Rotation(self);

Affichage(self);

end;





Et ça roule - pardon, ça tourne



Ken@vo

____________________

Code, Code, Codec !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
4 mars 2005 à 17:25
La projection n'est pas tip-top, il doit y avoir mieux ! Ca c'est de la pure trigo, et j'ai pas eu trop le temps de réfléchir !




Ken@vo

____________________

Code, Code, Codec !
0
benzoolique Messages postés 4 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 5 mars 2005
4 mars 2005 à 20:03
merci mais j'ai encore besoin d'aide parce que j'ai taper le prog que tu ma passer et sur mon programation pascal il n'a pas l'air de connaitre Tpoint .
Et les point entre les mots il ne capte pas non plus.
Desolé de t'embeter encore mais tu as vraiment a faire a un debutant.
Merci encore
0
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
4 mars 2005 à 21:36
Mais tu n'utilises pas delphi?

Bonne prog,
JMP77.

N'oubliez pas de cliquer sur réponse acceptée.
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
5 mars 2005 à 11:06
Non ! visiblement !



Et même si Alhzeimer n'a pas encore frappé (quoique !), mes souvenirs du Turbo Pascal restent vagues.



Les principes restent bons (quand même)



Ken@vo

____________________

Code, Code, Codec !
0
benzoolique Messages postés 4 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 5 mars 2005
5 mars 2005 à 11:51
Non j'utilise TurboPascal7.0
et la fonction cube n'exite pas ou je ne l'ai pas trouvée mais c pour ca que je n'arrive pas a creer ce programme.
Je suis desolé de vous redemandez de m'aidez.
Merci
0
EddiTheHead Messages postés 58 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 2 juin 2006
5 mars 2005 à 19:14
Salut,

J'avais trouvé y a fort fort longtemps un programme en basic pour C64 qui faisait tourner un cube. Je l'avais transposé en Turbo Pascal 6.0.
Tu trouveras le code un peut modifié, puisque j'ai rajouté la lettre "A" sur une face. A toi de faire le reste.

Dans l'article, il disait que c'était la manière la plus facile pour comprendre la 3D mais que ce n'était pas le meilleurs algorithme. Tu pourras constater que l'animation n'est pas rapide et que ce n'est pas avec ce code que tu vas refaire un doom-like.

Je te préviens que j'y connais rien en trigo et en 3D. Je peux afficher ce que je veux avec ce code mais faut pas me demander d'explications sur les formules de trigo. Le programme de Kenavo est plus performant et il pourra d'aider pour la théorie en 3D.

Pour vectoriser la lettre "A" :
-j'ai pris 5 points
*(3) point(1) en (100,-80,-80) (x,y,z)
point(2) en (100,-50,-20)
point(3) en (100,0,80)
*(2) *(4) point(4) en (100,50,-20)
point(5) en (100,80,-80)

*(1) *(5)

ensuite tu traces 3 lignes : points 1 et 3
points 3 et 5
points 2 et 4

Pour utiliser le mode graphique, tu dois avoir le fichier "Egavga.bgi" et l'unité "Graph".



Bonne chance,
eddithehead

----------------------------------------------------------
Program Cube;

Uses Crt, Graph;

Const PathGraph = '';
NDP = 8 + 5;
{ Nombre de points : 8 pour le cube + 5 pour la lettre A }

NDD = 12 + 3;
{ Nombre de droites : 12 pour le cube + 3 pour le A }

Fc = 300; { Focal caméra }
Cz : Word = 500; { Profondeur }

X : Array [1..NDP] Of LongInt = (-100, 100, 100, -100, -100, 100, 100, -100, 100, 100, 100, 100, 100);
Y : Array [1..NDP] Of LongInt = (-100, -100, 100, 100, -100, -100, 100, 100, -80, -50, 00, 50, 80);
Z : Array [1..NDP] Of LongInt = (-100, -100, -100, -100, 100, 100, 100, 100, -80, -20, 80, -20, -80);
P1 : Array [1..NDD] Of LongInt = (1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 9, 11, 10);
P2 : Array [1..NDD] Of LongInt = (2, 3, 4, 1, 6, 7, 8, 5, 5, 6, 7, 8, 11, 13, 12);

Var GraphDriver, GraphMode : Integer;
XMax, YMax, XMax2, YMax2 : Word;

X1, Y1, Z1, Xe, Ye : Array [1..NDP] Of LongInt;
Co, Si : Array [0..360] Of Real;

Procedure TestGraphError (GraphErr : Integer);
Var Car : Char;
Begin
If GraphErr <> GrOk Then

Begin

Writeln('Graphics error: ', GraphErrorMsg(GraphErr));

Car := ReadKey;

Halt(1);

End;

End;

Procedure Init;
Begin
{ Passer en mode graphique VGA 16 couleurs }

GraphDriver := Detect;
DetectGraph(GraphDriver, GraphMode);

TestGraphError(GraphResult);

Case GraphDriver Of

VGA : Begin

GraphDriver := VGA;

GraphMode := CGAC1;

End;

End;

InitGraph(GraphDriver, GraphMode, PathGraph);

TestGraphError(GraphResult);

XMax := GetMaxX; XMax2 := XMax Div 2;

YMax := GetMaxY; YMax2 := YMax Div 2;

End;

Procedure Action;
Var PageActive, PageVisuel : Byte;


Cpt, Ax, Ay, Az : Word;
Xx, Yy, Zz, Xx1, Yy1 : LongInt;

D : Real;

Car : Char;

Begin
PageActive := 0;

PageVisuel := 1;


SetColor(2);<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />


For Cpt := 0 To 360 Do { On ne calcule qu'un seul fois les sinus et cosinus }


Begin

Co[Cpt] := Cos(Cpt * (PI / 180));


Si[Cpt] := Sin(Cpt * (PI / 180));


End;

Ax := 360; Ay := 360; Az := 360;


Repeat

PageVisuel := (PageVisuel Mod 2) + 1; SetVisualPage(PageVisuel - 1); { Utiliser un double buffer }

PageActive := (PageActive Mod 2) + 1; SetActivePage(PageActive - 1);

Ax := (Ax Mod 360) + 1; { Compteur pour faire tourner sur axe X }

Ay := (Ay Mod 360) + 1; { Compteur pour faire tourner sur axe Y }

Az := (Az Mod 360) + 1; { Compteur pour faire tourner sur axe Z }


For Cpt := 1 To NDP Do


Begin

{ Calcul des rotation }
X1[Cpt] := X[Cpt];

Y1[Cpt] := Y[Cpt];

Z1[Cpt] := Z[Cpt];



Xx := X1[Cpt];


Yy := Trunc(Y1[Cpt] * Co[Ax] + Z1[Cpt] * Si[Ax]);

Zz := Trunc(-Y1[Cpt] * Si[Ax] + Z1[Cpt] * Co[Ax]);

X1[Cpt] := Xx; Y1[Cpt] := Yy; Z1[Cpt] := Zz;


Xx := Trunc(X1[Cpt] * Co[Ay] + Z1[Cpt] * Si[Ay]);

Yy := Y1[Cpt];

Zz := Trunc(-X1[Cpt] * Si[Ay] + Z1[Cpt] * Co[Ay]);

X1[Cpt] := Xx; Y1[Cpt] := Yy; Z1[Cpt] := Zz;


Xx := Trunc(X1[Cpt] * Co[Az] + Y1[Cpt] * Si[Az]);

Yy := Trunc(-X1[Cpt] * Si[Az] + Y1[Cpt] * Co[Az]);

Zz := Z1[Cpt];

X1[Cpt] := Xx; Y1[Cpt] := Yy; Z1[Cpt] := Zz;

{ Calcul pour afficher en 2D }
D := Sqrt(Xx*Xx + Yy*Yy + (Cz+Zz)*(Cz+Zz)); { Racine carrée de Xx²+Yy²+(Cz+Zz)² }

Xe[Cpt] := XMax2 + Trunc((Xx * Fc) / D);


Ye[Cpt] := YMax2 + Trunc((Yy * Fc) / D);

End;


ClearViewPort; { Effacer l'écran }


{ Afficher les lignes }

For Cpt := 1 To NDD Do

Begin

Xx := Xe[P1[Cpt]];

Yy := Ye[P1[Cpt]];


Xx1 := Xe[P2[Cpt]];


Yy1 := Ye[P2[Cpt]];

Line(Xx, Yy, Xx1, Yy1);

End;


Until KeyPressed;

Car := ReadKey;

End;

Begin
Init;


Action;


CloseGraph;


RestoreCrtMode;

End.
0
Rejoignez-nous