java 计算一个对象是否在一组坐标内?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5175216/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Calculate if an object is inside a set of coordinates?
提问by Prix
I have a set of X and Y points that builds a shape and I need to know if an object is inside it or not what is the calculation to it ?
我有一组 X 和 Y 点来构建一个形状,我需要知道里面是否有一个对象,它的计算是什么?
X and Y coords example:
X 和 Y 坐标示例:
522.56055 2389.885
544.96 2386.3406
554.18616 2369.2385
535.21814 2351.396
497.5552 2355.8396
I am not really good with math :( so i would appreciate some support to understand how it is done.
我不太擅长数学:(所以我希望得到一些支持来理解它是如何完成的。
Example of what I have so far but doesnt seem very reliable:
到目前为止我所拥有但似乎不太可靠的示例:
private boolean isInsideShape(Zone verifyZone, Position object)
{
int corners = verifyZone.getCorners();
float[] xCoords = verifyZone.getxCoordinates();
float[] yCoords = verifyZone.getyCoordinates();
float x = object.getX();
float y = object.getY();
float z = object.getZ();
int i, j = corners - 1;
boolean inside = false;
for(i = 0; i < corners; i++)
{
if(yCoords[i] < y && yCoords[j] >= y || yCoords[j] < y && yCoords[i] >= y)
if(xCoords[i] + (y - yCoords[i]) / (yCoords[j] - yCoords[i]) * (xCoords[j] - xCoords[i]) < x)
inside = !inside;
j = i;
}
return inside;
}
回答by Andrey Adamovich
You may start from this: http://en.wikipedia.org/wiki/Point_in_polygon
你可以从这里开始:http: //en.wikipedia.org/wiki/Point_in_polygon
You also might look into JTS Topology Suite. And in particular use this function.
您还可以查看JTS Topology Suite。并且特别使用这个功能。
EDIT: Here is example using JTS:
编辑:这是使用 JTS 的示例:
import java.util.ArrayList;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LinearRing;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Polygon;
import com.vividsolutions.jts.geom.impl.CoordinateArraySequence;
public class GeoTest {
public static void main(final String[] args) {
final GeometryFactory gf = new GeometryFactory();
final ArrayList<Coordinate> points = new ArrayList<Coordinate>();
points.add(new Coordinate(-10, -10));
points.add(new Coordinate(-10, 10));
points.add(new Coordinate(10, 10));
points.add(new Coordinate(10, -10));
points.add(new Coordinate(-10, -10));
final Polygon polygon = gf.createPolygon(new LinearRing(new CoordinateArraySequence(points
.toArray(new Coordinate[points.size()])), gf), null);
final Coordinate coord = new Coordinate(0, 0);
final Point point = gf.createPoint(coord);
System.out.println(point.within(polygon));
}
}
Here is example using AWT (which is simpler and is part of Java SE):
这是使用 AWT 的示例(它更简单,是 Java SE 的一部分):
import java.awt.Polygon;
public class JavaTest {
public static void main(final String[] args) {
final Polygon polygon = new Polygon();
polygon.addPoint(-10, -10);
polygon.addPoint(-10, 10);
polygon.addPoint(10, 10);
polygon.addPoint(10, -10);
System.out.println(polygon.contains(0, 0));
}
}
回答by corsiKa
I've always done it like so:
我一直是这样做的:
Pick a point you know to be outside the shape.
Make a line between that point and the point you're trying to find whether it's inside the shape or not.
Count the number of sides of the shape the line crosses.
If the count is odd, the point is inside the shape.
If the count is even, the point is outside the shape.