Page 1 sur 1

Rotation ligne

Publié : jeu. 28/août/2014 13:02
par microdevweb
Bonjour,

Je ne suis vraiment part fort en trigono,

Quel est la formule tracer une ligne avec un angle donné en mode point par par point

Code : Tout sélectionner

;Exemple avec un angle de 30 degrés (ou autre peut importe)
For Y=1 To 100
      Plot(X,Y,Couleur)
      X+?
Next

Re: Rotation ligne

Publié : jeu. 28/août/2014 13:13
par Cool Dji
Hello,

Rhooooo; multiplie la valeur de Y par un sinuns(30) ou un cosinus(30) en pensant avant à convertir ton angle en radian...

J'ai pas testé le code mais normalement :

For y=0 to 100
Plot(Y*Cos(rad(30),Y) ou Plot(Y*Sin(rad(30),Y)
Next

Sinon, tu peux tracer une ligne Line(0,0,100*Cos(rad(30),100) un truc du genre...

Re: Rotation ligne

Publié : jeu. 28/août/2014 13:26
par microdevweb
Merci Cool Dji,

Je penses que c'est bon

Re: Rotation ligne

Publié : jeu. 28/août/2014 13:27
par falsam
Rhooooo + 1 (héhé)

Un exemple dans la doc : http://www.purebasic.com/french/documen ... inexy.html

En reprenant le code de l'exemple.

Code : Tout sélectionner

Procedure DrawLine(x, y, angle, Lenght, Color)
  LineXY(x, y, x+Cos(Radian(Angle))*Lenght, y+Sin(Radian(Angle))*Lenght, Color)
EndProcedure  


OpenWindow(0, 0, 0, 800, 600, "DrawLine", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateImage(0, 800, 600)
StartDrawing(ImageOutput(0))
Box(0, 0, 800, 600, RGB(255, 255, 255))

DrawLine(10, 300, -45, 200, RGB(255, 0, 0))
DrawLine(10, 300, 45, 200, RGB(255, 0, 0))

StopDrawing() 
ImageGadget(0, 0, 0, 200, 200, ImageID(0))

Repeat : Until WaitWindowEvent(100) = #PB_Event_CloseWindow

Re: Rotation ligne

Publié : jeu. 28/août/2014 13:31
par microdevweb
Merci Falsam,

J'avais regarder l'aide de lineXy, mais idiot que suis pas l'exemple...

Re: Rotation ligne

Publié : jeu. 28/août/2014 13:37
par microdevweb
Il y a t'il un moyen d'éviter alliasing (escaliers)?

Re: Rotation ligne

Publié : jeu. 28/août/2014 13:42
par falsam
microdevweb a écrit :Il y a t'il un moyen d'éviter alliasing (escaliers)?
Vu ton projet, cette solution devrait te convenir.

http://www.purebasic.fr/english/viewtop ... rawing.pbi

Re: Rotation ligne

Publié : jeu. 28/août/2014 13:52
par microdevweb
Merci Falsam,
Cette dll à l'air puissante

Re: Rotation ligne

Publié : jeu. 28/août/2014 14:01
par falsam
Pour fonctionner tu as besoin d'avoir dans le dossier de ton application les fichiers suivants:
- L'include gDrawing.pbi
- les libs gdiplus_x64.lib et gdiplus_x86.lib

le code précédant devient:

Code : Tout sélectionner

XIncludeFile "gDrawing.pbi"

Procedure DrawLine(x, y, angle, Lenght, Color)    
  gLineXY(x, y, x+Cos(Radian(Angle))*Lenght, y+Sin(Radian(Angle))*Lenght, Color)
EndProcedure  

gInit()

OpenWindow(0, 0, 0, 800, 600, "DrawLine", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateImage(0, 800, 600)
gStartDrawing(ImageOutput(0))
gDrawingMode(#PB_2DDrawing_Outlined)

Box(0, 0, 800, 600, RGB(255, 255, 255))

DrawLine(10, 300, -45, 200, RGBA(255, 0, 0, 255))
DrawLine(10, 300, 45, 200, RGBA(255, 0, 0, 255))

gStopDrawing() 
ImageGadget(0, 0, 0, 200, 200, ImageID(0))

gEnd()

Repeat : Until WaitWindowEvent(100) = #PB_Event_CloseWindow
Tes lignes seront parfaites :)

Re: Rotation ligne

Publié : jeu. 28/août/2014 14:11
par falsam
Tu peux jouer sur l'épaisseur de la ligne avec le commande gSetPen(Color, Size)

Le code devient

Code : Tout sélectionner

XIncludeFile "gDrawing.pbi"

Procedure DrawLine(x, y, angle, Lenght, Thickness=2, Color=$FF000000)  
  gSetPen(Color,Thickness)
  gLineXY(x, y, x+Cos(Radian(Angle))*Lenght, y+Sin(Radian(Angle))*Lenght)
EndProcedure  

gInit()

OpenWindow(0, 0, 0, 800, 600, "DrawLine", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateImage(0, 800, 600)
gStartDrawing(ImageOutput(0))
gDrawingMode(#PB_2DDrawing_Outlined)

Box(0, 0, 800, 600, RGB(255, 255, 255))

DrawLine(10, 300, -45, 200, 5, RGBA(255, 0, 0, 255))
DrawLine(10, 300, 45, 200, 5, RGBA(255, 0, 0, 255))

gStopDrawing() 
ImageGadget(0, 0, 0, 200, 200, ImageID(0))

gEnd()

Repeat : Until WaitWindowEvent(100) = #PB_Event_CloseWindow

Re: Rotation ligne

Publié : jeu. 28/août/2014 14:58
par Ollivier
@Falsam

Bonjour, je me suis souvenu de ce post:
http://www.purebasic.fr/french/viewtopic.php?f=3&t=8551

LSI avait une méthode particulièrement simple d'aborder la technique, optimisable et surtout légère: c'est du code, pas des libs. Je n'ai pas la possibilité de remettre à jour actuellement.

C'est plus un hommage à cette personne, n'ayant plus de nouvelles depuis longtemps maintenant.

Re: Rotation ligne

Publié : jeu. 28/août/2014 15:19
par G-Rom
@microdevweb

Pour faire tourner un point selon un angle , c'est simple :

Code : Tout sélectionner

Rotation_x = centre + distance * cos( degrés * # PI / 180 )
Rotation_y = centre + distance * sin( degrés * # PI / 180 )
Si tu fait 360x cela , tu obtiens un cercle de rayon "distance" à la position "centre" ;)

Re: Rotation ligne

Publié : jeu. 28/août/2014 15:32
par microdevweb
Merci à tous pour vos réponse :lol: