Einen leeren Kreis zeichnen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Hubsi

Betreff: Einen leeren Kreis zeichnen

BeitragSa, Okt 08, 2016 12:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Schönen guten Tag.

Ich experimentiere gerade mit DrawOval herum und komme nicht drauf (sofern überhaupt möglich) wie ich einen Kreis zeichnen kann der nicht gefüllt ist. Für das aktuelle "Max-mal-ausprobieren" ist es gerade egal, da ich den Kreis eh gefüllt brauche, aber zu wissen wie es machbar ist schadet ja nix Very Happy Das Äquivalent in B3D dazu ist Oval x,y,width,height,filled
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

FireballFlame

BeitragSa, Okt 08, 2016 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Angenommen, du sprichst von Max2D:
Ich glaube, es gibt da tatsächlich keine Funktion. Falls du nur einfarbigen Hintergrund hast, kannst du etwas kleinere Oval in der Hintergrundfarbe obendrauf zeichnen; falls du nur Ovale in festen Größen brauchst, kannst du sie so in ein Image (erstellt mit MASKEDIMAGE-Flag) zeichnen und dann dieses benutzen. Ansonsten müsstest du dir das wohl selbst was basteln.
Alternativ könntest du dir Ava.Gfx anschauen. Unterstützt zwar nur OpenGL und eignet sich für pixelgenaues Zeichnen nicht so gut, ist aber eine deutlich mächtigere Engine als Max2D und dabei auch nicht schwieriger zu benutzen.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

BladeRunner

Moderator

BeitragSa, Okt 08, 2016 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt unter Max2D in der Tat keine ungefüllten Primitives, traurig aber wahr.
Ich würde auch zu kleineres Innenoval reinrendern tendieren, auch wenn das in Teilen Fehlerbehaftet ist.
Ansonsten hilft Bresenham, da Plot aber grottenlahm ist würde ich das nur einmal in eine Pixmap rendern und die dann einzeichnen.
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

Hubsi

BeitragSa, Okt 08, 2016 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun gut, vielen Dank Smile Dann muss ich bedarfsweise selbst was zusammenbasteln wenn ich das mal brauche Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

nX^

BeitragSo, Okt 09, 2016 11:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte das gleiche Problem auch irgendwann mal. Ich hatte mir hiermit beholfen, auch wenn es nicht unbedingt das gelbe vom Ei ist...

BlitzMax: [AUSKLAPPEN]
Function DrawCircle(x:Int ,y:Int ,r:Int)
r = r/2
For Local i:Int = 0 To 359
DrawLine x + Sin(i) * r, y + Cos(i) * r, x + Sin(i + 1) * r, y + Cos(i + 1) * r
Next
End Function

BladeRunner

Moderator

BeitragSo, Okt 09, 2016 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe mir grade mal erlaubt den Bresenham aus der Wikipedia umzubasteln, als Grundlage:
BlitzMax: [AUSKLAPPEN]

SuperStrict
Graphics 640 , 480
Local x:Float = 1,y:Float=1

Repeat
Cls
ellipse(100 , 100 , x, y)
x:+ .1
y:+ .2

Flip
Until KeyHit(key_escape)


Function ellipse(xm:Int,ym:Int,a:Int,b:Int)

Local dx:Int = 0 , dy:Int = b
Local a2:Int = a * a , b2:Int = b * b

Local err:Int = b2 - (2 * b - 1) * a2 , e2:Int


Repeat
Plot(xm+dx, ym+dy)'; /* I. Quadrant */
Plot(xm-dx, ym+dy)'; /* II. Quadrant */
Plot(xm-dx, ym-dy)'; /* III. Quadrant */
Plot(xm+dx, ym-dy)'; /* IV. Quadrant */

e2 = 2*err
If (e2 < (2 * dx + 1) * b2) Then
dx:+ 1
err:+ (2 * dx + 1) * b2
EndIf
If (e2 > - (2 * dy - 1) * a2) Then
dy:- 1
err :- (2 * dy - 1) * a2
EndIf
Until (dy < 0)

