2010-11-10 269 views
4

我需要創建圍繞其中心旋轉的矩形(因此它們不需要平行於座標系的軸)。所以basicelly每個矩形可以通過中心-X中心-Y寬度高度角度來限定。那麼我想要做的是對這些矩形中是否包含某些點進行計算(因此不涉及任何繪圖)。我想我不能使用Rectangle2D類,因爲這些矩形將總是平行於座標系的x和y軸。通過編寫我自己的矩形類來獲得此功能的唯一方法是否存在(類似於Rectangle2D)我可以使用?在Java中旋轉矩形

+1

我得到了一個印象,你正在描述你發現某個問題的解決方案。也可以解釋你想要解決的具體問題。很可能,現在已經有針對這個問題的已經證明的解決方案/算法。 – 2010-11-10 14:51:08

+0

我想模擬智能天線。所以每個矩形的中心是一個節點(有幾個智能天線)。矩形然後是簡化的信號模式。這意味着矩形將被旋轉,以便它們指向接收器節點的方向。然後,我想計算某些天線是否處於可能被此信號干擾的信號模式/矩形中。因此,我需要一種方法來計算一個點是否包含在一個矩形中。 – gaussd 2010-11-10 14:59:01

回答

5

旋轉所有要測試的點,並使用Mihai所做的Rectangle2D的contains(Point)方法。

但是,如果你真的想旋轉矩形,你可以這樣做(這是整數版本,但可能你可以用Rectangle2D做:))。

public class TestRotate { 
    public static void main(String... args) { 

     Rectangle r = new Rectangle(50, 50, 100, 100); 
     Point check = new Point(100, 151); // clearly outside 

     System.out.println("first: " + r.contains(check)); 

     AffineTransform at = AffineTransform.getRotateInstance(
       Math.PI/4, r.getCenterX(), r.getCenterY()); 

     Polygon p = new Polygon(); 

     PathIterator i = r.getPathIterator(at); 
     while (!i.isDone()) { 
      double[] xy = new double[2]; 
      i.currentSegment(xy); 
      p.addPoint((int) xy[0], (int) xy[1]); 
      System.out.println(Arrays.toString(xy)); 

      i.next(); 
     } 

     // should now be inside :) 
     System.out.println("second: " + p.contains(check)); 
    } 
} 
+0

我們從哪裏得到Polygon Class? – 2014-05-27 04:29:00

+0

java.awt.Polygon – 2016-07-11 05:54:53

3

您可以使用Rectangle2D檢查包容,如果不是通過角度旋轉矩形(例如逆時針旋轉),而是旋轉每個需要按相同角度順時針旋轉相對於矩形中心點的點。類似於

double dx = point.x - rectangleCenter.x; 
double dy = point.y - rectangleCenter.y; 
double newX = rectangleCenter.x - dx*Math.cos(angle) + dy*Math.sin(angle); 
double newY = rectangleCenter.x - dx*Math.sin(angle) - dy*Math.cos(angle);