2009-03-09 8 views
3

私は、Rectangle2DとLine2Dを持っています。私は矩形内にある線の部分だけが残るように線を「クリップ」したいと思います。矩形内に線がない場合は、線を(0,0,0,0)に設定します。基本的には、ある行に沿ったものラインをクリップする最もエレガントな方法は?

Rectangle2D.intersect(Line2D src, Line2D dest) 

または類似のものです。

java.awt.geom APIでこれを行う方法はありますか?それとも、手でコード化するエレガントな方法ですか?

答えて

0

さて、私はそれを自分でやり遂げました。

interesetedの場合は、線を矩形(getBounds)にしてからRectangle.intersect(clipRect,lineRect,intersectLineRect)を使用して交差を作成し、その交点を線に戻して解決しました。

+0

は、ラインに負の勾配がある場合には機能しません。 – necromancer

+0

この部分では、もう少し詳細を使用できます。切り取られた線の端点は、交差矩形の端に置くことができます。 –

0

一般的なことは、グラフィックスコンテキストのクリッピング領域をGraphics2D.clipで制限することです。 Graphics.createに電話すると、元の文脈に干渉しないようにすることができます。

Graphics2D g = (Graphics2D)gOrig.create(); 
try { 
    g.clip(clip); 
    ... 
} finally { 
    g.dispose(); 
} 
+0

申し訳ありませんが、私は実際にグラフィックスコンテキストで作業していません。 – Epaga

+0

これは、java.awt.geomが設計されたものです。 –

+0

それ以外の場合は、自分で数学を行うための生データがあります。 –

3

Rectangle2D.intersectLine()のソースコードは有用であるかもしれない:

outcode()のように定義される
public boolean intersectsLine(double x1, double y1, double x2, double y2) { 
    int out1, out2; 
    if ((out2 = outcode(x2, y2)) == 0) { 
     return true; 
    } 
    while ((out1 = outcode(x1, y1)) != 0) { 
     if ((out1 & out2) != 0) { 
      return false; 
     } 
     if ((out1 & (OUT_LEFT | OUT_RIGHT)) != 0) { 
      double x = getX(); 
      if ((out1 & OUT_RIGHT) != 0) { 
       x += getWidth(); 
      } 
      y1 = y1 + (x - x1) * (y2 - y1)/(x2 - x1); 
      x1 = x; 
     } else { 
      double y = getY(); 
      if ((out1 & OUT_BOTTOM) != 0) { 
       y += getHeight(); 
      } 
      x1 = x1 + (y - y1) * (x2 - x1)/(y2 - y1); 
      y1 = y; 
     } 
    } 
    return true; 
} 

:それは変化することは極めて困難であってはならない

public int outcode(double x, double y) { 
    int out = 0; 
    if (this.width <= 0) { 
     out |= OUT_LEFT | OUT_RIGHT; 
    } else if (x < this.x) { 
     out |= OUT_LEFT; 
    } else if (x > this.x + this.width) { 
     out |= OUT_RIGHT; 
    } 
    if (this.height <= 0) { 
     out |= OUT_TOP | OUT_BOTTOM; 
    } else if (y < this.y) { 
     out |= OUT_TOP; 
    } else if (y > this.y + this.height) { 
     out |= OUT_BOTTOM; 
    } 
    return out; 
} 

OpenJDKから)

trueまたはfalseを返す代わりにクリップする。

+0

このブールテストの部分はCohen-Sutherlandアルゴリズムと似ていますが、AWTのintersectsLine()ブールテストを適合させるよりもアルゴリズムの擬似コードから始める方が簡単でした。しかし、私は、 'outcode()'ヘルパー関数をそのまま使うことができると思います。 –

関連する問題