[JAVA] Logique pour dessiner un cercle sur la console avec l'art ASCII

↓ Dessinez quelque chose comme ça (Qiita fait une ellipse et c'est difficile à voir ...)

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

La solution par le théorème des trois carrés et J'ai essayé de l'implémenter par la méthode de la solution par fonction triangulaire + recherche de 2 minutes.

Il semble que l'analyse différentielle numérique ne puisse être établie que par addition / soustraction et décalage. Dessin d'un cercle (1) Algorithme de dessin d'arc

Parmi ceux-ci, je pense que le théorème des trois carrés est probablement le plus facile à comprendre.

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

public abstract class Draw {
	//Point d'accès
	public static void main(String... args) {
		Integer size = 31;//Taille à dessiner

		//Résolution par le théorème des trois carrés
		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();

		//Fonction triangulaire + solution de recherche en 2 minutes
		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 ) {//Je ne l'ai pas bien étudié, mais lorsque x atteint la valeur maximale, cela devient une boucle infinie, alors jugez par l'angle et la garde
						return 0;
					}else {
						return threshold(r, x, _angle, nextIncAngle);
					}
				}
				return Double.valueOf(r * Math.sin(Math.toRadians(angle))).intValue();
			}
		}.drow();

	}

	//Cours de dessin en cercle
	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;
		};

		/**
		 *Obtenez le seuil de savoir s'il est à l'intérieur ou à l'extérieur du cercle dans la direction verticale
		 * @rayon param r
		 * @param x échelle horizontale
		 * @retour Seuil vertical
		 */
		abstract Integer threshold(Integer r, Integer x);

		/**
		 *Calculer la position du cercle à calculer à partir des coordonnées(C'est une explication subtile ...)。
		 * @rayon param r
		 * @coordonnées param x
		 * @return
		 */
		Integer fixPostion(Integer r, Integer x){
			if(r < x) {
				x -= r;//Calcul de la moitié droite
			}else {
				x = r - x + 1;//15 parce que 1 commence->1, 14->2... 1->Convertir en 15
			}
			return x;
		}
	}

	//Contenu de la classe Draw
	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

Logique pour dessiner un cercle sur la console avec l'art ASCII
Sortez avec un suffixe sur la méthode
Sortez avec un suffixe sur la méthode 2
Fizzbuzz avec art ASCII.
Implémentation d'une API forte pour "Je veux afficher ~~ à l'écran" avec un simple CQRS
[Java] J'ai essayé de créer un jeu Janken que les débutants peuvent exécuter sur la console
Comment réduire même un peu la charge du programme lors de la combinaison de caractères avec JAVA
Quatre rangées avec gravité pouvant être jouées sur la console
Apache Geode-Easy moyen d'exécuter la logique côté serveur
[Swift 5] Sélectionnez une date avec le sélecteur UIDate sur iOS14
Notes sur la création de Jitsi Meet sur Azure avec docker-compose
Ajouter une ombre au bouton Swift (et aussi au cercle)
Entrée dans la console Java
Essayez d'imiter l'idée d'un tableau à deux dimensions avec un tableau à une dimension
Je souhaite ajouter une fonction de navigation avec ruby on rails
Connexion à une base de données avec Java (partie 1) Peut-être la méthode de base
Remplacer par une valeur selon la correspondance avec une expression régulière Java
J'ai essayé d'afficher le calendrier sur la console Eclipse en utilisant Java.
Étapes pour créer un environnement de développement Ruby on Rails avec Vagrant
(Ruby on Rails6) Créer une fonction pour modifier le contenu publié
Une histoire à laquelle j'étais accro à deux reprises avec le paramètre de démarrage automatique de Tomcat 8 sur CentOS 8
Je souhaite télécharger un fichier sur Internet en utilisant Ruby et l'enregistrer localement (avec prudence)
Mettre un badge sur l'icône
Programmation avec ruby (en route)
Comment interagir avec un serveur qui ne plante pas l'application
Comment vérifier avant d'envoyer un message au serveur avec Spring Integration
Dessinez un graphique à barres et un graphique linéaire en même temps avec MPAndroidChart
Étapes minimales pour configurer un environnement Ruby avec rbenv sur Ubuntu 20.04
Je ne peux pas construire si je définis la destination de construction sur un simulateur avec XCode12!
Comment créer un environnement de développement Ruby on Rails avec Docker (Rails 6.x)
Hanashi a trébuché un peu sur le chemin en essayant d'étudier Java avec VScode
Comment déboguer le traitement dans le modèle Ruby on Rails avec juste la console
Comment créer un environnement de développement Ruby on Rails avec Docker (Rails 5.x)
Envoyez une demande au backend après une authentification unique avec Spring Cloud Gateway