While (dx < a)
dx:+1
Plot(xm+dx, ym)
Plot(xm-dx, ym)
Wend
EndFunction
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

Hubsi

BeitragSo, Okt 09, 2016 12:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Frage interessehalber, Du verwendest DrawLine nx^. Ist das schneller als Plot wie es BladeRunner benutzt?
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

FireballFlame

BeitragSo, Okt 09, 2016 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein. Die Idee dahinter ist wahrscheinlich, dass man die Schrittweite der Schleife erhöhen könnte, um etwas weniger runde, dafür aber schnellere Kreise zu zeichnen. Trotzdem ist das um ein Vielfaches langsamer als Blades Variante - welche bei besonders großen Ellipsen allerdings Probleme bekommt.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

BladeRunner

Moderator

BeitragSo, Okt 09, 2016 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Interessant, welche Werte hast Du da genommen? Das würd ich gern mal unter die Lupe nehmen.
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

FireballFlame

BeitragSo, Okt 09, 2016 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ausreichende Fenstergröße (1200x800) und "x=MouseX()+1 y=MouseY()+1", dann einfach die Maus Richtung unten rechts bewegen. Ohne das "+1" geht es übrigens auch nicht gut, dann hängt es sich auf Razz
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

BladeRunner

Moderator

BeitragSo, Okt 09, 2016 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]

SuperStrict
Graphics 1200 , 800
Local x:Int = 1,y:Int=1

Repeat
Cls
ellipse(100 , 100 , x, y)
x=MouseX()
y=MouseY()
DrawText x+":"+y,0,0
Flip
Until KeyHit(key_escape)


Function ellipse(xm:Int,ym:Int,a:Int,b:Int)

Local dx:Int = 0 , dy:Int = b
Local a2:Long = a * a , b2:Long = b * b


Local err:Long = b2 - (2 * b - 1) * a2 , e2:Long
If (a=0) Or (b=0) Return


Repeat
Plot(xm+dx, ym+dy)'; /* I. Quadrant */
Plot(xm-dx, ym+dy)'; /* II. Quadrant */
Plot(xm-dx, ym-dy)'; /* III. Quadrant */
Plot(xm+dx, ym-dy)'; /* IV. Quadrant */

e2 = 2*err
If (e2 < (2 * dx + 1) * b2) Then
dx:+ 1
err:+ (2 * dx + 1) * b2
EndIf
If (e2 > - (2 * dy - 1) * a2) Then
dy:- 1
err :- (2 * dy - 1) * a2
EndIf
Until (dy < 0)

While (dx < a)
dx:+1
Plot(xm+dx, ym)
Plot(xm-dx, ym)
Wend
EndFunction


Okay, gefixt.
Die 0en werden nun abgefangen und der Bereich der Fehlervariable wurde auf long erhöht. Der Fehler sprengt nämlich in der Tat die Grenze eines Integers und führt so zu einem Überlauf.
Mit den lLongs sollte für alle handelsüblichen Anwendungen nun Friede eingekehrt sein.
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

Thunder

BeitragMo, Okt 10, 2016 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finde, dass es wert wäre eine Lösung für dieses Problem, das ich auch gut kenne, in BlitzMax zu integrieren.
Deswegen habe ich versucht, das auf Grafiktreiberbasis zu implementieren.
Meine Versionen von glmax2d, d3d7max2d und d3d9max2d können jetzt nichtgefüllte Ovale zeichnen.
DrawRect kann jetzt auch nichtgefüllte Rechtecke malen, aber das ist generisch über DrawLine gelöst.

Meine Änderungen: https://github.com/chtisgit/bl...3eff1218a1
ZIP-Archiv (geänderte Dateien): https://www.blitzforum.de/upload/file.php?id=13184
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group