Page 2 sur 3

Re: TransformSprite3D : explication concrète demandée

Publié : jeu. 02/sept./2010 15:24
par flaith
djes a écrit :Un truc vite fait à partir de vieux sources (sinon le mieux pour les exemples c la lib supersprite3d de cpl, j'en ai une copie)
j'avoue que cette lib m'intéresserais aussi :)

Re: TransformSprite3D : explication concrète demandée

Publié : jeu. 02/sept./2010 15:32
par djes
Je la posterai ce soir ou demain soir

Re: TransformSprite3D : explication concrète demandée

Publié : jeu. 02/sept./2010 18:56
par flaith
Image thank you sir :D

Re: TransformSprite3D : explication concrète demandée

Publié : jeu. 02/sept./2010 19:48
par Ar-S
djes a écrit :Je la posterai ce soir ou demain soir
Je la récupèrerai aussi :D

Re: TransformSprite3D : explication concrète demandée

Publié : jeu. 02/sept./2010 22:18
par djes

Re: TransformSprite3D : explication concrète demandée

Publié : ven. 03/sept./2010 14:29
par Ar-S
Image Djes Image

Re: TransformSprite3D : explication concrète demandée

Publié : sam. 04/sept./2010 16:00
par Ollivier
@TazNormand

Ne t'ai point demandé de dessiner un rond? !!!

Code : Tout sélectionner

; Une application de base de la trigonométrie : Dessiner un rond
; (µSoft)
OpenWindow(0, 0, 0, 400, 300, "", $CF0001)
RondRayon.F = 100.0
RondPositionX.F = 200
RondPositionY.F = 150
Repeat
  StartDrawing(WindowOutput(0) )
    For AngleEnDegraes = 0 To 359
      AngleEnRadians.F = AngleEnDegraes * 2.0 * #PI / 360.0
      x.F = RondPositionX + Cos(AngleEnRadians) * RondRayon
      y.F = RondPositionY + Sin(AngleEnRadians) * RondRayon
      Plot(x, y, 0)
    Next
  StopDrawing()
Until WaitWindowEvent() = 16
CloseWindow(0)

Re: TransformSprite3D : explication concrète demandée

