JavaFX Polyline draw sine curve

Description

JavaFX Polyline draw sine curve

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.shape.Line;
import javafx.scene.shape.Polyline;
import javafx.scene.text.Text;
import javafx.scene.paint.Color;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.collections.ObservableList;

public class Main extends Application {
  @Override//from www.  j av  a 2  s .c om
  public void start(Stage primaryStage) {
    final double WINDOW = 400.0;

    Pane graphPane = new Pane();
    drawArrow(0, WINDOW / 5 * 4, WINDOW, WINDOW / 5 * 4, graphPane);
    drawArrow(WINDOW / 2, WINDOW, WINDOW / 2, 0, graphPane);

    Polyline sinLine = new Polyline();
    sinLine.setStroke(Color.RED);
    ObservableList<Double> list = sinLine.getPoints();
    double scaleFactor = 50;
    for (int x = -170; x <= 170; x++) {
      list.add(x + 200.0);
      list.add((WINDOW / 5 * 4) - scaleFactor * Math.sin((x / 100.0) * 2 * Math.PI));
    }

    graphPane.getChildren().addAll(sinLine);

    StackPane pane = new StackPane();
    pane.setPadding(new Insets(20));
    pane.setAlignment(Pos.CENTER);
    pane.getChildren().add(graphPane);

    Scene scene = new Scene(pane);
    primaryStage.setTitle("java2s.com");
    primaryStage.setScene(scene);
    primaryStage.show();
  }

  public static void drawArrow(double startX, double startY,
    double endX, double endY, Pane pane) {
    double slope = (startY - endY) / (startX - endX);
    double lineAngle = Math.atan(slope);
    double arrowAngle = endX <= startX ? Math.toRadians(45) : -Math.toRadians(225);

    Line line = new Line(startX, startY, endX, endY);

    double lineLength = Math.sqrt(Math.pow(startX - endX, 2) + Math.pow(startY - endY, 2));
    double arrowLength = lineLength / 12;
    Line arrow1 = new Line();
    arrow1.setStartX(line.getEndX());
    arrow1.setStartY(line.getEndY());
    arrow1.setEndX(line.getEndX() + arrowLength * Math.cos(lineAngle + arrowAngle));
    arrow1.setEndY(line.getEndY() + arrowLength * Math.sin(lineAngle + arrowAngle));
    Line arrow2 = new Line();
    arrow2.setStartX(line.getEndX());
    arrow2.setStartY(line.getEndY());
    arrow2.setEndX(line.getEndX() + arrowLength * Math.cos(lineAngle - arrowAngle));
    arrow2.setEndY(line.getEndY() + arrowLength * Math.sin(lineAngle - arrowAngle));

    pane.getChildren().addAll(line, arrow1, arrow2);
  }

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



PreviousNext

Related