2017-10-03 10 views
0

円の円周に沿って等間隔の点をプロットする必要があります。私はここにコードを持っていますが、それは1点しかプロットしません。おそらくちょっとしたことですが、私はそれを理解できません。ここに私が持っているものがあります:円上の等距離点をN点にプロットすると、1点しか与えません。

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=162 * PI)に使用される値を掛けたいとします。

このアプローチは正しいですが、あなたは整数の除算やっている:

(i/N) 

をこの除算の結果は切り捨てられ、のためので、すべてのi0 <= 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/N((Math.PI * 2) * i)/Ndoubleの乗算と等価であるため、 Math.PIおよびintのように、doubleが得られる。

0

これは正常に動作するはずです。あなたが新しいプログラマーになっているように私はたくさんのものを変えました。私はあなたに知恵の言葉をいくつか与えてくれると思っていました。

  1. プログラムには明示的に表示されます。だから、常に一緒に物を書いてはいけません。それらを論理ユニットに分ければ、頭痛の種になる危険があります。
  2. ソフトウェア変数は数学変数と同じではありません。彼らに短い表記の名前を付けないでください。あなたのコードは詩のように読むでしょう(私がこれを聞いた人はいないが、私はたくさん好きです)
  3. LetとIDEをあなたに教えてください。入力を開始し、Ctrl + Spaceを数回押して表示される内容を確認します。
  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; 
    } 
} 
関連する問題