Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class Main extends Application {
- private double[] makeLineEquation(Point2D a1, Point2D a2){
- double A = a1.getY() - a2.getY();
- double B = a2.getX() - a1.getX();
- double C = a1.getX() * a2.getY() - a2.getX() * a1.getY();
- System.out.println(A + "x + " + B + "y + " + C + " = 0");
- return new double[] {A, B, C};
- }
- private boolean isLineCrossesEllipse(Point2D a1, Point2D a2, Ellipse ellipse){
- //(x1-x0)^2/a^2 + (y1-y0)^2/b^2 < 1
- // (x2-x0)^2/a^2 + (y2-y0)^2/b^2 > 1
- double x1 = Math.pow(a1.getX() - ellipse.getCenterX(),2) / Math.pow(ellipse.getRadiusX(),2);
- double y1 = Math.pow(a1.getY() - ellipse.getCenterY(),2) / Math.pow(ellipse.getRadiusY(),2);
- double x2 = Math.pow(a2.getX() - ellipse.getCenterX(),2) / Math.pow(ellipse.getRadiusX(),2);
- double y2 = Math.pow(a2.getY() - ellipse.getCenterY(),2) / Math.pow(ellipse.getRadiusY(),2);
- //(x1-x0)^2/a^2 + (y1-y0)^2/b^2 > 1
- // (x2-x0)^2/a^2 + (y2-y0)^2/b^2 < 1
- if(x1 + y1 <1 && x2 + y2 >1 || x1 + y1 >1 && x2 + y2 <1)
- return true;
- return false;
- }
- private Point2D pointBelongsSegment(Point2D interP1, Point2D interP2, Point2D segP1,
- Point2D segP2){
- //if((interP1.getX() - segP1.getX()) * (segP2.getY() - segP1.getY()) -
- // (interP1.getY() - segP1.getY()) * (segP2.getX() - segP1.getX())==0 ){
- if(interP1.getX() > segP1.getX() && interP1.getX() < segP2.getX() ||
- interP1.getX() > segP2.getX() && interP1.getX() < segP1.getX() )
- return interP1;
- else return interP2;
- }
- public Point2D interactionPoints(Point2D a1, Point2D a2, Ellipse ellipse){
- double [] coefs = makeLineEquation(a1, a2);
- double A = coefs[0];
- double B = coefs [1];
- double C = coefs[2];
- double A1;
- double B1;
- double C1;
- double D;
- double y1;
- double y2;
- double x1;
- double x2;
- double a = ellipse.getRadiusX();
- double b = ellipse.getRadiusY();
- double x0 = ellipse.getCenterX();
- double y0 = ellipse.getCenterY();
- System.out.println("A = " + A + " B = " + B + " C = " + C);
- if (isLineCrossesEllipse(a1,a2, ellipse)) {
- if (A == 0) {
- A1 = b*b;
- B1 = - 2*x0*b*b;
- C1 = b*b*x0*x0 + a*a*C*C / (B*B) + 2*y0*a*a*C/B + a*a*y0*y0 - a*a*b*b;
- D = Math.sqrt(Math.pow(B1, 2) - 4 * A1 * C1);
- x1 = (- B1 + D)/ (2 * A1);
- x2 = (- B1 - D)/ (2 * A1);
- y1 = - C/B;
- y2 = y1;
- System.out.println("IF x1 y1 = " + x1 + " " + y1 + " x2 y2 = " + x2 + " " + y2);
- }
- else {
- A1 = Math.pow((b * B) / A, 2) + Math.pow(a, 2);
- B1 = (Math.pow(b, 2) * 2 * B * C) / Math.pow(A, 2) + (Math.pow(b, 2) * 2 * B * x0) / A -
- Math.pow(a, 2) * 2 * y0;
- C1 = Math.pow(a * y0, 2) - Math.pow(a * b, 2) + Math.pow(b * x0, 2) +
- (2 * x0 * C * Math.pow(b, 2)) / A + Math.pow((b * C) / A, 2);
- D = Math.sqrt(Math.pow(B1, 2) - 4 * A1 * C1);
- y1 = (-B1 + D) / (2 * A1);
- y2 = (-B1 - D) / (2 * A1);
- x1 = (-C - B * y1) / A;
- x2 = (-C - B * y2) / A;
- System.out.println("x1 y1 = " + x1 + " " + y1 + " x2 y2 = " + x2 + " " + y2);
- }
- Point2D interactionP = pointBelongsSegment(new Point2D(x1,y1),
- new Point2D(x2,y2),a1,a2);
- System.out.println("interaction point is x: " + interactionP.getX()
- + " y: " + interactionP.getY());
- return interactionP;
- }
- else {
- System.out.println("Any interections or 2 interection");
- }
- return new Point2D(0,0);
- }
- @Override
- public void start(Stage stage) throws Exception {
- HBox hbox = new HBox();
- stage.setScene(new Scene(hbox));
- stage.sizeToScene();
- stage.show();
- Ellipse ellipse = new Ellipse();
- ellipse.setCenterX(3);
- ellipse.setCenterY(0);
- ellipse.setRadiusX(3);
- ellipse.setRadiusY(2);
- Point2D a1 = new Point2D(-2,1); //center of first ellipse
- Point2D a2 = new Point2D(3,1); //center of second ellipse
- interactionPoints(a1, a2, ellipse);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement