Page 1 sur 1

Fonction 2D (Arc de Cercle et PutPixel)

Publié : mar. 09/mai/2006 21:16
par Thyphoon
Je cherche une fonction rapide pour tracer un arc de cercle quelqu'un connait un algo ?
genre: ArcCercle(X,y, Rayon,Angle1, Angle 2, col)

J'ai fait une fonction pour tracé un point (mais je sais pas encore si elle est plus rapide que celle du Purebasic) mais j'ai un bug car la couleur change tout seul en fonction des coordées X et Y :o( si par la même occasion quelqu'un a une idée... :P

Code : Tout sélectionner

Procedure PutPixel(x.l,y.l, col.l) 
  Structure Pixel
    Pixel.l
  EndStructure
  Buffer      = DrawingBuffer()  
  Pitch       = DrawingBufferPitch()        
  PixelFormat = DrawingBufferPixelFormat()
  *Line.Pixel = Buffer + y * Pitch + x * PixelFormat; 
  *Line\Pixel = col; 
EndProcedure  

Publié : mar. 09/mai/2006 22:33
par Anonyme
J'ai fait des test de vitesse de dessins de pixel via plot() & l'écriture directe en mémoire, les 2 sont quif quif. la différence de vitesse joueraient avec point() a prioris.

Pour un arc de cercle utilise Sin/Cos

Voici pour un pixel :

X = OriginX + Rayon * Cos(Angle*2*3.1415/360)
Y = OriginY + Rayon * sin(Angle*2*3.1415/360)

le pixel s'affichera selont l'angle et le rayon, à toi de joué avec l'angle pour avoir un arc de cercle, à savoir que l'angle 0 est de la gauche vers la droite de l'écran.

Publié : mer. 10/mai/2006 6:29
par Thyphoon
Wouaaaaaaaa je suis trop nul en plus je le savais...Je sais pas pourquoi j'ai bloqué là dessus ...Pffffff...Merci en tout cas :D

Publié : mer. 10/mai/2006 8:07
par Dr. Dri
J'ai essayé en passant par le GDI de windows mais sans succès... La foncion Rectangle fonctionne mais pas l'AngleArc alors que le principe est le même...

Code : Tout sélectionner

Procedure IsDrawing()
  !extrn _PB_2DDrawing_GlobalStructure
  !MOV eax, [_PB_2DDrawing_GlobalStructure]
  ProcedureReturn
EndProcedure

Procedure Rectangle(left, top, right, bottom, Color = #PB_Default)
  If Color <> #PB_Default
    FrontColor(Color)
  EndIf
  
  ProcedureReturn Rectangle_(IsDrawing(), left, top, right, bottom)
EndProcedure

Procedure AngleArc(x, y, Radius, StartAngle.f, StopAngle.f, Color = #PB_Default)
  Protected SweepAngle.f
  
  If Color <> #PB_Default
    FrontColor(Color)
  EndIf
  
  SweepAngle = StopAngle - StartAngle
  ProcedureReturn AngleArc_(IsDrawing(), x,	y, Abs(Radius), StartAngle, SweepAngle)
EndProcedure

Width=200
Height=150 
If OpenWindow(0, 0, 0, Width, Height, "Circles", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CreateGadgetList( WindowID(0) )
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #WM_PAINT And StartDrawing( WindowOutput(0) )
      Rectangle(10, 10, 30, 20, #Blue)
      AngleArc(100,	75, 70, 45, 135, #Red)
      StopDrawing()
    EndIf
    
  Until  Event = #PB_Event_CloseWindow
EndIf
Dri :(

Publié : mer. 10/mai/2006 8:25
par Thyphoon
Dr. Dri a écrit :J'ai essayé en passant par le GDI de windows mais sans succès... La foncion Rectangle fonctionne mais pas l'AngleArc alors que le principe est le même...
Dri :(
Merci je vais étudier ton code voir....