[Java] Cirkel tekenen m.b.v. drawOval

Pagina: 1
Acties:
  • 175 views sinds 30-01-2008
  • Reageer

  • eborn
  • Registratie: April 2000
  • Laatst online: 20-08 15:45
Ik probeer in Java een cirkel op een Graphics2D object te tekenen. Hiervoor maak ik gebruik van de drawOval methode. In principe spreekt het allemaal voor zich, maar de resulterende cirkel is gewoonweg niet om aan te zien.

Afbeeldingslocatie: http://www.fambus.nl/~ebus/javacirkel.png

Deze cirkel maak ik via:

code:
1
g.drawOval( firstSel.x*gridSize-4, firstSel.y*gridSize-4, 7, 7 );


Is dit een bekende bug in Java of kan Java gewoon geen betere cirkels tekenen? Het vergroten van de straal heeft ook niet echt veel effect. Is er misschien een andere manier (buiten het zelf schrijven van een cirkel-functie) voor het correct tekenen van een simpel rondje :+ Ik kan me namelijk niet voorstellen dat dit geaccepteerd wordt ;)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Heb je dat "rode" er zelf omheen gekalkt of moet dat die cirkel voorstellen? Tjeez, als dat die cirkel is... :+

Welke code staat er om heen (om die ene regel)???

[ Voor 25% gewijzigd door RobIII op 14-02-2003 02:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

je wou toch echt niet zeggen dat dat rode iets eromheen gegenereerd wordt door de functie drawoval??? als dat zo is, dan kan sun toch echt beter ff helemaal opnieuw beginnen, met dit keer een rekenmachine ernaast..

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Whahahahahaha :D
* kenneth proest het hier uit van het lachen

code:
1
g.drawOval( firstSel.x*gridSize-4, firstSel.y*gridSize-4, 7, 7 );
Probeer 'ns met harde waarden een cirkeltje te tekenen? En klopt je berekening wel? Een g.drawString("x-waarde: " + firstSel.x * gridSize-4, 0, 0); om de waarde te controleren?

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
die code kan haast niks mis mee zijn, eerste twee params leveren de upper left corner op en de laatste twee en width en height, en aangezien deze hetzelfde zijn dus een cirkel...
kan het niet liggen aan de grootte van de cirkel, probeer 'm eens groter te maken en dan te kijken of ie 'm nog steeds zo vervormd wordt. verder neem ik aan dat die eerste twee params wel goede waarden aannemen...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wheehehe wat een prutswerk :P
maar het lijkt me stug dat Sun niet gebruik maakt van het Bresenham cirkel alrogitme, of iets wat daarop lijkt. Als ze dat zouden doen dan ziet elk kwadrant van de cirkel er iig hetzelfde uit, en dat is hier niet het geval

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • eborn
  • Registratie: April 2000
  • Laatst online: 20-08 15:45
RobIII schreef op 14 February 2003 @ 02:56:
Heb je dat "rode" er zelf omheen gekalkt of moet dat die cirkel voorstellen? Tjeez, als dat die cirkel is... :+

Welke code staat er om heen (om die ene regel)???
Nee, dat rode is inderdaad de cirkel die door Java gemaakt wordt :) Die grijze puntjes ook, maar 1-pixelige puntjes kun je niet veel fout mee doen :P

Wel moet ik zeggen dat ik het cirkeltje hier (met PhotoShop) iets vergroot heb (vandaar ook de duidelijke witte randjes). Maar op normale grote ziet 't er ook niet uit :)

[ Voor 19% gewijzigd door eborn op 14-02-2003 15:02 ]


  • eborn
  • Registratie: April 2000
  • Laatst online: 20-08 15:45
Da Snake schreef op 14 February 2003 @ 11:14:
die code kan haast niks mis mee zijn, eerste twee params leveren de upper left corner op en de laatste twee en width en height, en aangezien deze hetzelfde zijn dus een cirkel...
kan het niet liggen aan de grootte van de cirkel, probeer 'm eens groter te maken en dan te kijken of ie 'm nog steeds zo vervormd wordt. verder neem ik aan dat die eerste twee params wel goede waarden aannemen...
Klopt, en die waardes zijn wel goed (hij komt namelijk wel op de juiste plek te staan). Het vergroten van de cirkel heeft niet echt veel effect, ik zal zo even een nieuw plaatje posten.

Afbeeldingslocatie: http://www.fambus.nl/~ebus/javacirkel2.png

Zoals je ziet is deze iets beter, maar voor zo'n omvang (30, 30) vindt ik het nog steeds geen cirkel. Meet een gladde zeshoek.

