Punch Sphere explication de ce code ??-> Djes

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Punch Sphere explication de ce code ??-> Djes

Message 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
Image
Image
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 ! :)
Dernière modification par Backup le jeu. 18/juin/2009 10:51, modifié 1 fois.
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

Au contraire, merci Dobro

Manque plus que la réponse de Djes :wink:
Image
Image
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message 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!
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

djes

bravo, c'est le genre de code qui me fait triper. :D
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message 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
Image
Image
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Envoie moi ton code, en privé si tu veux
Répondre