Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
- package arctan2spiral;
- import java.io.File;
- import java.io.IOException;
- import java.util.HashMap;
- import javafx.application.Application;
- import javafx.embed.swing.SwingFXUtils;
- import javafx.event.ActionEvent;
- import javafx.event.EventHandler;
- import javafx.scene.Scene;
- import javafx.scene.SnapshotParameters;
- import javafx.scene.canvas.Canvas;
- import javafx.scene.canvas.GraphicsContext;
- import javafx.scene.control.Button;
- import javafx.scene.control.TextField;
- import javafx.scene.control.ToggleButton;
- import javafx.scene.image.WritableImage;
- import javafx.scene.layout.ColumnConstraints;
- import javafx.scene.layout.GridPane;
- import javafx.scene.layout.HBox;
- import javafx.scene.layout.Pane;
- import javafx.scene.layout.RowConstraints;
- import javafx.scene.text.Text;
- import javafx.stage.Stage;
- import javafx.util.Pair;
- import javax.imageio.ImageIO;
- /**
- *
- * @author Nunya Business
- */
- public class AnglePlotter2D extends Application {
- private double angle;
- private int width;
- private int height;
- private int canvWidth;
- private int canvHeight;
- private int revs;
- private double numer;
- private double denom;
- private boolean constDec;
- private boolean piNumer;
- private boolean piDenom;
- private Pair<Double, Double> p1;
- private Pair<Double, Double> p2;
- private Pane wrapperPane;
- private Canvas canvas;
- private GraphicsContext gc;
- private HBox inBox;
- private TextField pngWidthTF;
- private Text pngWidthTxt;
- private TextField pngHeightTF;
- private Text pngHeightTxt;
- private Text riseTxt;
- private Text rise;
- private Button riseButtonInc;
- private Button riseButtonDec;
- private Text runTxt;
- private Text run;
- private Button runButtonInc;
- private Button runButtonDec;
- private ToggleButton decayBtn;
- private ToggleButton piNumerBtn;
- private ToggleButton piDenomBtn;
- private Text decayTxt;
- private TextField revsTF;
- private Text revsTxt;
- private HashMap<String, Boolean> inputValMap;
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) {
- launch(args);
- }
- @Override
- public void start(Stage primaryStage) {
- inputValMap = new HashMap<>();
- width = 1024;
- height = 512;
- numer = 1;
- piNumer = false;
- denom = 2;
- piDenom = false;
- constDec = false;
- canvHeight = (int)(height * .9);
- createComponents();
- GridPane root = new GridPane();
- ColumnConstraints c1 = new ColumnConstraints();
- c1.setPercentWidth(12.5);
- ColumnConstraints c2 = new ColumnConstraints();
- c2.setPercentWidth(12.5);
- ColumnConstraints c3 = new ColumnConstraints();
- c3.setPercentWidth(12.5);
- ColumnConstraints c4 = new ColumnConstraints();
- c4.setPercentWidth(12.5);
- ColumnConstraints c5 = new ColumnConstraints();
- c5.setPercentWidth(12.5);
- ColumnConstraints c6 = new ColumnConstraints();
- c6.setPercentWidth(12.5);
- ColumnConstraints c7 = new ColumnConstraints();
- c7.setPercentWidth(12.5);
- ColumnConstraints c8 = new ColumnConstraints();
- c8.setPercentWidth(12.5);
- root.getColumnConstraints().addAll(c1,c2,c3,c4,c5,c6,c7,c8);
- RowConstraints r1 = new RowConstraints();
- r1.setPercentHeight(5);
- RowConstraints r2 = new RowConstraints();
- r2.setPercentHeight(90);
- RowConstraints r3 = new RowConstraints();
- r3.setPercentHeight(5);
- root.getRowConstraints().addAll(r1,r2,r3);
- decayBtn = new ToggleButton("rev");
- decayBtn.setOnAction(new EventHandler<ActionEvent>(){
- @Override
- public void handle(ActionEvent e){
- constDec = !constDec;
- if(decayBtn.getText().equals("rev")){
- decayBtn.setText("const");
- }
- else{
- decayBtn.setText("rev");
- }
- }
- });
- piNumerBtn = new ToggleButton();
- piNumerBtn.setOnAction(new EventHandler<ActionEvent>(){
- @Override
- public void handle(ActionEvent e){
- piNumer = !piNumer;
- if(piNumerBtn.getText().equals("* \u03C0")){
- piNumerBtn.setText(" ");
- }
- else{
- piNumerBtn.setText("* \u03C0");
- }
- }
- });
- riseButtonInc = new Button("+");
- riseButtonInc.setOnAction(new EventHandler<ActionEvent>(){
- @Override
- public void handle(ActionEvent e){
- numer++;
- rise.setText(String.valueOf(numer));
- if(goodInput()){
- go();
- primaryStage.show();
- }
- else{
- System.out.println("fix input");
- }
- }
- });
- riseButtonDec = new Button("-");
- riseButtonDec.setOnAction(new EventHandler<ActionEvent>(){
- @Override
- public void handle(ActionEvent e){
- if(numer > 1.1){
- numer--;
- rise.setText(String.valueOf(numer));
- if(goodInput()){
- go();
- primaryStage.show();
- }
- else{
- System.out.println("fix input");
- }
- }
- else{
- System.out.println("0 increment error");
- }
- }
- });
- piDenomBtn = new ToggleButton();
- piDenomBtn.setOnAction(new EventHandler<ActionEvent>(){
- @Override
- public void handle(ActionEvent e){
- piDenom = !piDenom;
- if(piDenomBtn.getText().equals("* \u03C0")){
- piDenomBtn.setText(" ");
- }
- else{
- piDenomBtn.setText("* \u03C0");
- }
- }
- });
- runButtonInc = new Button("+");
- runButtonInc.setOnAction(new EventHandler<ActionEvent>(){
- @Override
- public void handle(ActionEvent e){
- denom = denom + 1.0;
- run.setText(String.valueOf(denom));
- if(goodInput()){
- go();
- primaryStage.show();
- }
- else{
- System.out.println("fix input");
- }
- }
- });
- runButtonDec = new Button("-");
- runButtonDec.setOnAction(new EventHandler<ActionEvent>(){
- @Override
- public void handle(ActionEvent e){
- if(denom > 1.1){
- denom = denom - 1.0;
- run.setText(String.valueOf(denom));
- if(goodInput()){
- go();
- primaryStage.show();
- }
- else{
- System.out.println("fix input");
- }
- }
- else{
- System.out.println("div by 0");
- }
- }
- });
- Button btnClear = new Button("clear");
- btnClear.setOnAction(new EventHandler<ActionEvent>(){
- @Override
- public void handle(ActionEvent e){
- gc.clearRect(0,0,canvas.getWidth(),canvas.getHeight());
- }
- });
- Button btnCap = new Button("cap");
- btnCap.setOnAction(new EventHandler<ActionEvent>(){
- @Override
- public void handle(ActionEvent e){
- take(canvas);
- }
- });
- root.add(inBox,0,0,4,1);
- root.add(decayTxt,4,0);
- root.add(decayBtn,5,0);
- root.add(btnClear,6,0);
- root.add(btnCap,7,0);
- wrapperPane = new Pane();
- root.add(wrapperPane,0,1,8,1);
- HBox riseHBox = new HBox();
- riseHBox.getChildren().addAll(riseTxt,rise,riseButtonInc,riseButtonDec,piNumerBtn);
- root.add(riseHBox,0,2,4,1);
- HBox runHBox = new HBox();
- runHBox.getChildren().addAll(runTxt,run,runButtonInc,runButtonDec,piDenomBtn);
- root.add(runHBox,4,2,4,1);
- canvas = new Canvas();
- wrapperPane.getChildren().add(canvas);
- canvas.widthProperty().bind(wrapperPane.widthProperty());
- canvas.heightProperty().bind(wrapperPane.heightProperty());
- canvas.widthProperty().addListener(event -> go());
- canvas.heightProperty().addListener(event -> go());
- gc = canvas.getGraphicsContext2D();
- Scene scene = new Scene(root, width, width);
- primaryStage.setTitle("AnglePlotter2D");
- primaryStage.setScene(scene);
- primaryStage.show();
- }
- private void createComponents(){
- pngWidthTF = new TextField(String.valueOf(width));
- pngWidthTxt = new Text("width");
- pngHeightTF = new TextField(String.valueOf(height));
- pngHeightTxt = new Text("height");
- riseTxt = new Text("rise: ");
- rise = new Text(String.valueOf(numer));
- runTxt = new Text("run: ");
- run = new Text(String.valueOf(denom));
- revsTF = new TextField("3");
- revsTxt= new Text("revolutions");
- decayTxt = new Text("decay on: ");
- inBox = new HBox();
- inBox.getChildren().addAll(pngWidthTxt,pngWidthTF,pngHeightTxt,pngHeightTF,
- revsTxt, revsTF);
- }
- private void go(){
- gc.clearRect(0,0,wrapperPane.getWidth(),wrapperPane.getHeight());
- double x1, x2, y1, y2, distance, distanceMod, effNumer, effDenom;
- if(piNumer){
- effNumer = numer * Math.PI;
- }
- else{
- effNumer = numer;
- }
- if(piDenom){
- effDenom = denom * Math.PI;
- }
- else{
- effDenom = denom;
- }
- angle = Math.atan(effNumer/effDenom);
- double currAngle = 0;
- int maxIt = Math.abs((int)Math.ceil((revs * 2 * Math.PI)/angle));
- double alphaMod;
- double alpha = 1.0;
- x1 = wrapperPane.getWidth() / 2.0;
- x2 = wrapperPane.getWidth();
- y1 = wrapperPane.getWidth() / 2.0;
- y2 = y1;
- p1 = new Pair(x1,y1);
- p2 = new Pair(x2,y2);
- distance = x1;
- if(constDec){
- distanceMod = distance / maxIt;
- alphaMod = 1.0 / maxIt;
- for(int i = 0; i < maxIt; i++){
- gc.setGlobalAlpha(alpha);
- gc.strokeLine((int) Math.round(p1.getKey()),(int) Math.round(p1.getValue()),
- (int) Math.round(p2.getKey()),(int) Math.round(p2.getValue()));
- distance -= distanceMod;
- currAngle += angle;
- p2 = nxtPair(p1,currAngle,distance);
- alpha -= alphaMod;
- }
- }
- else{
- distanceMod = distance / revs;
- alphaMod = 1.0 / revs;
- int revCount = 0;
- for(int i = 0; i < maxIt; i++){
- gc.setGlobalAlpha(alpha);
- gc.strokeLine((int) Math.round(p1.getKey()),(int) Math.round(p1.getValue()),
- (int) Math.round(p2.getKey()),(int) Math.round(p2.getValue()));
- if(i * Math.abs(angle) > ((revCount + 1) * 2 * Math.PI)){
- distance -= distanceMod;
- alpha -= alphaMod;
- revCount++;
- }
- currAngle += angle;
- p2 = nxtPair(p1,currAngle,distance);
- }
- }
- }
- private Pair<Double, Double> nxtPair(Pair<Double, Double> p1, double angle, double distance){
- System.out.println("next pair angle: " + angle);
- double x2 = distance * Math.cos(angle) + p1.getKey();
- double y2 = distance * Math.sin(angle) + p1.getValue();
- return new Pair(x2,y2);
- }
- private Boolean goodInput(){
- try{
- width = Integer.parseInt(pngWidthTF.getText());
- inputValMap.put("width", true);
- }
- catch(NumberFormatException nfe){
- System.out.println("Error: " + nfe);
- pngWidthTF.setText("Error");
- inputValMap.put("width", false);
- }
- try{
- height = Integer.parseInt(pngHeightTF.getText());
- inputValMap.put("height", true);
- }
- catch(NumberFormatException nfe){
- System.out.println("Error: " + nfe);
- pngHeightTF.setText("Error");
- inputValMap.put("height", false);
- }
- try{
- revs = Integer.parseInt(revsTF.getText());
- inputValMap.put("revs", true);
- }
- catch(NumberFormatException nfe){
- System.out.println("Error: " + nfe);
- revsTF.setText("Error");
- inputValMap.put("revs", false);
- }
- for(String key : inputValMap.keySet()){
- if(inputValMap.get(key) == false){
- return false;
- }
- }
- return true;
- }
- public void take(final Canvas canvas) {
- final WritableImage writableImage = new WritableImage((int) canvas.getWidth(), (int) canvas.getHeight());
- final WritableImage snapshot = canvas.snapshot(new SnapshotParameters(), writableImage);
- String angleStr = String.valueOf(angle);
- angleStr = angleStr.replace(".","_");
- String fileName = "angles" + width + "x" + height + "_" + angleStr +
- ".png";
- try {
- ImageIO.write(SwingFXUtils.fromFXImage(snapshot, null), "PNG", new File(fileName));
- System.out.println("png written");
- } catch (final IOException e) {
- System.out.println("Snapshot could not be taken." + e);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement