je ne trouve pas l'erreur de ce code

Généralités sur la programmation 3D
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

je ne trouve pas l'erreur de ce code

Message par graph100 »

ce code est sencé afficher un cube bleu au mileu de l'ecran
mais sa marche pas

au lancement le cube est de face donc on devrai voir un carre !

le cube tourne quan on appuie sur haut / bas / droite / gauche

voila ...

Code : Tout sélectionner

Resultat = InitSprite()

EcranX = GetSystemMetrics_(#SM_CXSCREEN) : ; =largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN) : ; =hauteur de l'ecran
WindowID = OpenWindow(1, 100, 100, 800, 600, #PB_Window_SystemMenu | #PB_Window_BorderLess, "hello")

WindowID = WindowID(1)
Result = OpenWindowedScreen(WindowID, 0, 0, 800, 600, 1, 0, 0)

InitKeyboard()

#pi = 3.1415

Structure 3d
  x.l
  y.l
  z.l
EndStructure

DataSection
  point :
    Data.l 8
    Data.l -100, 100, 100, -100, -100, 100, 100, -100  ; coordonée x des points
    Data.l 100, 100, 100, 100, -100, -100, -100, -100  ; coordonée y des points
    Data.l -100, -100, 100, 100, 100, 100, -100, -100  ; coordonée z des points
    
  ligne :
    Data.l 12
    Data.l 4, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 1, 8, 5, 3, 6, 2, 7 ; couples de point qui forme une ligne
EndDataSection

Global Dimentionp, Dimentionl

Restore point

Read z

Dimentionp = z

Dim Poin.3d(z)
Dim angle.l(z)

For ligne = 1 To 3
  For colonne = 1 To z
    If ligne = 1
      Read z1
      Poin(colonne)\x = z1
    ElseIf ligne = 2
      Read z2
      Poin(colonne)\y = z2
    ElseIf ligne = 3
      Read z3
      Poin(colonne)\z = z3
    EndIf
  Next
Next

Restore ligne

Read z

Dimentionl = z

Dim ligne.Point(2 * z)

For colonne = 1 To z Step 2
  Read z1
  ligne(colonne)\x = z1
  Read z1
  ligne(colonne)\y = z1
Next

Procedure Display3d(coorx, coory, rotationz.f, rotationy.f, rotationx.f, color)

  ; rotation autour de z
  For curseur = 1 To Dimentionp
    If poin(curseur)\x <> 0
      angle(curseur) = rotationz + ATan(poin(curseur)\y / poin(curseur)\x)
      If poin(curseur)\x <= 0
        angle(curseur) = 180 + angle(curseur)
      EndIf
    ElseIf poin(curseur)\y > 0
      angle(curseur) = 90 + rotationz
    ElseIf poin(curseur)\y <= 0
      angle(curseur) = 180 + rotationz
    EndIf
    
    distance.f = Sqr(poin(curseur)\x * poin(curseur)\x + poin(curseur)\y * poin(curseur)\y)
    poin(curseur)\x = distance * Cos(angle(curseur))
    poin(curseur)\y = distance * Sin(angle(curseur))
  Next
  
  ;rotation autour de y
  For curseur = 1 To Dimentionp
    If poin(curseur)\x <> 0
      angle(curseur) = rotationy + ATan(poin(curseur)\z / poin(curseur)\x)
      If poin(curseur)\x <= 0
        angle(curseur) = 180 + angle(curseur)
      EndIf
    ElseIf poin(curseur)\y > 0
      angle(curseur) = 90 + rotationy
    ElseIf poin(curseur)\y <= 0
      angle(curseur) = 180 + rotationy
    EndIf
    
    distance.f = Sqr(poin(curseur)\x * poin(curseur)\x + poin(curseur)\z * poin(curseur)\z)
    poin(curseur)\x = distance * Cos(angle(curseur))
    poin(curseur)\z = distance * Sin(angle(curseur))
  Next
  
  ;rotation autour de x
  For curseur = 1 To Dimentionp
    If poin(curseur)\z <> 0
      angle(curseur) = rotationx + ATan(poin(curseur)\y / poin(curseur)\z)
      If poin(curseur)\z <= 0
        angle(curseur) = 180 + angle(curseur)
      EndIf
    ElseIf poin(curseur)\y > 0
      angle(curseur) = 90 + rotationx
    ElseIf poin(curseur)\y <= 0
      angle(curseur) = 180 + rotationx
    EndIf
    
    distance.f = Sqr(poin(curseur)\z * poin(curseur)\z + poin(curseur)\y * poin(curseur)\y)
    poin(curseur)\z = distance * Cos(angle(curseur))
    poin(curseur)\y = distance * Sin(angle(curseur))
  Next
  
  ; dessin de cote
  For curseur = 1 To Dimentionl
    point1 = ligne(curseur)\x
    point2 = ligne(curseur)\y
    
    pointx1 = poin(point1)\x + coorx
    pointy1 = poin(point1)\y + coory
    pointx2 = poin(point2)\x + coorx
    pointy2 = poin(point2)\y + coory
    
    Debug "point 1  ( " + Str(pointx1) + " , " + Str(pointy1)
    Debug "point 2  ( " + Str(pointx2) + " , " + Str(pointy2)
    
    LineXY(pointx1, pointy1, pointx2, pointy2, color)
  Next
EndProcedure

coorx = 400
coory = 300

Repeat
  
  Delay(10)
  rotz.f = 0
  roty.f = 0
  rotx.f = 0
  
  ExamineKeyboard()
  
  If KeyboardPushed(#pb_key_up) : rotx = #pi / 10
  ElseIf KeyboardPushed(#pb_key_down) : rotx = -#pi / 10
  ElseIf KeyboardPushed(#pb_key_right) : roty = #pi / 10
  ElseIf KeyboardPushed(#pb_key_left) : roty = -#pi / 10
  EndIf
  
  ClearScreen(0, 0, 0)
  
  StartDrawing(ScreenOutput())
    Display3d(coorx, coory, rotz, roty, rotx, RGB(0, 0, 255))
  StopDrawing()
  
  FlipBuffers()
Until KeyboardPushed(#pb_key_escape)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

je suis pas une bete en 3D, mais le fait d'utiliser des procedures
amene un classique du Bug , qui est la declarations des variables locale
automatique dans une procedure, on oublie des fois que les variables reviennent a zero en entrant dans une procedure... ,m'étonnerai pas que le probleme puisse venir d'un "partage" de variables

puisqu'il y a rotation, faut bien que les coordonées soient "retenues" quelque part pour le tour de boucle suivant , or la je vois rien de tel

ne serai-ce pas un truc du genre par hasard ? 8O
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Message par graph100 »

les coordonnées sont retenues dans la liste "poin"
ca doi venir du type de variable "f" "l"

au depar je l'ai programmer sur calculatrice
ca marche nikel
evidement c un peu len

je mettrer le code si ca interresse qq un
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Déjà, il y a un problème avec la structure nommée 3d. Le compilo n'en veut pas
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Une structure peut commencer par un chiffre ?? je crois pas ...
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Non. Tout ce qu'on veut (enfin... presque) sauf les chiffres
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Autant pr moi.
Bah elle doit déja exister cette struct alors..
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Non, elle ne peut pas commencer par un chiffre :lol:
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Hi hi :lol:
J'avais raison (pour une fois ... :? ) :lol:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Message par graph100 »

mon compilateur (3.80) ne reporte pas d'erreur de structure

le prog marche mais ce qui est afficher est n'importe quoi
si vous changez le nom de la structure ca marche ?

code casio (graph100):

Code : Tout sélectionner

{-10,10,10,-10,-10,10,10,-10}ÞList 1
{10,10,10,10,-10,-10,-10,-10}ÞList 2
{-10,-10,10,10,10,10,-10,-10}ÞList 3
{4,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,1,8,5,3,6,2,7}ÞList 4
Dim List 1ÞDim List 5
ViewWindow -63,63,0,-31,31,0
Cls
Deg
AxesOff
Do
Cls
For 1ÞB To Dim List 4 Step 2
List 4[B]ÞD
List 4[B,1]ÞE
F-Line List 1[D],List 2[D],List 1[E],List 2[E]
Next
Do
GetkeyÞÍ
LpWhile Í=0
Í=72 Or Í=62 Or Í=52ã10ÞÎ
Í=71 Or Í=61 Or Í=51ã‡10ÞÎ

'Z

If Int (.1Í)=7
Then For 1ÞG To Dim List 1
If List 1[G]
Then Î+Atan› (List 2[G]/List 1[G])ÞList 5[G]
If List 1[G]à0
Then 180+List 5[G]ÞList 5[G]
IfEnd
Else If List 2[G]>0
Then 90+ÎÞList 5[G]
Else 180+ÎÞList 5[G]
IfEnd
IfEnd
"racine"(List 1[G]²+List 2[G]²)ÞA
Acos List 5[G]ÞList 1[G]
Asin List 5[G]ÞList 2[G]
Next
IfEnd
If Int (.1Í)=6
Then For 1ÞG To Dim List 1
If List 1[G]
Then Î+Atan(List 3[G]/List 1[G])ÞList 5[G]
If List 1[G]à0
Then 180+List 5[G]ÞList 5[G]
IfEnd
Else If List 2[G]<0
Then 180+ÎÞList 5[G]
Else 90+ÎÞList 5[G]
IfEnd
IfEnd
"racine"(List 1[G]²+List 3[G]²)ÞA
Acos List 5[G]ÞList 1[G]
Asin List 5[G]ÞList 3[G]
Next
IfEnd
If Int (.1Í)=5
Then For 1ÞG To Dim List 1
If List 3[G]
Then Î+Atan(List 2[G]/List 3[G])ÞList 5[G]
If List 3[G]à0
Then 180+List 5[G]ÞList 5[G]
IfEnd
Else If List 2[G]>0
Then 90+ÎÞList 5[G]
Else 180+ÎÞList 5[G]
IfEnd
IfEnd
"racine"(List 3[G]²+List 2[G]²)ÞA
Acos List 5[G]ÞList 3[G]
Asin List 5[G]ÞList 2[G]
Next
IfEnd
LpWhile Íá47
Dernière modification par graph100 le mer. 30/nov./2005 18:29, modifié 1 fois.
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

Je ne suis pas trop sûr de quoi tu parles, mais ce qui est sûr, c'est qu'on ne peut pas t'aider si tu n'utilises pas la dernière version de Pure.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Message par graph100 »

ques qui ne marche pas a part la structure ?
je doit me mettre a jour je sais
Répondre