Java

자바 별찍기 - 원모양 만들기 (feat.원의 방정식)

becky(지은) 2023. 8. 19. 23:19

 

 

여러 그림을 보아도 이렇다할 규칙을 찾기 어려웠다.
그래서 그냥 원의 방정식을 사용해서 내부에 있는 점들만 *로 나올 수 있도록 했다

1. 입력값 = 반지름
입력값은 정수로 받는다
입력값이 커질수록 반지름이 커져 원의 범위가 넓어지는 형태


2. 일단 사각형을 작성하였다.

for (int i = -r; i <=r ; i++) {
        for (int j = -r; j <=r ; j++) {
        System.out.print("*");
      }
        System.out.println();


3
       *******
       *******
       *******
       *******
       *******
       *******
       *******



3. 예를 들어, 입력값이 3인 경우에는|
점이 내부에 있으려면 다음식을 만족해야 한다.
x^2 + y^2 <= 9
y ^2 <= 9-x^2을 만족해야 한다.

-√ 9-x^2 <= y <= +√ 9-x^2



 

제곱근 자바에서 쓰는법 : Math.sqrt( )
double a = 16;
double b = 121;
double c = 10;

System.out.println(Math.sqrt(a)); //출력 4.0
System.out.println(Math.sqrt(b)); //     11.0
System.out.println(Math.sqrt(c)); //     3.1622776601683795




그 다음 if문을 사용해서, x좌표와 같은 역할을 하는 j의 범위를 한정시켰다
이렇게 하면 가로로 별을 찍을때, 이런 범위인 j만 "*"를 찍을 수 있다.
범위에 속하지 않으면, " " 공백이 찍힌다.

for (int i = -r; i <=r ; i++) {
            for (int j = -r; j <=r ; j++) {
                double squareRoot = Math.sqrt(r *r- i*i);
                if(- squareRoot<= j && j <= squareRoot){
                    System.out.print("*");
                }else{
                    System.out.print(" ");
                }
            }
            System.out.println();
        }







 

탐색 : 원과 최대한 가까운 점의 모임이 되려면?

1. 점과 공백들에게 공백을 넣어주기

for (int i = -r; i <=r ; i++) {
            for (int j = -r; j <=r ; j++) {
                double squareRoot = Math.sqrt(r *r- i*i);
                if(- squareRoot<= j && j <= squareRoot){
                    System.out.print(" * "); //양쪽에 공백 빵빵이
                }else{
                    System.out.print("   "); //양쪽에 공백 빵빵이
                }
            }
            System.out.println();



어쨌든 내가 사용하고 있는 반복문은 j++이고, 정수형태로 점을 찍는 것이기 때문에
정말 촘촘하고 완전하게,
원 내부에 들어오는 점을 모아서
정말 원처럼 만드는 것은 쉽지 않다

하지만, 각 점과 점 사이에 간격을 만들어 주는 것은 어떨까?
=> 이유: 그냥 * 를 찍으면 세로줄 기준으로 기본적으로 생기는 간격때문에 찌그러진 타원 같이 보인다
=> 변화된 결과 : 좀 원형스러워졌다(?)




2. Scan 값에 * 20 정도를 해주어서, 좀더 큰 수가 들어갈 수 있도록 설정하여
원내부를 촘촘하게 만들어주기

Scanner scan = new Scanner(System.in);
        int r = scan.nextInt() * 20;






 

최종코드

 

import java.util.Scanner;
public class 원 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int r = scan.nextInt() * 20;

 //어쨋든 코드는 위에서 아래로 내려가니까
// y좌표는 사각형(높이가 2r인) 정도의 범위로만 한정하고
// x좌표는 실제 가로로 한줄씩 코드가 쓰일때마다 각 점이 공백이냐 *이냐에 따라 모양이 달라질것

        for (int i = -r; i <=r ; i++) { //y좌표
            for (int j = -r; j <=r ; j++) {  //x좌표
                double squareRoot = Math.sqrt(r *r- i*i);
                if(- squareRoot<= j && j <= squareRoot){
                    System.out.print(" * ");
                }else{
                    System.out.print("   ");
                }
            }
            System.out.println();
        }
    }
}


//for (int i = -r; i <=r ; i++) {
//        for (int j = -r; j <=r ; j++) {
//        System.out.print("*");
//        }
//        System.out.println();


//3
//        *******
//        *******
//        *******
//        *******
//        *******
//        *******
//        *******