2012-03-10 1 views
2

Fondamentalement, je veux dessiner un cercle en utilisant des graphiques, mais au lieu d'utiliser des entiers pour le positionner, je voudrais utiliser des valeurs doubles à la place.Comment dessiner un cercle, le positionnant à une valeur double au lieu d'un int?

Idéalement:

g.drawOval(0.5, 0.5, 50, 50); 

Toute aide est grandement appréciée! Merci d'avance! Merci pour toute l'aide des gars, mais j'ai imaginé un moyen de sortir, ma variable dy a été fixée à 1, donc si je voulais dx à la moitié de celle de dy, ce serait impossible, à la place je viens de changer dy à 2 et dx à 1! Folie moi!

+0

Vous ne pouvez pas faire cela. Les valeurs x et y sont des positions de pixels et vous ne pouvez pas avoir quelque chose comme un demi-pixel. Si vous fournissez 0.5 à cette fonction, il sera tronqué à 0 (ce qui peut nécessiter une conversion en int). –

+0

Merci pour la réponse rapide! Ok alors, fondamentalement, je veux un ovale à se déplacer vers le bas à un angle qui n'est pas 0,45, ou -45 degrés. Est-ce qu'il y a un moyen de faire ça? – hazard1994

Répondre

3

La seule façon valide de procéder est d'utiliser une forme Ellipse2D.Double et de la passer à la méthode draw(Shape) d'une instance Graphics2D. Pour les meilleurs résultats, activez l'anti-aliasing:

public void yourDrawingMethod(Graphics gg) 
{ 
    /* Cast it to Graphics2D */ 
    Graphics2D g = (Graphics2D) gg; 

    /* Enable anti-aliasing and pure stroke */ 
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); 

    /* Construct a shape and draw it */ 
    Ellipse2D.Double shape = new Ellipse2D.Double(0.5, 0.5, 50, 50); 
    g.draw(shape); 
} 

Vous pouvez utiliser Graphics2D.fill(Shape) aussi bien.

+0

Merci! C'est utile! – hazard1994

+0

Ceci est sur la bonne voie, mais ne suffit pas. Voir ma réponse ici, y compris une image agrandie: http://stackoverflow.com/a/31221395/1143274 –

+0

@EvgeniSergeev: Merci, je ne savais pas, +1 :) –

-1

Si vous voulez un mouvement continu, alors le meilleur moyen est de garder x et y dans double variables. Comme l'objet se déplace, les variables seront incrémenter à des vitesses différentes (en fonction de l'angle), puis vous pouvez simplement jeter à ints ...

Et vous obtiendrez des positions:
< 0, 0,999>: 0
< 1, 1,999>: 1
< 2, 2,999>: 2
< 3, 3,999>: 3
etc ..

Pour un mouvement suffisamment longue, il semblera fluide. Mais les positions doivent être des valeurs entières, parce que vous êtes liés par la technologie. Vous ne pouvez pas afficher quelque chose à 0,3 pixels. Vous avez ou non le pixel, vous ne pouvez pas en avoir seulement 0.3.

+0

hmm, légèrement confus, mais son m'a donné une idée! Y at-il un moyen de déplacer l'ovale d'un pixel à gauche pour toujours 3 vers le bas – hazard1994

+2

Vous ne pouvez pas utiliser Java, vous voulez dire. La précision du sous-pixel existe depuis longtemps, en fait ... – 6502

+0

Non, dans Swing, ce n'est pas possible. –