简体   繁体   中英

Intercept between rectangle and line drawn from center point

Consider the following diagram 在此处输入图片说明

Given that A is the center point of the rectangle and the origin, and the coordinates for B, how do you find at what point Line AB intersects the rectangle? Thanks.

Intersection coordinates relative to center (A point):

dx = B.X - A.X
dy = B.Y - A.Y
if Width * Abs(dy) < Height * Abs(dx) then
   x = Sign(dx) * Width / 2
   y = dy * x / dx
else
   y = Sign(dy) * Height / 2
   x = dx * y / dy

I recommend to use JTS Topology Suite ( https://github.com/locationtech/jts ):

// create a rectangle from center point, width and height
public static LinearRing createRectangle(Coordinate center, double width, double height){
    Coordinate upperLeft = new Coordinate(center.x - (width/2), center.y + (height/2));
    Coordinate upperRight = new Coordinate(center.x + (width/2), center.y + (height/2));
    Coordinate lowerRight = new Coordinate(center.x + (width/2), center.y - (height/2));
    Coordinate lowerLeft = new Coordinate(center.x - (width/2), center.y - (height/2));
    LinearRing rectangle = new GeometryFactory().createLinearRing(new Coordinate[]{upperLeft, upperRight, lowerRight, lowerLeft, upperLeft});
    return rectangle;
}

// calculate intersection
public static Coordinate getIntersectionFromRectangleCenterAndCoordinate(LinearRing rectangle, Coordinate someCoord){
    // get your rectangle center coordinate (A)
    Coordinate rectangleCenter = rectangle.getCentroid().getCoordinate();
    // create line from center to someCoord (A - B)
    LineString lineFromCenterToSomeCoord = new GeometryFactory().createLineString(new Coordinate[]{rectangleCenter, someCoord});
    // calculate intersection
    Geometry intersectionGeom = rectangle.intersection(lineFromCenterToSomeCoord);
    // in your case just one intersection point...
    Coordinate intersectionCoordinate = intersectionGeom.getCoordinate();
    return intersectionCoordinate;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM