Add a corner to the landfill

I am creating a tool where I have a map in JavaFX. I have to draw an existing polygon on this map in order to create areas for the location service for it. Then I want to click somewhere on the map to add a new corner to this polycon. Now adding the corner to the polygon is not so difficult. When I click somewhere on the map with the right mouse button, I want to create a new corner there. But I want to add this corner to the “right” position, that is, before or after this existing corner closest to the new one, and not at the end of the polygon. In addition, the new polygon must not be cut out through the polygon (see Fig. At the end of this message).

I used the Pythagorean theorem to find the nearest point, but now my problem is that I do not want to add this angle BEFORE or AFTER the nearest corner.

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;
}

This should be the result, to be honest, I did not find how the polygon that I want as a result is called correctly.

1

+3
source share
1 answer

The solution is taken from the answer:

SOLUTION ADDED IN CODE: thanks tokias_k (calculate the circle to know where to insert the new point)

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;
}
0
source

All Articles