Publié : sam. 04/sept./2010 19:22
par djes
Les degrés, pouah! Je modifie (n'y vois pas de mal Ollivier!) et j'ajoute un cercle par racines carrées.

Code : Tout sélectionner

; Une application de base de la trigonométrie : Dessiner un rond
; (µSoft)
OpenWindow(0, 0, 0, 400, 300, "", $CF0001)

StartDrawing(WindowOutput(0) )

x.f = 0
rayon.f = 100
x_centre.f = 120
y_centre.f = 150

Repeat
  
  y.f = Sqr(rayon * rayon - x * x)
  Plot(x_centre + x, y_centre + y, 0)
  Plot(x_centre + x, y_centre - y, 0)
  Plot(x_centre - x, y_centre + y, 0)
  Plot(x_centre - x, y_centre - y, 0) 
  x + 1
  
Until x = rayon

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

x_centre.f = 220
angle.f = 0
perimetre_cercle_rayon1.f = 2 * #PI
perimetre_notre_cerle.f = 2 * #PI * rayon
pas.f =  perimetre_cercle_rayon1 / perimetre_notre_cerle 

Repeat
  
  Plot(x_centre + rayon * Cos(angle), y_centre + rayon * Sin(angle), RGB($FF, 0, 0))
  angle + pas
  
Until angle >= perimetre_cercle_rayon1 ;>= au lieu d'= car les flottants manquent toujours de précision

StopDrawing()
    
Repeat  
Until WaitWindowEvent() = 16
CloseWindow(0)

Re: TransformSprite3D : explication concrète demandée

Publié : sam. 04/sept./2010 23:48
par Ollivier
Djes a écrit :Les degrés, pouah! Je modifie (n'y vois pas de mal Ollivier!)
Si tu divises un cercle en un peu plus de 23000 arcs d'angle égal et que tu en fais ta mesure de référence (le «degré perso» :D), tu peux te permettre d'avoir des calculs trigo 25% plus rapides que les calculs paramétriques. Alors le mal, je ne le vois: tu fais ce que tu veux!

Alors, en effet, on peut améliorer les perfs et étoffer au paramétrique. Mais on se rend très vite compte que le trigonométrique a le dessus sur le paramétrique dans l'aspect applicatif.

Ce qui donne deux codes:

Le code de base

Code : Tout sélectionner

; 1.1. Une application de base de la trigonométrie : 
; Dessiner un rond avec la fonction Cosinus()
; et sa fonction quadratique Sinus()
; (µSoft)
; Auteurs : Ollivier / Djes
OpenWindow(0, 0, 0, 400, 300, "", $CF0001)
RondRayon.F = 100.0
RondPositionX.F = 200
RondPositionY.F = 150
RondPasDeLAngle.F = 1 / RondRayon
RondCirconference = 2 * RondRayon * #PI
Repeat
  StartDrawing(WindowOutput(0) )
    For I = 0 To RondCirconference
      x.F = RondPositionX + Cos(AngleEnRadians.F) * RondRayon
      y.F = RondPositionY + Sin(AngleEnRadians.F) * RondRayon
      Plot(x, y, 0)
      AngleEnRadians + RondPasDeLAngle
    Next
  StopDrawing()
Until WaitWindowEvent() = 16
CloseWindow(0)
Le code du rebelle de la trigo

Code : Tout sélectionner

; 1.2. Une application de base de la trigonométrie : 
; Dessiner un rond par une application paramétrique
; du théorème de Pythagore,
; et en déterminer l'analogie trigonométrique
; (µSoft)
; Auteurs : Ollivier / Djes
OpenWindow(0, 0, 0, 400, 300, "", $CF0001)
RondRayon.F = 100.0
RondPositionX.F = 200
RondPositionY.F = 150
Repeat
  StartDrawing(WindowOutput(0) )
    For I = 0 - RondRayon To 0 + RondRayon
      X.F = I
      If Random(1) ; Un coup de pifomètre, car...
        Y.F = Sqr(RondRayon * RondRayon - X * X) ; Ceci égale...
      Else
        Y.F = Sin(ACos(X / RondRayon) ) * RondRayon ; ...cela!
      EndIf
      Plot(RondPositionX + X, RondPositionY - Y, 0)
      Plot(RondPositionX + X, RondPositionY + Y, 0)
    Next
  StopDrawing()
Until WaitWindowEvent() = 16
CloseWindow(0)
Mais je conseille aux débutants de comprendre puis d'apprendre par coeur le tout premier code que j'ai posté plus haut... C'est une étape de base que j'ai effectué il y a 21 ans (l'interpréteur EXELBASIC+ ne possédait pas de commande pour dessiner un cercle), après, chacun fait ce qu'il veut...

Re: TransformSprite3D : explication concrète demandée

Publié : dim. 05/sept./2010 7:42
par G-Rom
@Djes , elle fonctionne toujours la "lib" SuperSprite3D ?
Faut il l'adapté à directx 9 ? si sa marche , je l'adapte à Linux , avec de nouveau exemples.

Re: TransformSprite3D : explication concrète demandée

Publié : dim. 05/sept./2010 10:47
par djes
Ollivier> J'adore :) J'espère que tu as gardé ton Exel... C'est vrai que c'est un algo de base, et vu qu'on apprend la trigo à l'école avec des degrés, c'est plus simple à comprendre. A part ça, je ne cherchais pas à faire de la vitesse ;)

G-Rom> Oui, ça fonctionne sans aucun problème! Je ne sais pas si c'était la dernière version, ça remonte à ... 2006!!!!!!

Re: TransformSprite3D : explication concrète demandée

Publié : dim. 05/sept./2010 11:49
par Ollivier
Djes a écrit :Ollivier> J'adore J'espère que tu as gardé ton Exel...
Je n'ai plus tout cet ancien matériel d'une marque bouffée par µsoft.
Djes a écrit :A part ça, je ne cherchais pas à faire de la vitesse
A priori, moi non plus puisque je fais le dessin sur une fenêtre... Mais l'algo trigo, lui est optimisé, presque prêt à utiliser des tables au lieu des fonctions et user de l'écran et les "joies" de DirectX.

Voici un autre exemple qui part de cette base pour visualiser une rotation simple:

C'est toujours le même noyau:
xF = xI + Cos(angle) * Rayon
yF = yI + Sin(angle) * Rayon (si on veut être rigoureux, c'est le signe - devant Sin() )

Et là, on commence à voir les coulisses de l'utilisation de TransformSprite3D().

Code : Tout sélectionner

; 2. Application trigonométrique d'une rotation
; (µSoft)
; Auteurs : Ollivier
Global RondRayon.F = 100.0
Global RondPositionX.F = 200
Global RondPositionY.F = 150
Global RondPasDeLAngle.F = 1 / RondRayon
Global RondCirconference = 2 * RondRayon * #PI
Global AngleL1.F = #PI / 4.0
Global RayonL1.F = RondRayon
Global AngleL2.F = 3.0 * #PI / 4.0
Global RayonL2.F = RondRayon
Global AngleL12.F
Procedure DrawCircle()
  StartDrawing(WindowOutput(0) )
    Box(0, 40, 400, 260, #White)
    For I = 0 To RondCirconference
      x.F = RondPositionX + Cos(AngleEnRadians.F) * RondRayon
      y.F = RondPositionY + Sin(AngleEnRadians.F) * RondRayon
      Plot(x, y, 0)
      AngleEnRadians + RondPasDeLAngle
    Next
    Lx1 = RondPositionX + Cos(AngleL1 + AngleL12) * RayonL1
    Ly1 = RondPositionY + Sin(AngleL1 + AngleL12) * RayonL1
    Lx2 = RondPositionX + Cos(AngleL2 + AngleL12) * RayonL2
    Ly2 = RondPositionY + Sin(AngleL2 + AngleL12) * RayonL2
    LineXY(Lx1, Ly1, Lx2, Ly2, 0)
  StopDrawing()
EndProcedure
OpenWindow(0, 0, 0, 400, 300, "", $CF0001)
ScrollBarGadget(0, 10, 10, 324, 16, 0, 628, 20)
Repeat
  AngleL12 = GetGadgetState(0) / 100.
  DrawCircle()
Until WaitWindowEvent() = 16
CloseWindow(0)

Re: TransformSprite3D : explication concrète demandée

Publié : dim. 05/sept./2010 14:23
par Ar-S
Je viens de tester en PB 4.50 ça marche bien (en activant OpenGL dans les options de compilation sinon écran noir), par contr, ni a t il aucun fichier d'aide de dispo ?

Re: TransformSprite3D : explication concrète demandée

Publié : dim. 05/sept./2010 17:17
par G-Rom
non , mais je vais mettre tout ca au gout du jour avec une doc.
donc pas maintenant :D

Re: TransformSprite3D : explication concrète demandée

Publié : dim. 05/sept./2010 18:27
par Ar-S
ah ok, alors je vais m'acheter deux sachets de patience :mrgreen:
Merci d'avance Image