Solution taken from the answer:
SOLUTION ADDED IN THE CODE: thanks to tokias_k (calculate
circumference 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;
}