我正在创建一个工具,我在JavaFX中有一个地图。我必须在该地图上绘制现有的多边形,以便为其创建区域服务的区域。然后我想点击地图上的某个地方为这个polycon添加一个新角落。现在,为多边形添加一个角并不难。当我用鼠标右键单击地图上的某个地方时,我想在那里创建一个新的角落。但我想在“右”位置添加该角,即在最接近新角的现有角之前或之后,而不是在多边形的末尾。此外,新的多边形不应该通过esigiting polygone切割(见本文末尾的图片)。
我用毕达哥拉斯定理找到最近的点,但我现在的问题是,我不想在这个最近的角落之前或之后添加那个角落。
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;
}
这应该是结果,老实说我不知道如何正确调用我想要的多边形。
答案 0 :(得分: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; }