【发布时间】:2020-05-23 16:46:57
【问题描述】:
我无法找到合适的算法来检测用户是否选择了多边形。 这是我的例子:
- 如果用户单击多边形之一,则选择一个。
- 如果用户单击多边形二,则选择二。
- 如果用户单击多边形 3 的左侧(我不确定对此的最佳直观反应是什么,所以实际什么都没有发生)
- 如果用户点击多边形右侧的三三被选中。
- 用户点击五或四五或四将被选中。
这是我对要求的实现:
// polygons - a List which contains all Polygons from a scene
Point position = input.getMouse();
List<ChangeablePolygon> selectedPolygons = new ArrayList<>();
for (ChangeablePolygon polygon : polygons) {
polygon.setSelected(false);
if (polygon.intersects(position))
selectedPolygons.add(polygon);
}
if (selectedPolygons.size() == 1) {
selectedPolygons.get(0).setSelected(true);
} else if (selectedPolygons.size() == 2) {
ChangeablePolygon one = selectedPolygons.get(0);
ChangeablePolygon two = selectedPolygons.get(1);
if (Maths.isPolygonInPolygon(one, two)) {
two.setSelected(true);
} else if (Maths.isPolygonInPolygon(two, one)) {
one.setSelected(true);
} else if (one.getArea() < two.getArea()) {
two.setSelected(true);
} else {
one.setSelected(true);
}
}
/**
* Polygon#intersects(Point):boolean
*
* true - if the Point is in the Polygon
* false - otherwise
*
* Polygon#getArea():double
* Returns the size auf the area from the Polygon
*
* Maths#isPolygonInPolygon(Polygon polygon,Polygon inside):boolean
*
* true - if all Points from Polygon 'inside' are inside the Polygon 'Polygon'
* false - otherwise
*/
但不幸的是,它在这个测试用例上失败了。因为如果选择了一个多边形,我选择了三个多边形,我的算法无法处理这种情况。
当然,我可以简单地将我的“两个”场景扩展为这样的:
ChangeablePolygon one = selectedPolygons.get(0);
ChangeablePolygon two = selectedPolygons.get(1);
ChangeablePolygon three = selectedPolygons.get(2);
if (Maths.isPolygonInPolygon(one, two) && Maths.isPolygonInPolygon(two, three)) {
three.setSelected(true);
} else if (Maths.isPolygonInPolygon(two, one)) {
one.setSelected(true);
} else if (Maths.isPolygonInPolygon(one, two)) {
two.setSelected(true);
}
但必须有更好的解决方案。我正在寻找某种循环,如何在不为每个多边形数量添加 if-else-case 的情况下处理更多“堆叠”多边形。我没有想出有用的东西。
我应该提到我使用的引擎没有填充。不幸的是,我不能使用图形解决方案。有没有一种可能的唯一数学方法来计算这个?效率不那么重要。这是直接来自引擎的未经编辑的图像
【问题讨论】:
标签: java algorithm 2d polygon intersection