[JAVA] Logik zum Zeichnen eines Kreises auf der Konsole mit ASCII-Grafik

↓ Zeichne so etwas (Qiita macht eine Ellipse und es ist schwer zu sehen ...)

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●○○○○○○○○○○●●●●●●●●●●●
●●●●●●●●○○○○○○○○○○○○○○●●●●●●●●●
●●●●●●○○○○○○○○○○○○○○○○○○●●●●●●●
●●●●●○○○○○○○○○○○○○○○○○○○○●●●●●●
●●●●○○○○○○○○○○○○○○○○○○○○○○●●●●●
●●●○○○○○○○○○○○○○○○○○○○○○○○○●●●●
●●●○○○○○○○○○○○○○○○○○○○○○○○○●●●●
●●○○○○○○○○○○○○○○○○○○○○○○○○○○●●●
●●○○○○○○○○○○○○○○○○○○○○○○○○○○●●●
●○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●
●○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●
●○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●
●○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●
●○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●
●○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●
●○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●
●○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●
●○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●
●○○○○○○○○○○○○○○○○○○○○○○○○○○○○●●
●●○○○○○○○○○○○○○○○○○○○○○○○○○○●●●
●●○○○○○○○○○○○○○○○○○○○○○○○○○○●●●
●●●○○○○○○○○○○○○○○○○○○○○○○○○●●●●
●●●○○○○○○○○○○○○○○○○○○○○○○○○●●●●
●●●●○○○○○○○○○○○○○○○○○○○○○○●●●●●
●●●●●○○○○○○○○○○○○○○○○○○○○●●●●●●
●●●●●●○○○○○○○○○○○○○○○○○○●●●●●●●
●●●●●●●●○○○○○○○○○○○○○○●●●●●●●●●
●●●●●●●●●●○○○○○○○○○○●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

Die Lösung nach dem Drei-Quadrat-Theorem und Ich habe versucht, es durch die Lösungsmethode durch Dreiecksfunktion + 2-Minuten-Suche zu implementieren.

Es scheint, dass die digitale Differentialanalyse nur durch Addition / Subtraktion und Verschiebung gezeichnet werden kann. Zeichnen eines Kreises (1) Bogenzeichnungsalgorithmus

Von diesen denke ich, dass der Drei-Quadrat-Satz wahrscheinlich am einfachsten zu verstehen ist.

import static java.lang.System.out;
import java.util.stream.IntStream;

public abstract class Draw {
	//Einstiegspunkt
	public static void main(String... args) {
		Integer size = 31;//Größe zum Zeichnen

		//Lösung nach dem Drei-Quadrat-Theorem
		new DrawCircle(size) {
			@Override
			Integer threshold(Integer r, Integer x) {
				Integer threshold = Double.valueOf(Math.sqrt(r * r - x * x)).intValue();
				return threshold;
			}
		}.drow();

		out.println();

		//Dreiecksfunktion + 2-Minuten-Suchlösung
		new DrawCircle(size) {
			Integer threshold(Integer r, Integer x) {
				return threshold(r, x, new Double(45), new Double(45/2));
			}
			Integer threshold(Integer r, Integer x, Double angle, Double incAngle) {
				Integer _x =  (int)Math.round(Double.valueOf(r * Math.cos(Math.toRadians(angle))));
				double nextIncAngle = incAngle/2 > 1 ? incAngle/2 : 1;
				if( _x.intValue() > x ) {
					return threshold(r, x, angle + incAngle, nextIncAngle);
				}else if( _x.intValue() < x ) {
					double _angle = angle - incAngle;
					if( _angle < 0 ) {//Ich habe es nicht gut untersucht, aber wenn x den Maximalwert erreicht, wird es zu einer Endlosschleife. Beurteilen Sie also nach Winkel und Schutz
						return 0;
					}else {
						return threshold(r, x, _angle, nextIncAngle);
					}
				}
				return Double.valueOf(r * Math.sin(Math.toRadians(angle))).intValue();
			}
		}.drow();

	}

	//Kreis Zeichenklasse
	abstract static class DrawCircle extends Draw{
		DrawCircle(Integer size) {
			super(size);
		}
		@Override
		Boolean algorithm(Integer x, Integer y) {
			Integer r = size / 2;
			x = fixPostion(r, x);
			y = fixPostion(r, y);
			Integer threshold = threshold(r, x);
			return y > threshold;
		};

