2016-04-27 3 views
0

Ich habe zwei Möglichkeiten, einen gefüllten Kreis mit dem Bresenham/Midpoint-Algorithmus zu erstellen. Aber der zweite Weg sieht viel besser aus als der erste Weg.Ändern Sie den Bresenham/Mittelpunkt-Algorithmus etwas, um bessere Ergebnisse zu erhalten.

bresenham/midpoint

Ich möchte ein Ergebnis wie das zweite schaffen, sondern mit der Art und Weise des ersten ein. Ich will es mit dem ersten Weg zu tun, weil ich eine richtige Formel benötigen Abstände für die Berechnung, die diese im Moment ist:

function calcDistance (pos,pos2,range){ 
    var x1 = pos.hasOwnProperty('x') ? pos.x : pos[0], 
     y1 = pos.hasOwnProperty('y') ? pos.y : pos[1], 
     x2 = pos2.hasOwnProperty('x') ? pos2.x : pos2[0], 
     y2 = pos2.hasOwnProperty('y') ? pos2.y : pos2[1]; 
    return Math.pow((x1-x2),2) + Math.pow((y1-y2),2) - Math.pow(range, 2) 
}; 

Hier ist die jsfiddle. Der erste Ansatz von wikipedia die zweiten von here

+0

Und deine Frage ist? –

+0

@BrentWashburne Ich möchte ein Ergebnis wie das zweite erstellen, aber mit dem ersten Ansatz. – InsOp

+0

Was hat Ihre Funktion 'calcDistance' mit dem Zeichnen des Kreises zu tun? Es wird in keinem der beiden Ansätze erwähnt. –

Antwort

1

Statt Zeichnung Punkte genommen wurde, wenn der Abstand <= 0 ist, Punkte zu ziehen, wenn der Abstand ist <= radius*radius*zoom:

EDIT: angelegt, um einen Skalierungsfaktor von (8.0/radius)

function drawCircle(x0, y0, radius){ 
    var range = radius*radius*zoom*(8.0/radius); // calculate the range once 
    for(var x = 0; x < imageWidth/zoom; x++){ 
    for(var y = 0; y < imageHeight/zoom; y++){ 
     if(calcDistance([x0,y0],[x*zoom,y*zoom],radius*zoom) <= range){ 
     context.fillRect(x*zoom,y*zoom,zoom,zoom); 
     } 
    } 
    } 
} 
+0

danke, aber Ihre Lösung funktioniert nur für ein paar Radien. f. 2-6 funktioniert nicht, ebenso wenig wie bei 9, 11, .. – InsOp

+0

Dies funktioniert jetzt für Radien 1-9. –

+0

danke, aber ich brauche es für alle möglichen Radien, zumindest für 1-30 – InsOp

Verwandte Themen