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

( si par la même occasion quelqu'un a une idée...
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

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....