Kreis mit Writepixel(fast)

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

The_Nici

Betreff: Kreis mit Writepixel(fast)

BeitragMi, Jan 02, 2008 17:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

da "Oval()" zu langsam ist und nicht unter Lockbuffer() funktioniert, zeichne ich selber mit WritepixelFast Kreise. Nämlich so:
Code: [AUSKLAPPEN]

For pw=0 To 360
   For pl=-pinselradius To pinselradius
      WritePixelFast(Sin(pw)*(pinselradius+pl)+mx-360,Cos(pw)*(pinselradius+pl)+my,pixel)
   Next
Next


Nun, vergrössert man nun den Pinselradius gleicht der Kreis mehr einem Sieb.

Wie sollte ich den Kreis berechnen?

BladeRunner

Moderator

BeitragMi, Jan 02, 2008 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst für den Winkel eine Float nehmen und abhängig vom gewählten Radius die Schritte kleiner werden lassen, also anstatt 1° 0.1° oder 0.001°.
Ein wenig tüfteln tut da not um 'gute' Werte zu finden. Generell kannst Du dich am Kreisumfang orientieren.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

The_Nici

BeitragMi, Jan 02, 2008 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Das problem ist, dass nach einer bestimmten Grösse es zu lange dauert, um den Kreis zu zeichnen.
Gibt es eine andere Lösung mit Pi oder etwas ähnlichem?

BladeRunner

Moderator

BeitragMi, Jan 02, 2008 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir fällt auf anhieb nichts ein, ausser vielleicht einem vorberechneten und bei bedarf gescalten Kreis-Image.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

The_Nici

BeitragMi, Jan 02, 2008 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, danke trotzdem.
Muss ich wohl machen. Smile

Eingeproggt

BeitragMi, Jan 02, 2008 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine eigene Oval-Routine wie von the_nici, die noch dazu bei größeren Kreisen wie ein Sieb ausschaut bzw ständiges Skalieren eines Kreis-Images soll schneller sein als Oval selbst? Shocked

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

The_Nici

BeitragMi, Jan 02, 2008 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Oval ist für ein Malprogramm ungeeignet.

Dazu kann ich mit Copyimage die Bilder in ein Array speichern und dann scalen, und sie dann aufrufen.
 

Dreamora

BeitragMi, Jan 02, 2008 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine andere Möglichkeit ist einen besseren Algo zu nehmen. Da empfehle ich Google nach den Bresenham Algorithmen zu befragen die für solche Dinge eine der wohl effizientesten Lösungen anbieten.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Eingeproggt

BeitragMi, Jan 02, 2008 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
ähm, ja.. also die Sache mit dem Scalen hab ich wohl grob misverstanden, also vergesst den Teil meines Codes. Aber den Vergleich von Oval und "oval2" halte ich für aussagekräftig:

(Wer es nicht ausführen will, warum auch immer: Oval erzeugt außerdem die schönsten Kreise und kann auch Ovale machen)

Code: [AUSKLAPPEN]
Graphics 800,600,0,2
SetBuffer BackBuffer()

DebugLog "Oval-Test"
time=MilliSecs()
For i=1 To 1000
   Oval 10,10,50,50
Next
Flip 0
DebugLog "Durchschnitt: "+((MilliSecs()-time)/1000.0)

DebugLog "WritePixelFast-Test"

Function oval2(x,y,d)
   For pw=0 To 360
      For pl=-d To d
         WritePixelFast(Sin(pw)*(d+pl)+x,Cos(pw)*(d+pl)+y,123456)
      Next
   Next
End Function

time=MilliSecs()
LockBuffer
For i=1 To 1000
   oval2(60,60,25)
Next
UnlockBuffer
Flip 0
DebugLog "Durchschnitt: "+((MilliSecs()-time)/1000.0)

DebugLog "Scale-Test"

kreis=CreateImage(20,20)
SetBuffer ImageBuffer(kreis)
Oval 0,0,20,20
SetBuffer BackBuffer()

time=MilliSecs()
For i=1 To 1000
   ResizeImage kreis,50,50
   DrawImage kreis,10,10
Next
Flip 0
DebugLog "Durchschnitt: "+((MilliSecs()-time)/1000.0)

WaitKey()
End

;Mein Ergebnis:
;Oval-Test
;Durchschnitt: 0.727
;WritePixelFast-Test
;Durchschnitt: 5.305
;Scale-Test
;Durchschnitt: 8.64
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

The_Nici

BeitragMi, Jan 02, 2008 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
"Oval" funktioniert hingegen zur Writepixelfast-Variante nicht unter Lockbuffer, und du kannst mit deinen Speedtests nix drann rütteln. Ist so.

@Dreamora: werd ich heute mal anschauen, der Wikipediaartikel ist schön ausführlich.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group