Skip to content

Instantly share code, notes, and snippets.

@gunungloli666
Created January 30, 2014 01:55
Show Gist options
  • Save gunungloli666/8701218 to your computer and use it in GitHub Desktop.
Save gunungloli666/8701218 to your computer and use it in GitHub Desktop.
package fjr.ellipse;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;
// @author moh_fajar
// @date: 31-1-2014
public class EllipseExp extends Application {
public static void main(String[] args) {
launch(args);
}
Timeline animation;
GraphicsContext gc;
Canvas canvas;
Trammel tr ;
double angle;
double canvasWidth = 450 , canvasHeight = 350 ;
@Override
public void start(Stage primaryStage) throws Exception {
Group root = new Group();
Group child = new Group();
primaryStage.setScene(new Scene(root,500, 500));
angle = 45;
tr = new Trammel(200, 150 , 100, 60, angle);
canvas = new Canvas(canvasWidth, canvasHeight);
gc = canvas.getGraphicsContext2D();
root.getChildren().add(child);
child.getChildren().addAll(canvas);
animation = new Timeline();
animation.getKeyFrames().addAll(
new KeyFrame(Duration.millis(10),
new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
angle-= Math.PI/200 ;
tr.setAngle(angle);
tr.calculatePosition();
draw(gc);
}
}));
primaryStage.show();
animation.setCycleCount(Timeline.INDEFINITE);
animation.setAutoReverse(false);
animation.play();
}
void draw(GraphicsContext gc){
gc.setFill(Color.WHITE);
gc.fillRect(0, 0, canvasWidth, canvasHeight);
gc.setStroke(Color.BLACK);
gc.strokeRect(0, 0, canvasWidth, canvasHeight);
gc.setFill(Color.RED);
gc.fillRect(tr.x, tr.y, 5, 5);
gc.setFill(Color.BLUE);
gc.fillRect(tr.x1, tr.y1, 5, 5);
gc.setFill(Color.GREENYELLOW);
gc.fillRect(tr.x2, tr.y2, 5, 5);
gc.setStroke(Color.RED);
gc.strokeLine(tr.x, tr.y, tr.x2, tr.y2);
gc.setStroke(Color.BLACK);
gc.strokeLine(tr.x2, tr.y1 - 110 , tr.x2, tr.y1 + 110);
gc.strokeLine(tr.x2- 200, tr.y1 , tr.x2 + 200, tr.y1 );
gc.setStroke(Color.BLACK);
gc.strokeOval(tr.getXCorrection() - tr.getA(), tr.getYCorrection() -
tr.getB(), 2 * tr.getA() , 2 * tr.getB());
}
class Trammel {
double angle;
double p, q;
public double x, y; // posisi dari rod
public double x1, y1 ; // posisi dari pivot 1
public double x2, y2 ; // posisi dari pivot 2
double xCorrection;
double yCorrection;
/*
* Dalam Trammel Archimedes, terdapat dua titik pivot yakni A dan B.
* Sementara yang men-trace elipse adalah titik C pada ujung trammel.
* Jarak A ke B adalah p, sementara jarak B ke C adalah q, dengan
* demikian lintasan titik C ditentukan oleh x = (p + q) cos \theta y =
* q sin theta. lihat: http://en.wikipedia.org/wiki/Trammel_of_Archimedes
*/
public Trammel(double x, double y, double p, double q, double angle) {
this.xCorrection = x;
this.yCorrection = y;
this.p = p;
this.q = q;
this.angle = angle;
}
public void setAngle(double angle) {
this.angle = angle;
}
public void calculatePosition() {
x = xCorrection+ (p + q) * Math.cos(angle);
y = yCorrection + (q) * Math.sin(angle);
x1 = x - q * Math.cos(angle);
y1 = y - q * Math.sin(angle);
x2 = x1 - p * Math.cos(angle);
y2 = y1 - p * Math.sin(angle);
}
public double getA(){return (p+q);}
public double getB(){return q ;}
public double getXCorrection() {return xCorrection;}
public double getYCorrection() {return yCorrection; }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment