2017-10-03 16 views
0

그래서 원의 원주를 따라 등 간격의 점을 플롯해야합니다. 여기에 코드가 있지만 1 점만 표시합니다. 그것은 아마 하나의 작은 일이지만 그것을 알아낼 수 없습니다. 여기에 내가 가진 무엇 : 나는 지점 (원)의 위치가 내가 증가로 변경해야한다고 가정 것원 위에 등거리 점 N 점을 지정하고 하나만 점을 지정하십시오.

import javafx.application.Application; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.Scene; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.stage.Stage; 
import javafx.geometry.Point2D; 

public class jvafx extends Application { 
    public static void main(String[] args) { 
     Application.launch(args); 
    } 
    @Override 
    public void start(Stage primaryStage) {  
     AnchorPane root = new AnchorPane(); 
     Scene scene = new Scene(root, 300, 300, Color.LIGHTGREY); 

     Circle c = new Circle(); 
     c.setCenterX(150.0f); 
     c.setCenterY(150.0f); 
     c.setRadius(100.0f); 
     c.setStroke(Color.BLACK); 
     c.setFill(null); 

     root.getChildren().add(c); 

     int N = 16; 
     Circle pt = null; 
     for(int i = 0; i < N; i++) { 
      pt = new Circle(150.0f + 100 * Math.cos(Math.PI*2*(i/N)), 
        150.0f + 100 * Math.sin(Math.PI*2*(i/N)), 3.0f); 
      pt.setFill(Color.BLACK); 
      root.getChildren().add(pt); 
     } 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 
} 

. 어쩌면 이것이 잘못된 것일까?

+0

코드 조각뿐만 아니라 전체 코드를 공유 할 수 있습니까? –

+0

@ Fredlo2010 죄송합니다, 업데이트했습니다! – user7045171

+0

좌표를 계산하는 방식이 잘못되었습니다. 항상 같은 좌표를주고 있습니다. 서로의 꼭대기에 16 개의 원을 인쇄하고 있습니다. –

답변

1

각도는 각도를 계산하는 방법입니다. 원 주위의 "진행률"에 01 사이의 값에 i=16 (2 * PI)에 사용될 값을 곱하고 싶습니다.

이 방법은 정확하지만 당신은 정수 나누기 일을하는지 :

(i/N) 

이 부문의 결과가 잘리고 i 모든 가입일 : 0 <= i < N 표현은 항상 0로 평가합니다. 당신이 브래킷을 부동 소수점 유형 값 중 하나를 변환하거나 제거하는 경우

, 당신의 접근 방식은 작동 : 괄호 작품을 제거

int N = 16; 
for (int i = 0; i < N; i++) { 
    Circle pt = new Circle(150.0f + 100 * Math.cos(Math.PI * 2 * i/N), 
      150.0f + 100 * Math.sin(Math.PI * 2 * i/N), 3.0f); 
    pt.setFill(Color.BLACK); 
    root.getChildren().add(pt); 
} 

, Math.PI * 2 * i/Ndouble의 곱셈 ((Math.PI * 2) * i)/N에 해당하고 있기 때문에 Math.PIintdouble을 산출한다.

0

정상적으로 작동합니다. 나는 당신이 새로운 프로그래머가 된 것 같아서 많은 것들을 바꿨다. 그래서 나는 당신에게 지혜의 몇 마디를 줄 것이라고 생각했다.

  1. 프로그램에 더 분명히 나타납니다. 그러니 항상 함께 쓰지 마세요. 논리 단위로 분리하면 많은 두통을 피할 수 있습니다.
  2. 소프트웨어 변수는 수학 변수와 다릅니다. 그들에게 짧은 표현이 아닌 긴 이름을 줘보십시오. 당신의 코드는시와 같이 읽힐 것입니다. (내가들은 사람이 누구인지는 모르겠지만 많이 좋아합니다.)
  3. Let와 IDE를 안내합니다. 타이핑을 시작하고 Ctrl + 스페이스 바를 몇 번 누르면 나타나는 것을 볼 수 있습니다.
  4. 로직이 너무 길어서 새로운 함수로 분리 될 수 있다면; 그렇게해라.

여기에 최종 코드가 나와 있습니다.

public class Main extends Application { 

    public static void main(String[] args) { 
     Application.launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) { 

     AnchorPane root = new AnchorPane(); 
     Scene scene = new Scene(root, 300, 300, Color.LIGHTGREY); 
     Circle circle = new Circle(150.0f, 150.0f, 100.0f, Color.TRANSPARENT); 
     circle.setStroke(Color.BLACK); 

     List<Node> dots = getCircledDots(16, circle, 3.0f); 

     root.getChildren().add(circle); 
     root.getChildren().addAll(dots); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    /** 
    * Function to create list of dots around a circle. 
    */ 
    private List<Node> getCircledDots(int numberOfDots, Circle circle, double dotRadius) { 

     List<Node> dots = new ArrayList<>(); 
     double angleFactor = 2 * Math.PI/numberOfDots; 
     double originX = circle.getCenterX(); 
     double originY = circle.getCenterY(); 
     double radius = circle.getRadius(); 
     double angle; 
     Circle dot = null; 
     for (int i = 0; i < numberOfDots; i++) { 

      angle = i * angleFactor; 
      double x = originX + radius * Math.cos(angle); 
      double y = originY + radius * Math.sin(angle); 

      dot = new Circle(x, y, dotRadius); 
      dot.setFill(Color.BLACK); 
      dots.add(dot); 
     } 
     return dots; 
    } 
}