Page 1 sur 1

Punch Sphere explication de ce code ??-> Djes

Publié : jeu. 18/juin/2009 9:50
par TazNormand
Bon, je suis en train de décortiquer ton code PSphere Djes : pas facile !!!

J'imagines JBernard13 en train d'expliquer leslignes du code :D

bon je me moque, c'est pas gentil :oops:

Si je comprends le principe, tu as une macro "G" , qui crée... une macro "T", d'où le endmacr sans O, et le fameux O après chaque appel de la macro "G".

Mon problème c'est que je suis nul en maths, que je n'ai jamais fait de trigo, aussi je capte pas l'équation pour dessiner le cercle, et que l'explication pour de la sphère du site MathCurve ne me parles PAS DU TOUT !!!

Peux-tu m'expliquer le pourquoi du comment ?

Je me permet de reposter ton code sans Macro pour les "ceuzes" comme moi qui voudraient comprendre

Code : Tout sélectionner

;*****************************************************************************
;*
;* Name   :  PSphere
;* Author :  djes
;* Date   :  06/17/2009
;* Notes  :  -
;*
;*****************************************************************************
InitSprite():

Structure v:
x.f:
y.f:
z.f:
c.i:
EndStructure:

w=511:
r=255:
k=127


t$="PUREBASIC"
OpenWindow(0,0,0,w,w,""):
OpenWindowedScreen(WindowID(0),0,0,w,w,0,0,0)
NewList s.v():

LoadFont(1,"Arial",16):
StartDrawing(ScreenOutput()):
  DrawingFont(FontID(1))
  DrawText(10,0,t$,r,0):
  For y=-r To r:
    For x=-r To r:
      z=Sqr(65025-(x*x)-(y*y))
      If z>0:
        If Point(x&k,y&63)<>0:
          AddElement(s()):
          If x&1=0:
            z*-1:
          EndIf
          s()\x=x:
          s()\y=y:
          s()\z=z
          s()\c=-1:
        EndIf
      EndIf
    Next x:
  Next y:
StopDrawing():

Repeat:
  FlipBuffers():
  ClearScreen(0):
  StartDrawing(ScreenOutput())
    ForEach(s()):
      Plot(r+s()\x,r+s()\y,w):
      b.f=(Cos(0.03)*s()\x - Sin(0.03)*s()\z):
      s()\z=(Cos(0.03)*s()\z + Sin(0.03)*s()\x):
      s()\x=b:
      b.f=(Cos(0.03)*s()\x - Sin(0.03)*s()\y)
      s()\y=(Cos(0.03)*s()\y + Sin(0.03)*s()\x):
      s()\x=b:
      Plot(r+s()\x,r+s()\y,s()\z):
    Next
  StopDrawing():
Until WindowEvent()=16

Publié : jeu. 18/juin/2009 10:49
par Backup
j'ai mis ton message ici , pour ne pas que la réponse soit dans le topic des
Punch ;) et que celui ci prenne en longueur, pour un "Hors sujet"

j'espere que tu m'en voudra pas ! :)

Publié : jeu. 18/juin/2009 10:51
par TazNormand
Au contraire, merci Dobro

Manque plus que la réponse de Djes :wink:

Publié : jeu. 18/juin/2009 10:54
par djes
:lol: C'est rigolo de voir son code comme ça! Je l'ai tellement modifié que je ne le reconnais plus.

Pour la macro tu as compris, no prob.

Pour la trigo, tu connais la formule de distance entre deux points? Si tu prends une sphère, tous les points de la surface sont à la même distance du centre. Autrement dit quel que soit le point à la surface de la sphère, il existe un vecteur qui part du point et qui va vers le centre et qui a une longueur = au rayon de la sphère. Ce vecteur, dans un espace à 3 dimensions, a 3 composantes, en x, y et z.
On sait que longueur^2=x^2+y^2+z^2
Donc si je connais la longueur et deux composantes, je peux déduire la troisième composante.

Je m'arrange donc pour parcourir toute la surface et faire le calcul : boucle y et x (je parcours tous les points d'un carré). Ma longueur est fixée au départ (puisque que c'est le rayon de ma sphère et qu'il ne bougera pas!) : 255

La formule pour savoir le z : z^2=longueur^2-(composante x)^2-(composante y)^2 (et oui, c'est aussi simple que ça!!!!)

Ensuite je teste si c'est supérieur à 0 pour ne pas retenir les points en dehors de la sphère (les points dans les côtés du carrés vont donner à mon calcul un résultat négatif), et un point sur deux j'inverse son z pour qu'il soit "de l'autre côté".

Voilà!

Le reste en bas sert à faire tourner la sphère, sur seulement deux axes pour gagner un peu de place ;)

PS: vous m'avez eu, j'ai crû que taznormand avait effacé son post!

Publié : jeu. 18/juin/2009 15:24
par chikun
djes

bravo, c'est le genre de code qui me fait triper. :D

Publié : mar. 30/juin/2009 14:54
par TazNormand
Bon,

je suis vraiment trop nul, j'arrive pas a faire en sorte que la boule se déplace de gauche à droite tous en "sautant".

J'ai besoin de ton aide Djes, mes essais se sont soldé par un"éclatement" de la sphere en pixel, genre supernova

Publié : mar. 30/juin/2009 18:28
par djes
Envoie moi ton code, en privé si tu veux