2017-01-02 76 views
0

我試圖計算給定一組點(queenx,queeny和索引號)的斜率,以確定兩個點是水平的,垂直的還是對角線的其他。以下是代碼:檢查給定座標的水平,垂直和對角線對

請注意,checkSlope方法只計算斜率。我不明白這種方法有什麼問題,給出以下幾點: [0,0] [6,1] [4,2] [7,3] [1,4] [3,5] [5, 6] [2,7],但它仍然表明有匹配,但實際上沒有。

for(int i = 0; i < 8; i++) { 
     int x1 = queenx.get(i); 
     int y1 = queeny.get(i); 

     for(int j = 0; j < 8; j++) { 
      int x2 = queenx.get(j); 
      int y2 = queeny.get(j); 

      if(i != j) { 
       double slope = Math.abs(checkSlope(x1, y1, x2, y2)); 
       try { 
        if ((slope == 1) || (slope == 0)) { 
         correct = false; 
         System.out.println("x1 = " + x1 + " y1 = " + y1 + " x2 = " + x2 + " y2 = " + y2); 
         break; 
        } 
       } catch(Exception e) { 
        correct = false; 
        break; 
       } 
      } 
     } 
    } 

    public static double checkSlope(int x1, int y1, int x2, int y2) { 
     return (double)((y2 - y1)/(x2 - x1)); 
    } 
+1

你能解釋一下checkSlope是什麼以及你如何定義「斜率」 –

+0

請向我們展示checkSlope函數。 「slope == 1」和「slope == 0」是什麼意思?什麼情況是「正確的」? –

+0

@ModusTollens在代碼中添加了該功能 –

回答

1

問題是你轉換爲雙倍太晚。該部門正在使用整數。嘗試去除外部包袱:(double)(y2 - y1)/(x2 - x1);

但是,這是一個很難做到這一點。另外,正如你所學習的那樣,浮點計算是非常棘手的。例如。如果分母爲零,斜率計算將失敗。

更簡單的方法:有4個的情況:

  • 在同一水平線上:y1 == y2
  • 在同一垂直線上:x1 == x2
  • 在相同的正斜率對角:y2 - y1 == x2 - x1
  • 在相同的負斜率對角線上:y2 - y1 == x1 - x2

你只需要測試這四種情況。您可以通過分解差異使事情變得整潔:

int dy = y2 = y1; 
int dx = x2 - x1; 
if (dx == 0 || dy == 0 || dx == dy || dx == -dy) { 
    // match! 
} 

如果你喜歡,你可以替換最後兩個「或」例之一:abs(dx) == abs(dy)

+0

我將如何解決我目前的方法? –

+0

查看新增加的內容,但是請注意,如果分母爲零,它仍然會失敗。斜坡在這裏是錯誤的工具。沒關係。編程通常需要在找到最佳之前嘗試不同的方法。 – Gene

+0

這仍然得到8皇后問題的錯誤答案... –