-
Notifications
You must be signed in to change notification settings - Fork 867
Open
Description
package exc_15_21;
import java.util.ArrayList;
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Polygon;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class Exc_15_21 extends Application {
Pane pane = new Pane();
Circle circle = new Circle(200,200,100);
Circle outerCircle = new Circle(200,200,112);
Circle innerCircle = new Circle(200,200,88);
@Override
public void start(Stage primaryStage){
circle.setFill(Color.WHITE);
circle.setStroke(Color.BLACK);
pane.getChildren().add(circle);
double angle1 = Math.toRadians(Math.random()*360);
double x1 = circle.getCenterX() + (circle.getRadius()*Math.cos(angle1));
double y1 = circle.getCenterY() - (circle.getRadius()*Math.sin(angle1));
double angle2 = Math.toRadians(Math.random()*360);
double x2 = circle.getCenterX() + (circle.getRadius()*Math.cos(angle2));
double y2 = circle.getCenterY() - (circle.getRadius()*Math.sin(angle2));
double angle3 = Math.toRadians(Math.random()*360);
double x3 = circle.getCenterX() + (circle.getRadius()*Math.cos(angle3));
double y3 = circle.getCenterY() - (circle.getRadius()*Math.sin(angle3));
ArrayList<Circle> circles = new ArrayList<>();
Circle c1 = new Circle(x1,y1,12);
Circle c2 = new Circle(x2,y2,12);
Circle c3 = new Circle(x3,y3,12);
circles.add(c1);
circles.add(c2);
circles.add(c3);
display(circles);
pane.setOnMouseDragged(e -> {
for(int i=0 ; i< circles.size(); i++)
{
if(circles.get(i).contains(e.getX(),e.getY()))
{
if( outerCircle.contains(e.getX(),e.getY()) && !innerCircle.contains(e.getX(),e.getY()) )
{
double[] pointsOnCircle = getPoints(e.getX(),e.getY());
circles.get(i).setCenterX(pointsOnCircle[0]);
circles.get(i).setCenterY(pointsOnCircle[1]);
display(circles);
}
}
}
});
primaryStage.setScene(new Scene(pane,400,400));
primaryStage.setTitle("Exc_15_21");
primaryStage.show();
}
public double[] getPoints( double x, double y)
{
double angle = (Math.atan((y-circle.getCenterY())/(x-circle.getCenterX())));
angle *= -1;
if(circle.getCenterX()>x)
{
angle +=Math.PI;
}
return new double[]{circle.getCenterX() + (circle.getRadius() * Math.cos(angle)) , circle.getCenterY() - (circle.getRadius() * Math.sin(angle))};
}
public ArrayList<Double> getSides(ArrayList<Circle> p)
{
ArrayList<Double> sides = new ArrayList<>();
sides.add(Math.sqrt(Math.pow(p.get(0).getCenterX() - p.get(1).getCenterX(), 2) + Math.pow(p.get(0).getCenterY() - p.get(1).getCenterY(), 2)));
sides.add(Math.sqrt(Math.pow(p.get(1).getCenterX() - p.get(2).getCenterX(), 2) + Math.pow(p.get(1).getCenterY() - p.get(2).getCenterY(), 2)));
sides.add(Math.sqrt(Math.pow(p.get(2).getCenterX() - p.get(0).getCenterX(), 2) + Math.pow(p.get(2).getCenterY() - p.get(0).getCenterY(), 2)));
return sides;
}
public ArrayList<Double> getAngles(ArrayList<Double> sides)
{
ArrayList<Double> angles = new ArrayList<>();
angles.add(Math.toDegrees(Math.acos((sides.get(0) * sides.get(0) - sides.get(1) * sides.get(1) - sides.get(2) * sides.get(2)) / (-2 * sides.get(1) * sides.get(2)))));
angles.add(Math.toDegrees(Math.acos((sides.get(1) * sides.get(1) - sides.get(0) * sides.get(0) - sides.get(2) * sides.get(2)) / (-2 * sides.get(0) * sides.get(2)))));
angles.add(Math.toDegrees(Math.acos((sides.get(2) * sides.get(2) - sides.get(1) * sides.get(1) - sides.get(0) * sides.get(0)) / (-2 * sides.get(0) * sides.get(1)))));
return angles;
}
public void display(ArrayList<Circle> circles)
{
pane.getChildren().clear();
pane.getChildren().add(circle);
Polygon triangle = new Polygon();
ObservableList<Double> points = triangle.getPoints();
for(int i=0 ; i<circles.size(); i++)
{
points.add(circles.get(i).getCenterX());
points.add(circles.get(i).getCenterY());
}
triangle.setStroke(Color.BLACK);
triangle.setFill(Color.WHITE);
pane.getChildren().add(triangle);
ArrayList<Double> angles = getAngles(getSides(circles));
for(int i=0 ; i<circles.size(); i++)
{
pane.getChildren().add(circles.get(i));
pane.getChildren().add(new Text( circles.get(i).getCenterX()+5 , circles.get(i).getCenterY()-18 , String.format("%.2f", angles.get(i))));
}
}
}
Metadata
Metadata
Assignees
Labels
No labels