		/**
		 *Ermitteln Sie den Schwellenwert dafür, ob er sich in vertikaler Richtung innerhalb oder außerhalb des Kreises befindet
		 * @param r Radius
		 * @param x horizontale Skala
		 * @Vertikale Schwelle zurückgeben
		 */
		abstract Integer threshold(Integer r, Integer x);

		/**
		 *Berechnen Sie die Position des zu berechnenden Kreises aus den Koordinaten(Es ist eine subtile Erklärung ...)。
		 * @param r Radius
		 * @param x Koordinaten
		 * @return
		 */
		Integer fixPostion(Integer r, Integer x){
			if(r < x) {
				x -= r;//Berechnung der rechten Hälfte
			}else {
				x = r - x + 1;//15 weil 1 startet->1, 14->2... 1->In 15 konvertieren
			}
			return x;
		}
	}

	//Inhalt der Draw-Klasse
	Integer size;

	Draw(Integer size) {
		this.size = size;
	}

	abstract Boolean algorithm(Integer x, Integer y);

	void drow() {
		IntStream.rangeClosed(1, size).forEach(y -> {
			IntStream.rangeClosed(1, size).forEach(x -> {
				out.print(algorithm(x, y) ? "●" : "○");
			});
			out.println();
		});
	}
}


Recommended Posts

Logik zum Zeichnen eines Kreises auf der Konsole mit ASCII-Grafik
Geben Sie ein Suffix für die Methode an
Geben Sie ein Suffix für Methode 2 heraus
Fizzbuzz mit ASCII-Kunst.
Implementierung einer starken API für "Ich möchte ~~ auf dem Bildschirm anzeigen" mit einfachem CQRS
[Java] Ich habe versucht, ein Janken-Spiel zu erstellen, das Anfänger auf der Konsole ausführen können
So reduzieren Sie die Programmlast ein wenig, wenn Sie Zeichen mit JAVA kombinieren
Vier Reihen mit Schwerkraft, die auf der Konsole gespielt werden können
Apache Geode-Einfache Möglichkeit, Logik auf der Serverseite auszuführen
[Swift 5] Wählen Sie mit der UIDate-Auswahl unter iOS14 ein Datum aus
Hinweise zum Erstellen von Jitsi Meet on Azure mit Docker-Compose
Fügen Sie dem Swift-Button (und auch dem Kreis) einen Schatten hinzu.
Eingabe in die Java-Konsole
Versuchen Sie, die Idee eines zweidimensionalen Arrays mit einem eindimensionalen Array nachzuahmen
Ich möchte eine Browsing-Funktion mit Ruby on Rails hinzufügen
Herstellen einer Verbindung zu einer Datenbank mit Java (Teil 1) Möglicherweise die grundlegende Methode
Ersetzen Sie durch einen Wert entsprechend der Übereinstimmung mit einem regulären Java-Ausdruck
Ich habe versucht, den Kalender mit Java auf der Eclipse-Konsole anzuzeigen.
Schritte zum Erstellen einer Ruby on Rails-Entwicklungsumgebung mit Vagrant
(Ruby on Rails6) Erstellen Sie eine Funktion zum Bearbeiten des veröffentlichten Inhalts
Eine Geschichte, der ich mit der automatischen Starteinstellung von Tomcat 8 unter CentOS 8 zweimal verfallen war
Ich möchte eine Datei mit Ruby im Internet herunterladen und lokal speichern (mit Vorsicht).
Setzen Sie ein Abzeichen auf das Symbol
Programmieren mit Ruby (unterwegs)
So interagieren Sie mit einem Server, der die App nicht zum Absturz bringt
So überprüfen Sie, bevor Sie mit Spring Integration eine Nachricht an den Server senden
Zeichnen Sie mit MPAndroidChart gleichzeitig Balkendiagramm und Liniendiagramm
Minimale Schritte zum Einrichten einer Ruby-Umgebung mit rbenv unter Ubuntu 20.04
Ich kann nicht bauen, wenn ich das Build-Ziel mit XCode12 auf einen Simulator setze!
So erstellen Sie eine Ruby on Rails-Entwicklungsumgebung mit Docker (Rails 6.x)
Hanashi stolperte ein wenig auf dem Weg, Java mit VScode zu studieren
So debuggen Sie die Verarbeitung im Ruby on Rails-Modell nur mit der Konsole
So erstellen Sie eine Ruby on Rails-Entwicklungsumgebung mit Docker (Rails 5.x)
Senden Sie nach eindeutiger Authentifizierung mit Spring Cloud Gateway eine Anfrage an das Backend