linexy avec Epaisseur

Partagez votre expérience de PureBasic avec les autres utilisateurs.
spirit
Messages : 3
Inscription : sam. 28/juin/2008 7:20

linexy avec Epaisseur

Message par spirit »

la procedure s'appel " ligne(x1,y1,x2,y2,Epaisseur,coleur)
il permet de tracer une ligne toute en controlant l'epaisseur
voila un exemple qui l'illustre:

presser space pour ajouter un point .(Nb la procedure est gourmente)

Code : Tout sélectionner


;-----------spirit--------------------
Procedure.f angle(x1.f,y1.f,xc.f,yc.f)
t.f
r.f=Sqr(Pow(x1-xc,2)+Pow(y1-yc,2))
If y1>yc
If x1>=xc:t=ACos((x1-xc)/r):EndIf
If xc>=x1:t=ACos((xc-x1)/-r):EndIf
EndIf
If yc>y1
If x1>xc:t=-ACos((x1-xc)/r):EndIf
If xc>=x1:t=-ACos((xc-x1)/-r):EndIf
EndIf
If yc=y1
If x1>=xc:t=0:EndIf
If xc>x1:t=-#PI:EndIf
EndIf
ProcedureReturn t
EndProcedure
Procedure ligne(x1.f,y1.f,x2.f,y2.f,ep,c.f)
 
re.f=Sqr(Pow(x1-x2,2)+Pow(y1-y2,2))
te.f=angle(x1.f,y1.f,x2.f,y2.f)
For r=0 To Abs(re) Step 2
xp.f=x2+(r*Cos(te))
yp.f=y2+(r*Sin(te))
Circle(xp,yp,ep,c)
Next
 EndProcedure
Macro add()
 If KeyboardReleased(#PB_Key_Space)
 AddElement(p())
 p()\x=xm:p()\y=ym
 EndIf
 EndMacro
Structure point
x.f
y.f
EndStructure
NewList p.point()
InitSprite():InitKeyboard():InitMouse()
#width=800
#hight=600
OpenWindow(0, 216, 0, #width,#hight, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar )
OpenWindowedScreen(WindowID(0),0,0,#width,#hight,1,0,0)
Repeat
FlipBuffers():ExamineMouse():ExamineKeyboard():ClearScreen(0)
xm=MouseX():ym=MouseY():add()
StartDrawing(ScreenOutput())
ForEach p()
If NextElement(p()):x1=p()\x:y1=p()\y:PreviousElement(p()):EndIf
ligne(x1,y1,p()\x,p()\y,4,255)
Next
Circle(xm,ym,5,255)
StopDrawing()
 Until WaitWindowEvent()=#PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)

 
 
 
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

...................
Dernière modification par Backup le sam. 19/mars/2011 18:41, modifié 1 fois.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Salut Spirit,

Pas mal ton truc. Par contre, je me suis permis juste 3 petites modifs.

1) J'ai fait respirer ton code source un peu parce moi, je ne sais pas comment vous faîtes, vous bossez comme moi il y a 15 ans ! On a des superbes outils aujourd'hui. On peut faire des belles indentations, passer des lignes tout ça. Alors j'ai tout posé ligne par ligne et mis en indentation. C'est tellement plus agréable ! En plus, ça permet de voir que tu t'attaches au modulaire. Résultat : continue comme ça, tu vas faire des bonds de joie dans quelques mois !!! T'es bien parti !

2) J'ai un petit souci à un bras alors j'ai ajouté le clic gauche pour faire l'équivalent de la touche espace. Comme ça tout est dispo d'une seule main avec la souris!

3) J'ai rajouté l'option de la molette pour modifier l'épaisseur. Je te laisse l'honneur de mettre les sécurités mini et maxi.

Et puis enfin je voulais te dire que t'es comme moi : tu te trompes parfois de topic. T'as mis ça dans les jeux ! ! !

Pour un tel sujet, poste plutôt en discussion générale, par exemple.
Je te rassure, j'en ai fait des carrément pire. Le pauvre Dobro, il a droit à son quotas avec moi !

Allez bon courage ! Bonne bourre ! Que du bonheur !

Code : Tout sélectionner

;-----------spirit-------------------- 

Procedure.f angle(x1.f, y1.f, xc.f, yc.f) 

  t.f 
  r.f=Sqr(Pow(x1-xc,2)+Pow(y1-yc,2)) 

  If y1>yc 
    If x1>=xc:t=ACos((x1-xc)/r):EndIf 
    If xc>=x1:t=ACos((xc-x1)/-r):EndIf 
  EndIf 

  If yc>y1 
    If x1>xc:t=-ACos((x1-xc)/r):EndIf 
    If xc>=x1:t=-ACos((xc-x1)/-r):EndIf 
  EndIf 

  If yc=y1 
    If x1>=xc:t=0:EndIf 
    If xc>x1:t=-#PI:EndIf 
  EndIf 

  ProcedureReturn t 

EndProcedure 

Procedure ligne(x1.f,y1.f,x2.f,y2.f,ep,c.f) 
  
  re.f=Sqr(Pow(x1-x2,2)+Pow(y1-y2,2)) 
  te.f=angle(x1.f,y1.f,x2.f,y2.f) 
  For r=0 To Abs(re) Step 2 
    xp.f=x2+(r*Cos(te)) 
    yp.f=y2+(r*Sin(te)) 
    Circle(xp,yp,ep,c) 
  Next 

EndProcedure 

Macro add() 

  If KeyboardReleased(#PB_Key_Space) Or Bm
    AddElement(p()) 
    p()\x=xm:p()\y=ym 
  EndIf 

EndMacro 
 
NewList p.point() 
InitSprite()
InitKeyboard()
InitMouse() 
#width = 800 
#hight = 600 
OpenWindow(0, 216, 0, #width, #hight, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar ) 
OpenWindowedScreen(WindowID(0), 0, 0, #width, #hight, 1, 0, 0) 
Epaisseur = 4
Repeat 

  FlipBuffers()
  ExamineMouse()
  ExamineKeyboard()
  ClearScreen(0)
   
  xm = MouseX()
  ym = MouseY()
  bm = MouseButton(1)
  Epaisseur + MouseWheel()
  add() 
  StartDrawing(ScreenOutput()) 
    ForEach p() 
      If NextElement(p() ): x1 = p()\x: y1 = p()\y
        PreviousElement(p())
      EndIf
      ligne(x1, y1, p()\x, p()\y, Epaisseur, 255) 
    Next 
    Circle(xm, ym, 5, 255) 
  StopDrawing() 

Until WaitWindowEvent() = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape) 

spirit
Messages : 3
Inscription : sam. 28/juin/2008 7:20

Message par spirit »

*Merci dobro pour le code de comtois , je ne l’avais pas vue avant ,en tout cas son algorithme et bien plus rapide que le mien.

*et merci aussi olivier tes mots sont vraiment moralisant,(la prochaine fois je vais pensé a mettre les choses dans leur plaçes.)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

sujet deplacé dans Trucs et astuces ;)
Répondre