2016-11-29 3 views
1

Ich versuche, einen Kreis mit seinem Ursprung in der Mitte des Bildschirms zu ziehen:Zeichnung umkreise die manuelle Art und Weise in Java Rückkehr seltsames Ergebnisses

width = canvas.getWidth(); 
height = canvas.getHeight(); 

BufferStrategy bufferStrategy = canvas.getBufferStrategy(); 
if(bufferStrategy == null){//If bufferStrategy is not initialized yet 
    canvas.createBufferStrategy(3); 
    bufferStrategy = canvas.getBufferStrategy(); 
} 
Graphics graphics = bufferStrategy.getDrawGraphics(); 

public int[] pixels = new int[width * height]; 

int radius = height/6; 
for(int theta = 0; theta < 360; theta++){ 
    double rads = Math.toRadians(theta); 

    double x = (width/2) + (Math.cos(rads) * radius); 
    double y = (height/2) + (Math.sin(rads) * radius); 
    pixels[(int)(x + y * width)] = 0xFFFF00FF; 
} 

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
image.setRGB(0, 0, width, height, pixels, 0, width); 

graphics.drawImage(image, 0, 0, width, height, null); 

Aber ich bin ein seltsames Ergebnis zu erzielen:

Result

Danke für jede Hilfe!

+0

Können Sie ein [minimales, ** vollständiges ** und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) erstellen? Wo haben Sie zum Beispiel die 'graphics' Instanz? –

+0

@ToddSewell Fertig! –

+0

Sieht das Bild korrekt aus, wenn Sie "BufferedImage" in einer Datei speichern? (Versuchen Sie [dieses Tutorial] (https://docs.oracle.com/javase/tutorial/2d/images/saveimage.html) wenn Sie nicht wissen, wie) –

Antwort

2

Legen Sie Ihre x- und y-Werte in Ints um, bevor Sie die Berechnung durchführen, um herauszufinden, auf welchen der Pixel die Farbe geändert werden soll.

int x = (int) ((width/2) + (Math.cos(rads) * radius)); 
int y = (int) ((height/2) + (Math.sin(rads) * radius)); 
pixels[(x + y * width)] = 0xFFFF00FF; 

Dies zu tun, führte zu einigen Rundungsfehlern.

+0

Vielen Dank, Sir! –

0

Das Problem ist die Mathematik für die Indexierung in pixels Array. Die Formel x + y * width erwartet diskrete Werte für x und y. Wie auch immer es aussieht, y * width wird als ein Doppelwert berechnet, was dazu führt, dass die Pixel teilweise von der linken Seite des Bildes versetzt sind, selbst wenn x=0.

Sie müssen sicherstellen, dass x und y in int Werte normalisiert werden, bevor sie in der Formel für die Indizierung in pixels verwendet:

pixels[(int)x + (int)y * width] = 0xFFFF00FF; 

Dies gibt das erwartete Ergebnis.

Verwandte Themen