Ik heb ook nog gekeken of ik soms naderhand een verkleining/vergroting deed, waardoor er was dingen wegvallen. Maar tot zover heb ik niets kunnen vinden.

[ Voor 11% gewijzigd door eborn op 14-02-2003 14:56 . Reden: 2e plaatje ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat ziet er idd meer uit als een polygoon dan een cirkel. Heb je toevallig een transformatie op je Graphics2D object toegepast (met de functie transform)?

.edit: ik weet denk ik al wat het probleem is. Een Graphics2D object werkt met shapes, niet met expliciete pixels. Een shape is weer opgebouwd uit lijntjes.
Similarly, for draw operations, including drawLine, drawRect, drawRoundRect, drawOval, drawArc, drawPolyline, and drawPolygon, draw can now be called with the desired Shape. For example, when drawing a rectangle:
draw(new Rectangle(x, y, w, h));
En aangezien een Shape is opgebouwd uit lijnstukken krijg je dus zo'n extreem brakke cirkel, die waarschijnlijk als Polygon geimplemeteerd is. Je zou als oplossing een Polygon met heel veel lijnstukken of een viertal CubicCurve2D shapes kunnen gebruiken

[ Voor 69% gewijzigd door .oisyn op 14-02-2003 15:24 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • eborn
  • Registratie: April 2000
  • Laatst online: 20-08 15:45
.oisyn schreef op 14 February 2003 @ 15:10:
En aangezien een Shape is opgebouwd uit lijnstukken krijg je dus zo'n extreem brakke cirkel, die waarschijnlijk als Polygon geimplemeteerd is. Je zou als oplossing een Polygon met heel veel lijnstukken of een viertal CubicCurve2D shapes kunnen gebruiken
Ik had al naar die CubicCurve2D's gekeken. Nu maar eens kijken of ik ze ook kan implementeren :) Ik laat wel even een resultaatje zien :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
drawOval is gewoon oude meuk volgens mij. Hij is ook onderdeel van Graphics, niet van Graphics2D.

Als je even in de Java Tutorial over Java2D kijkt zie je prachtige voorbeelden van zaken die volgens mij wel goed werken:

Tutorial index:
http://java.sun.com/docs/books/tutorial/2d/index.html
http://java.sun.com/docs/...ial/2d/display/index.html

Specifiek:
http://java.sun.com/docs/...isplay/strokeandfill.html

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • eborn
  • Registratie: April 2000
  • Laatst online: 20-08 15:45
mbravenboer schreef op 14 February 2003 @ 17:51:
Als je even in de Java Tutorial over Java2D kijkt zie je prachtige voorbeelden van zaken die volgens mij wel goed werken
Ik gebruik nu de Ellipse2D.Double klasse, maar persoonlijk zie ik eigenlijk geen verschil. De voorbeelden die echter in de Tutorial getoond worden zien er veel beter uit. Misschien dat er toch iets anders mis gaat.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je kan nog een aantal zaken instellen, waaronder de rendering kwaliteit en anti-aliasing. Uit de tutorial bijvoorbeeld:
code:
1
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);


Als je even de demo ophaalt en draait kan je de verschillen op jouw machine zelf zien :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

mbravenboer schreef op 14 February 2003 @ 17:51:
drawOval is gewoon oude meuk volgens mij. Hij is ook onderdeel van Graphics, niet van Graphics2D.


lees even de quote in mijn vorige post die ik uit de java api docs heb gehaald. Daarin staat dus dat een call naar drawOval () wordt vertaald naar een call naar draw () met een specifieke Shape. En aangezien een Shape uit lijnstukken bestaat zit je dus met een niet pixel-correcte cirkel

Ook wel logisch, aangezien je een Graphics2D kunt transformeren. En dan werkt het bekende en alom geimplementeerde Bresenham cirkel teken-algoritme dus niet :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • eborn
  • Registratie: April 2000
  • Laatst online: 20-08 15:45
mbravenboer schreef op 14 February 2003 @ 20:07:
Je kan nog een aantal zaken instellen, waaronder de rendering kwaliteit en anti-aliasing. Uit de tutorial bijvoorbeeld:
Als je even de demo ophaalt en draait kan je de verschillen op jouw machine zelf zien :) .
Dat ziet er inderdaad beter uit :)

Afbeeldingslocatie: http://www.fambus.nl/~ebus/javacirkel3.png

Vreemd dat zoiets niet standaard aan staat, want zonder deze extra kwaliteitsinstellingen kun je amper praten over cirkels :P
Pagina: 1