我有一组建立形状的X和Y点,我需要知道对象是否在其中,该对象的计算是什么?
X和Y坐标示例:
522.56055 2389.885 544.96 2386.3406 554.18616 2369.2385 535.21814 2351.396 497.5552 2355.8396
我对数学不是很满意:(因此,我希望得到一些支持来理解它的完成方式。
我到目前为止的例子,但似乎并不十分可靠:
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; }
您可以从这里开始:http : //en.wikipedia.org/wiki/Point_in_polygon
您可能还会研究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)); } }
这是使用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)); } }