2016-05-25 4 views
0

これは私の最初の質問Stackoverflowです。 私はJavaでアドベンチャーゲームのIDEを作成しています。私はwalkableエリアを設定する必要があります。この図形は既に頂点で塗りつぶすことができるポリゴンで、新しい点を追加できます。問題は、マウスの位置がポリゴンの境界線上にあるかどうかを検出できないことです。これは、形状を変形することなく新しい頂点を作成するためです。ポリゴンの枠線をクリックし、この点をポリゴンに追加する方法

ポリゴンの境界線/ストロークを選択し、このイベントをPaintComponentから登録する方法はありますか?ユーザーが塗られたポリゴンの境界線に沿ってポイントをクリックすると、クリックした点と各線分間の距離を計算する必要があります知るために任意のヘルプ

答えて

0

多角形の点を繰り返して、線を当てることができます。

Polygon p; //your polygon 
int x_mouse;//your mouse click pos 
int y_mouse; 
for (int i = 0; i < p.npoints; i ++){ 
    int x_from = 0; 
    int y_from = 0;   
    int x_to = 0; 
    int y_to = 0; 

    if (i == 0){ //i-1 == -1 -> p.npoints-1 
     x_from = p.xpoints[p.npoints-1]; 
     y_from = p.ypoints[p.npoints-1]; 
    }else{ 
     x_from = p.xpoints[i-1]; 
     y_from = p.ypoints[i-1]; 
    }  
    x_to = p.xpoints[i]; 
    y_to = p.ypoints[i]; 


    Line2D line = new Line2D.Double(x_from, y_from, x_to, y_to); 
    if (line.ptLineDist(new Point(x_mouse, y_mouse)) <= 0.01){ 
     //you hit 
    } 

} 

は 'ptLineDist(P)< 0.01' の優先されなければならない理由を参照するにはJava - Point on lineを見てみましょう。

+0

今度はポリゴンの頂点を変形しないようにソートするメソッドを実装するだけで済みます。しかし、ポリゴンの境界にあるクリックイベントは完全に機能します。どうもありがとうございました! –

+0

多角形の点はすでにソートされています。順序は描画の順序です。ポイントを中心(時計回りまたは反時計回り)でソートする場合は、 'Math.atan2(double theta)'を使用できます(http://gamedev.stackexchange.com/questions/13229/sorting-array-ofも参照してください)。 -points-in-clockwise-order) –

0

ため

感謝。 「point to line distance」を検索してください。

技術的にはエッジが非常に薄いため(領域を占有しないため)、エッジのある程度の小さな閾値距離内にあるかどうかをテストする必要があります。

+0

まず、おかげさししです。その距離をマウスイベントに登録する方法も問題です。 "distance()"のようないくつかのメソッドがあります。例:mouseEvent.getPoint()。distance(point)を計算するには、シェイプの線の幅が必要であり、それをクリックして操作します –

関連する問題