簡體   English   中英

檢測線與矩形的交點

[英]Detect intersections of lines with rectangles

在此處輸入圖像描述

我想檢測隨機線與隨機矩形的交點。 我的線 class 得到 4 個坐標並用它們組成一條線。 我的intersectionWith function 得到2條線並返回交點,如果沒有點則返回null。

我有 2 個功能:一個找到最近的交點並返回它(我認為在這里無關緊要):位於 Line.java

public Point closestIntersectionToStartOfLine(Rectangle rect){
    Line[] rectLines = new Line[4];
    Point[] IntersectionPoints = new Point[4];
    double minDistance=0;
    //up
    rectLines[0] = new Line(rect.getUpperLeft().getX(), rect.getUpperLeft().getY(), rect.getWidth()+rect.getUpperLeft().getX(), rect.getUpperLeft().getY());
    //right
    rectLines[1] = new Line(rect.getWidth()+rect.getUpperLeft().getX(), rect.getUpperLeft().getY(), rect.getUpperLeft().getX()+rect.getWidth(), rect.getHeight()+rect.getUpperLeft().getY());
    //down
    rectLines[2] = new Line(rect.getUpperLeft().getX()+rect.getWidth(), rect.getHeight()+rect.getUpperLeft().getY(), rect.getUpperLeft().getX(), rect.getUpperLeft().getY()+rect.getHeight());
    //left
    rectLines[3] = new Line(rect.getUpperLeft().getX(), rect.getUpperLeft().getY()+rect.getHeight(), rect.getUpperLeft().getX(), rect.getUpperLeft().getY());

    for (int i=0; i<4; i++) {
        if (intersectionWith(rectLines[i]) != null)
            IntersectionPoints[i] = intersectionWith(rectLines[i]);
    }
    for (int i=0; i<IntersectionPoints.length; i++) {
        if (i == 0)
            minDistance = rect.getUpperLeft().distance(IntersectionPoints[i]);
        else {
            if (rect.getUpperLeft().distance(IntersectionPoints[i]) < minDistance)
                Point.closestIntersectionToStartOfLine = IntersectionPoints[i];
        }
    }
    return Point.closestIntersectionToStartOfLine;
}

而這個 function 將給定線的所有交點保存到一個列表中。 位於矩形。java

 // Return a (possibly empty) List of intersection points
// with the specified line.
public java.util.List<Point> intersectionPoints(Line line) {
    List<Point> intersectionPointsList = new ArrayList<Point>();
    Line[] rectangleSides = new Line[4];
    Point[] corners = new Point[4];
    rectangleCorners(corners);
    recatngleSides(rectangleSides, corners);
    for (int i = 0; i < 4; i++) {
        Point p = line.intersectionWith(rectangleSides[i]);
        if (p != null && !intersectionPointsList.contains(p)) {
            intersectionPointsList.add(p);
        }
    }
    return intersectionPointsList;
}
public void rectangleCorners(Point[] corners) {
    double width = this.getWidth();
    double height = this.getHeight();
    double x = this.upperLeft.getX();
    double y = this.upperLeft.getY();
    //upper left
    corners[0] = this.getUpperLeft();
    //upper right
    corners[1] = new Point(x + width, y);
    //down right
    corners[2] = new Point(x + width, y + height);
    //down left
    corners[3] = new Point(x, y + height);
}

/**
 * recatngleSides.
 * Saves the lines in the 4 rectangle edges.
 *
 * @param sides  - an empty array of lines
 * @param corners - an array of edge points.
 */
public void recatngleSides(Line[] sides, Point[] corners) {
    // up
    sides[0] = new Line(corners[0], corners[1]);
    // right
    sides[1] = new Line(corners[1], corners[2]);
    // down
    sides[2] = new Line(corners[2], corners[3]);
    // left
    sides[3] = new Line(corners[3], corners[0]);
}

}

我不知道為什么,但它會將隨機點識別為交點,如圖所示。

因為,如果你看看你的“隨機”點在哪里,如果你將邊延伸到無窮大,它們實際上就是非相交矩形的邊所在的位置。 您需要實際檢查是否與矩形邊的線段相交。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM