3

JavaFX にマップがあるツールを作成しています。そのマップ上にロケーション サービス用のゾーンを作成するために、そのマップ上に既存のポリゴンを描画する必要があります。次に、マップ上のどこかをクリックして、このポリコンに新しいコーナーを追加します。さて、多角形に角を追加することはそれほど難しくありません。マウスの右ボタンでマップ上のどこかをクリックすると、そこに新しいコーナーを作成したいと思います。しかし、そのコーナーを「右」の位置に追加したいと思います。つまり、ポリゴンの端ではなく、新しいコーナーに最も近い既存のコーナーの前後を意味します。さらに、新しいポリゴンは既存のポリゴンを通り抜けてはなりません (この投稿の最後にある図を参照)。

ピタゴラスの定理を使用して最近接点を見つけましたが、今の問題は、この最も近いコーナーの前または後にそのコーナーを追加したくないということです。

Polygon poly = new Polygon(...);  //javaFX

private void insertPoint(double x, double y)
{
  int positionInPolygon = 0;
  double minDistance = Double.MAX_VALUE;

  //find that point in the existing polygon that is nearest to the new one
  for ( int i = 0; i <= poly.getPoints().size()-1; i += 2 ) 
  {
    double cornerA_x = poly.getPoints().get(i);
    double cornerA_y = poly.getPoints().get(i+1);
    double tmpDistance = distance(x, y, cornerA_x, cornerA_y);
    if(minDistance > tmpDistance)
    {
      minDistance = tmpDistance;
      positionInPolygon = i;
    }
  }
  //Now I have the nearest point in the polygon    
  //But I don't know if I have to insert that new point BEFORE or AFTER the existing one.
  ...
}


private double distance(double x1, double y1, double x2, double y2)
{
  double result = 0;
  result = Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2,2));
  return result;
}

正直なところ、結果として必要なポリゴンがどのように正しく呼び出されるかわかりません。

1

4

1 に答える 1

0

答えから取られた解決策:

コードに追加されたソリューション: tokias_k のおかげで (円周を計算して、新しい点を挿入する場所を知ることができます)

Polygon poly = new Polygon(...);  //javaFX

private void insertPoint(double x, double y)
{
  int positionInPolygon = 0;
  double minDistance = Double.MAX_VALUE;

  //find that point in the existing polygon that is nearest to the new one
  for ( int i = 0; i <= poly.getPoints().size()-1; i += 2 ) 
  {
    double cornerA_x = poly.getPoints().get(i);
    double cornerA_y = poly.getPoints().get(i+1);
    double tmpDistance = distance(x, y, cornerA_x, cornerA_y);
    if(minDistance > tmpDistance)
    {
      minDistance = tmpDistance;
      positionInPolygon = i;
    }
  }
  //Now I have the nearest point in the polygon    

  //find out if the new point has to be inserted before or after that corner
  int[] pos = new int[2]; 
  pos[0] =positionInPolygon-2;
  pos[1] = positionInPolygon;
  //special points: first one
  if(pos[0] < 0)
    pos[0] = poly.getPoints().size()-2;

  double[] circumference = new double[2];
  for(int i = 0; i < 2; i++)
  {
    ObservableList<Double> tmp = FXCollections.observableArrayList(poly.getPoints());
    tmp.add(pos[i]+2, x);
    tmp.add(pos[i]+3, y);
    circumference[i] = getPolyconCircumference(tmp);
  }
  if(circumference[0] < circumference[1])
  {
    poly.getPoints().add(pos[0]+2, x);
    poly.getPoints().add(pos[0]+3, y);
    drawCircle(x, y, pos[0]);
  }
  else
  {
    poly.getPoints().add((pos[1]+2), x);
    poly.getPoints().add((pos[1]+3), y);
    drawCircle(x, y, pos[1]);
  }
}


private double getPolyconCircumference(List<Double> p)
{
  double result = 0;
  int size = p.size();

  //init with edge between first and last point of the polygon
  result = distance(p.get(size-2), p.get(size-1), 0, 1);

  for ( int i = 0; i <= poly.getPoints().size()-4; i += 2 ) 
  {
    result += distance(p.get(i), p.get(i+1), p.get(i+2), p.get(i+3));
  }
  return result;
}

private double distance(double x1, double y1, double x2, double y2)
{
  double result = 0;
  result = Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2,2));
  return result;
}
于 2016-02-16T22:32:20.263 に答える