Skip to content

EXERCISE_15_21_Solution #71

@erenkrabulut

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

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