Seite 1 von 2

ProgressCircle (for Linux/Windows & Mac.... evtl. ))

Verfasst: 12.03.2008 15:44
von walker
hier eine Kleinigkeit, die ich für mich selbst gebraucht habe..
ein klein wenig Mathe und 2D Drawing... fertig .. und das Beste.. es ist crossplattform :cool:

ein screenshot:
Bild

und hier der source:

Code: Alles auswählen

; ProgressCircle
; 2008 by walker
; free for everyone and any purposes
; enhancements made by others must be published and posted in the same PB-Forum ;-)
;--------------------------------------------


Procedure ProgressCircle(number.l,x.l,y.l,size.l,segments.l,fg.l,bg.l)
    img=CreateImage(0,size,size)
    StartDrawing(ImageOutput(0))
    FillArea(0,0,1,bg)
    Circle(size/2,size/2,size/2,fg)
    Circle(size/2,size/2,size/2-10,bg)    
    t2=(segments/4);steps 
    t3=size/t2; width per step
    For n = 0 To t2
        LineXY(n*t3,0,size-(n*t3),size,bg)     
        LineXY(size,n*t3,0,size-(n*t3),bg)             
    Next
    StopDrawing()
    ImageGadget(number,x,y,size,size,ImageID(0))
EndProcedure

Procedure SetProgressCircleState(progressbar.l,segments.l, state.l, text.s , color.l, bg.l)
LoadFont(0,"sans",8)
StartDrawing(ImageOutput(0))

If text.s<>""
    BackColor(bg)
    DrawingFont(FontID(0))
    DrawText(ImageWidth(0)/2-(TextWidth(text)/2)-4,(ImageWidth(0)/2-5),"       ")
    DrawText(ImageWidth(0)/2-(TextWidth(text)/2),(ImageWidth(0)/2-5),text)
EndIf   
t2=(segments/4)
t3=ImageWidth(0)/t2
size=ImageWidth(0)

beta.d=(360/segments)*(state)
beta_h.d=(360/segments)/2
beta=beta-beat_h-90
x=ImageWidth(0)/2
y=ImageWidth(0)
cx=ImageWidth(0)/2
cy=ImageWidth(0)/2
r=ImageWidth(0)/2
r-3

beta_in_rad.d=(beta/180)*#PI
x1 = cx+r * Cos(beta_in_rad);
y1 = cy+r * Sin(beta_in_rad);

FillArea(x1,y1,bg,color)
StopDrawing()
SetGadgetState(progressbar,ImageID(0))

While WindowEvent():Wend
ProcedureReturn 1
EndProcedure

;---- DEMO -----<

bg=$D2D8C3; backgroundcolor
fg=$AAB68F; initial color of the circle
stp=12; values  4 , (8,9,10 = 10); 12; 18; 22; 28 for other values the drawing procedure must be changed (and I have no time at present)
size=50;20 is minimum;  maximum... your screen ;-)

Da der Rest Unsinn war... müsst Ihr Euch nun selbst was ausdenken....

END
Es ist noch viel Raum für Verbesserungen (z.B. die Werte für den Kreis,, nicht alle führen zu dem gewünschten Ergebnis.. dafür muß die Drawing-Procedure etwas angepasst werden (die Berechnung) aber dafür habe ich momentan keine Zeit...)

Viel Spaß damit!

Verfasst: 12.03.2008 15:54
von RSBasic
@walker
Dein ProgressCircle wird nach einigen Sekunden schwarz.

Verfasst: 12.03.2008 16:05
von Kaeru Gaman
bei mir erst im letzten durchlauf, allerdings halte ich diesen abschnitt für problematisch:

Code: Alles auswählen

        r=Random(255)-50
        g=Random(255)-100
        b=Random(255)-200
das ist der falsche weg, zufallszahlen für farbkanäle zu erzeugen.
b wird eine zahl zwischen -200 und +55 werden, und damit mit 78%iger wahrscheinlichkeit negativ.
das ist für einen farbkanal ungeeignet.

Verfasst: 12.03.2008 16:13
von walker
:freak: ...... ist doch nur 'ne DEMO..... das die Zahlen negativ werden können, ist schon klar.... /:->

Verfasst: 12.03.2008 16:16
von Kaeru Gaman
ja tschuldige n paar mal....
unsinn gecoded ist unsinn gecoded, ob demo oder fisch....

Verfasst: 12.03.2008 16:16
von walker
sonst alles klar?

Verfasst: 12.03.2008 16:17
von Kaeru Gaman
erweckt halt den eindruck, als ob du mit Random nicht umgehen kannst.

Verfasst: 12.03.2008 16:30
von walker
:evil: meinen Eindruck verkünde ich jetzt besser nicht... :evil:

da es für die Demo egal war ob die Farbe schwarz, grau oder sonstwas ist, war mir auch eine negative Zahl egal... :shock:

Verfasst: 12.03.2008 19:46
von PMV
Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein
Dieser Forenteil wird auch von Anfängern genutzt ... und wenn diese so
etwas sehen, wird es von denen falsch übernommen und dann wundern die
sich. Wie von Kaeru Gaman angesprochen, ist die nutzung in deinem Code
nicht unbedingt optimal ... und das ändern sollte ja wohl kein Problem sein.

Und unfreundlichkeit wird hier nicht gern gesehen ... auch wenn das
manchmal den anschein hat /:->

MFG PMV

Verfasst: 12.03.2008 19:58
von Kaeru Gaman
ich seh jetzt erst, dass er schon um 15:19 den strittigen teil einfach rausgenommen hat...
is ja auch nich die feine englische...
jetzt steht das teil ohne demo da

also, hier ist noch mal der komplette code, die verbesserte version wie sie im englischen forum steht:

Code: Alles auswählen

; ProgressCircle
; 2008 by walker
; free for everyone and any purposes
; enhancements made by others must be published and posted in the same PB-Forum ;-)
;--------------------------------------------


Procedure ProgressCircle(number.l,x.l,y.l,size.l,segments.l,fg.l,bg.l)
    img=CreateImage(0,size,size)
    StartDrawing(ImageOutput(0))
    FillArea(0,0,1,bg)
    Circle(size/2,size/2,size/2,fg)
    Circle(size/2,size/2,size/2-10,bg)   
    t2=(segments/4);steps
    t3=size/t2; width per step
    For n = 0 To t2
        LineXY(n*t3,0,size-(n*t3),size,bg)     
        LineXY(size,n*t3,0,size-(n*t3),bg)             
    Next
    StopDrawing()
    ImageGadget(number,x,y,size,size,ImageID(0))
EndProcedure

Procedure SetProgressCircleState(progressbar.l,segments.l, state.l, text.s , color.l, bg.l)
LoadFont(0,"sans",8)
StartDrawing(ImageOutput(0))

If text.s<>""
    BackColor(bg)
    DrawingFont(FontID(0))
    DrawText(ImageWidth(0)/2-(TextWidth(text)/2)-4,(ImageWidth(0)/2-5),"       ")
    DrawText(ImageWidth(0)/2-(TextWidth(text)/2),(ImageWidth(0)/2-5),text)
EndIf   
t2=(segments/4)
t3=ImageWidth(0)/t2
size=ImageWidth(0)

beta.d=(360/segments)*(state)
beta_h.d=(360/segments)/2
beta=beta-beat_h-90
x=ImageWidth(0)/2
y=ImageWidth(0)
cx=ImageWidth(0)/2
cy=ImageWidth(0)/2
r=ImageWidth(0)/2
r-3

beta_in_rad.d=(beta/180)*#PI
x1 = cx+r * Cos(beta_in_rad);
y1 = cy+r * Sin(beta_in_rad);

FillArea(x1,y1,bg,color)
StopDrawing()
SetGadgetState(progressbar,ImageID(0))

While WindowEvent():Wend
ProcedureReturn 1
EndProcedure

;---- DEMO -----<

bg=$D2D8C3; backgroundcolor
fg=$AAB68F; initial color of the circle
stp=12; values  4 , (8,9,10 = 10); 12; 18; 22; 28 for other values the drawing procedure must be changed (and I have no time at present)
size=50;20 is minimum;  maximum... your screen ;-)

OpenWindow(0,0,0,210,210,"ProgressCircle DEMO")
CreateGadgetList(WindowID(0))
ProgressCircle(0,70,70,size,stp,fg,bg)

r=10
g=150
b=10
count=0
Repeat
    For m= 1 To stp
        SetProgressCircleState(0,stp,m,"",RGB(r, g, b),bg)
        Delay(100)
    Next
    count+1
    r+20
    g+20
    b+10
    If r >240 Or g>240 Or  b>240
        r=Random(255)
        g=Random(255)
        b=Random(255)
    EndIf
Until WaitWindowEvent(1)=#PB_Event_CloseWindow Or count=10
End