Page 1 sur 1

je ne trouve pas l'erreur de ce code

Publié : sam. 26/nov./2005 20:24
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)

Publié : sam. 26/nov./2005 23:15
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

Publié : lun. 28/nov./2005 16:18
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

Publié : lun. 28/nov./2005 17:06
par Chris
Déjà, il y a un problème avec la structure nommée 3d. Le compilo n'en veut pas

Publié : lun. 28/nov./2005 17:12
par lionel_om
Une structure peut commencer par un chiffre ?? je crois pas ...

Publié : lun. 28/nov./2005 17:16
par Chris
Non. Tout ce qu'on veut (enfin... presque) sauf les chiffres

Publié : lun. 28/nov./2005 17:21
par lionel_om
Autant pr moi.
Bah elle doit déja exister cette struct alors..

Publié : lun. 28/nov./2005 17:51
par Chris
Non, elle ne peut pas commencer par un chiffre :lol:

Publié : lun. 28/nov./2005 18:00
par lionel_om
Hi hi :lol:
J'avais raison (pour une fois ... :? ) :lol:

Publié : mer. 30/nov./2005 18:22
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

Publié : mer. 30/nov./2005 18:25
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.

Publié : mer. 30/nov./2005 18:37
par graph100
ques qui ne marche pas a part la structure ?
je doit me mettre a jour je sais