如何单击多边形边框并将此点添加到多边形
How to click a Polygon border and add this point to polygon
这是我在 Whosebug 中的第一个问题。
我正在为 JAVA 中的冒险游戏创建一个 IDE,我需要设置可步行区域。这个形状是一个多边形,我已经可以用他的顶点绘制,我可以添加新的点。问题是我无法检测鼠标位置是否仅在多边形的边界上。这是为了在不变形的情况下创建新的顶点。
是否存在任何方法 select 多边形的 border/stroke 并从 PaintComponent 注册此事件?
感谢您的帮助
为了知道用户是否单击了绘制多边形边界上的某个点,您需要计算单击点与每条线段之间的距离。搜索“point to line distance”。
由于边缘在技术上是无限薄的(它不占据任何区域),您需要测试该点是否在边缘的某个小阈值距离内。
您可以遍历多边形的点并确定您是否命中一条线。
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
}
}
看看 Java - Point on line 看看为什么 'ptLineDist(p) < 0.01' 应该是首选。
这是我在 Whosebug 中的第一个问题。 我正在为 JAVA 中的冒险游戏创建一个 IDE,我需要设置可步行区域。这个形状是一个多边形,我已经可以用他的顶点绘制,我可以添加新的点。问题是我无法检测鼠标位置是否仅在多边形的边界上。这是为了在不变形的情况下创建新的顶点。
是否存在任何方法 select 多边形的 border/stroke 并从 PaintComponent 注册此事件?
感谢您的帮助
为了知道用户是否单击了绘制多边形边界上的某个点,您需要计算单击点与每条线段之间的距离。搜索“point to line distance”。
由于边缘在技术上是无限薄的(它不占据任何区域),您需要测试该点是否在边缘的某个小阈值距离内。
您可以遍历多边形的点并确定您是否命中一条线。
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
}
}
看看 Java - Point on line 看看为什么 'ptLineDist(p) < 0.01' 应该是首选。