VERFLUCHT

Status
Nicht offen für weitere Antworten.

Rock Lobster

Bekanntes Mitglied
Servus,

im Moment zeichne ich einen kleinen, weißen, ausgefüllten Kreis per g.fillOval() und darüber dann einen schwarzen Kreis-Umriß mit g.drawOval().

Die Koordinaten gebe ich exakt gleich an, daher erwarte ich eigentlich auch, daß der Umriß den Kreis komplett umschließt. Leider schaut rechts unten der Hintergrund (grau) ein wenig durch.

Kann es sein, daß für die Berechnung des Kreises also unterschiedliche Algorithmen verwendet werden? Oder mache ich etwas falsch, bzw. gibt's eine todsichere Möglichkeit, das Bild perfekt hinzukriegen? Der Kreis hat übrigens einen Durchmesser von 10 Pixel, gut möglich, daß das Problem bei größeren Kreisen nicht auftritt. Trotzdem dürfte es eigentlich beim kleinen Kreis auch nicht sein.



PS: Was soll denn dieser Unsinn? Der Titel darf aus Spamschutzgründen nicht 'fillOval und drawOval, unterschiedlicher Algorithmus?' sein! Hab den Titel bestimmt 10x geändert, bis es ging! Alle möglichen Dinge probiert, die Funktionsnamen weggelassen, das Wort "Algorithmus" weggelassen, nichts hat funktioniert. Daher sorry, daß es nur mit "VERFLUCHT" funktioniert hat.
 

20mithrandir

Aktives Mitglied
fillOval() und drawOval() sind anscheinend ein wenig unterschiedlicher implementiert, als man glauben möchte.

Versuche einmal das hier:

Code:
g.setColor( Color.BLACK );
g.fillOval( x, y, 10, 10 );
		
g.setColor( Color.WHITE );
g.fillOval( x+1, y+1, 8, 8 );

Ist es so etwas, was du machen wolltest?
 
S

SlaterB

Gast
also mit bisschen API-lesen der beiden Operationen sollte dir eine Möglichkeit zum Testen ja auf jeden Fall einfallen,
(ok, von 20mithrandir schon halb verraten, etwas logischer gehts noch, API lesen)

ein unterschiedlicher Algorithmus bleibt es dennoch,
der Rand ist die äußerste Menge an Pixeln,
gefüllt werden diese nur, wenn zu 50% zum Kreis dazugehörend (grob geschätzt ;) )
 

byte

Top Contributor
Schonmal getestet, wie es aussieht, wenn Du die aussenlinie etwas größer machst als die Füllung (1 Pixel mehr)?
 

Rock Lobster

Bekanntes Mitglied
Nee, wenn, dann müßte ich die Linie bzw. deren Umriß kleiner machen. Aber auch das wäre ja keine Garantie dafür, daß alles sauber schließt, besonders bei sehr kleinen Kreisen.
 
S

SlaterB

Gast
> Aber auch das wäre ja keine Garantie dafür, daß alles sauber schließt, besonders bei sehr kleinen Kreisen.

wieso?
 

Rock Lobster

Bekanntes Mitglied
Naja, wenn die Algorithmen eh unterschiedlich sind, dann kann es sein, daß wenn der Umriß um 1 Pixel verkleinert wird, entweder innen unten rechts z.B. noch ein einziger Pixel durchschaut, oder daß der Umriß sogar schon zu klein ist, weil dann außen unten rechts ein Pixel von der Füllung noch rausschaut.
 
S

SlaterB

Gast
Quatsch, welche Vorstellung von unterschiedlichen Algorithmen hast du denn?

meine (nicht-bewiesene) Theorie zumindest macht Fehler unmöglich,
jeder Pixel liegt entweder außerhalb des Kreises, auf dem Rand oder zu 100% im Kreis,
alles ist also klar definiert
 

Rock Lobster

Bekanntes Mitglied
Jo gut, ich hab mir über die genauen Algorithmen ehrlich gesagt keine Gedanken gemacht, ich weiß nur, daß es halt immer sehr popelig ist, wenn man mehrere Kreise übereinander zeichnen will, und das auf sehr kleiner Fläche. Gut möglich, daß es also funktionieren würde, aber mir zumindest erscheint die Möglichkeit von 20mithrandir irgendwie "sicherer" ;)
 
S

SlaterB

Gast
ja genau, die meine ich ja auch und byte auch, welche sonst? ;)

aber achte darauf, dass du nur einen Pixel mehr nimmst, zwei wäre schlecht
 

Rock Lobster

Bekanntes Mitglied
Achso nein, ich dachte jetzt, einfach die original-Methode zu benutzen (also Füllung und Umriß getrennt als solche zeichnen), aber den Durchmesser vom Umriß um 1 Pixel verkleinern ;)
 
S

SlaterB

Gast
ah ok, 20mithrandir meint 2x füllen, das ist auch schlecht,
also ich meine jedenfalls


g.setColor( Color.WHITE );
g.fillOval( x, y, 10, 10 );


g.setColor( Color.BLACK );
g.drawOval( x, y, 11, 11 );

bzw. mit 9 und 10

das läuft (bis zum Aufzeigen des Gegenbeispiels ;) )
 

Rock Lobster

Bekanntes Mitglied
Okay hast recht, das funktioniert - aber nur mit 9 bzw. eben mit "1 Pixel kleiner als vorher" (hab meine Kreisgröße variabel und aus optischen Größen ist sie momentan 12 - da dies nun aber total bescheuert aussieht (liegt natürlich nicht an Dir :) ), hab ich sie nun auf 13 erhöhen müssen. Und das ist mir zu ungerade, daher nehme ich dann doch wieder die mit 2x füllen, und die ist zumindest in meinem Fall auch nicht "schlecht", so wie Du sagst).
 
S

SlaterB

Gast
ja, ich hänge immer etwas hinterher, mit dem +1 für Mittelpunkt wirds korrekt,

aber schön sieht so ein fill-Kreis bei 10 Pixeln doch nicht aus,
habs mir ja in der Vergrößerung angesehen, drawRect macht die deutlich runderen Kreise ;)
 

Rock Lobster

Bekanntes Mitglied
Da das Thema "Kreise" nun so langsam seine Kreise gezogen hat, würde ich dann aber ganz gerne noch auf das hier zu sprechen kommen:

Rock Lobster hat gesagt.:
PS: Was soll denn dieser Unsinn? Der Titel darf aus Spamschutzgründen nicht 'fillOval und drawOval, unterschiedlicher Algorithmus?' sein! Hab den Titel bestimmt 10x geändert, bis es ging! Alle möglichen Dinge probiert, die Funktionsnamen weggelassen, das Wort "Algorithmus" weggelassen, nichts hat funktioniert. Daher sorry, daß es nur mit "VERFLUCHT" funktioniert hat.

Wie genau arbeitet dieser Spam-Filter? Meine Versuche hätten unterschiedlicher nicht sein können. Ein Versuch für die Titelleiste war sogar "Den Titel mußte ich aus Spamschutzgrünen ändern", hatte also weder mit Algorithmen noch mit Java-Funktionsnamen zu tun. Ist es möööglich, daß da irgendwas schief läuft? ???:L
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben