2014-11-16 3 views
0

У меня есть незавершенный код, чтобы найти точки пересечения всех прямых, перпендикулярных. До сих пор у меня есть это:точки пересечения детерминированными не работают

import java.util.Scanner; 

public class CountSquares { 
    public static void main(String args[]) { 
     Scanner scan = new Scanner(System.in); 
     int lines = scan.nextInt(); 
     scan.nextLine(); 
     double[][] lineMXYC = new double[4][lines]; // stores the slope, and x 
                // and y co-ordinates and c 
                // so the line can be 
                // represented as y = mx + c 
     double x1 = 0.0, x2 = 0.0, y1 = 0.0, y2 = 0.0; 
     double slope = 0.0; 
     for (int i = 0; i < lines; i++) { 
      String input = scan.nextLine(); 
      String[] arrayOfInput = input.split(" "); 
      x1 = Integer.parseInt(arrayOfInput[0]); 
      y1 = Integer.parseInt(arrayOfInput[1]); 
      x2 = Integer.parseInt(arrayOfInput[2]); 
      y2 = Integer.parseInt(arrayOfInput[3]); 
      if (x1 == x2) 
       slope = Double.POSITIVE_INFINITY; 
      else 
       slope = (y2 - y1)/(x2 - x1); 
      lineMXYC[0][i] = slope; 
      lineMXYC[1][i] = x1; 
      lineMXYC[2][i] = y1; 
      lineMXYC[3][i] = y1 - (slope * x1); 

     } 

     for (int j = 0; j < lines - 1; j++) { //sorts the array by slopes 
      if (lineMXYC[0][j] > lineMXYC[0][j + 1]) { 
       double TEMP = lineMXYC[0][j + 1]; 
       lineMXYC[0][j + 1] = lineMXYC[0][j]; 
       lineMXYC[0][j] = TEMP; 
      } 
     } 
     double[] pointsOfIntersectionX = new double[(int) (lines * lines/4) + 1]; //max number of points there can be 
     double[] pointsOfIntersectionY = new double[(int) (lines * lines/4) + 1]; 

     int count = 0; 
     for (int k = 0; k < lines; k++) { 
      for (int n = k; n < lines; n++) { 
       System.out.println(n + " " + k); 
       if (1/lineMXYC[0][k] == -lineMXYC[0][n]) { 
        double m1 = lineMXYC[0][k]; 
        double m2 = lineMXYC[0][n]; 
        double c1 = lineMXYC[3][k]; 
        double c2 = lineMXYC[3][n]; 
        System.out.println("m1: "+m1); 
        System.out.println("m2: "+m2); 
        System.out.println("c1: "+c1); 
        System.out.println("c2: "+c2); 
        pointsOfIntersectionX[count] = (c1 - c2)/(m2 - m1); //determinate to find x co-ordinate 
        pointsOfIntersectionY[count] = (m2 * c1 - m1 * c2) 
          /(m2 - m1); 
        System.out.println("The lines intersect at: (" 
          + pointsOfIntersectionX[count] + ", " 
          + pointsOfIntersectionY[count] + ")"); 
        count++; 
       } 
      } 
     } 

     scan.close(); 
    } 
} 

Это займет в ряду строк, а затем две точки на каждой линии, разделенные пробелами. Если я вхожу

2 
3 -1 0 8 
3 -1 0 -2 

Он отлично работает, находя точку (3, -1) Однако, если я кладу в одних и тех же значений обратной

2 
3 -1 0 -2 
3 -1 0 8 

Это дает мне (-3,0, +6,999999999999999) что является неправильным

Что пойдет не так с кодом? Я не могу определить, откуда эта проблема.

+0

Считаете ли вы, что ошибка заключается в том, что вы получаете 6,9999999999999 вместо 7? – Makoto

+0

ну, первая точка тоже рассчитана неправильно, поэтому ее не ошибка округления afaik – spyr03

+0

Хорошо. Итак, какой результат вы ожидаете? – Makoto

ответ

1

Сортировка по склонам может смешивать ваши входные данные в вашей версии. Если вы хотите поменять местами строки, поменять все данные строки:

for (int j = 0; j < lines - 1; j++) { //sorts the array by slopes 
     if (lineMXYC[0][j] > lineMXYC[0][j + 1]) { 
      for (int i = 0; i < 4; i++) { 
       double TEMP = lineMXYC[i][j + 1]; 
       lineMXYC[i][j + 1] = lineMXYC[i][j]; 
       lineMXYC[i][j] = TEMP; 
      } 
     } 
    } 

Если я могу дать вам совет:

  1. сделать отдельный класс линии для лучшего дизайна
  2. Реализовать сравнить метод или линейный компаратор
  3. используйте некоторый алгоритм сортировки, тот, который вы используете, не будет сортировать правильно для большего количества строк, например см. Java Tutorials
+0

Спасибо, когда вы скажете, что он не сортируется для большего количества строк, как получилось? Что происходит? EDIT: NVM получил его, я понимаю, почему, спасибо, указав мне в правильном направлении – spyr03

Смежные вопросы