Skip to content

EXERCISE_15_21_Solution #71

Description

@erenkrabulut
  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))));
        }
        
        
    }
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions