-2

私は自分の問題の解決策を探していましたが、完全に理解できるものは見つかりませんでした。解決策に自由にリンクしてください。

他の2つの2Dの通常の長方形の交点である長方形のx、y座標を計算したいと思います。

  (x0,y0)      
    +------------+
    |            |
    |    (x4,y4) |
    |       +----------+
    |       |    |     |
    +-------|----+     |
            |  (x2,y2) |
            |          |
            +----------+
                     (x5,y5)

基本的に、交差する長方形の座標が必要です。これをCで実装しますが、答えは擬似コードにすることができます。

ありがとう

編集:私が探しているのは、上記の例だけの解決策ではなく、任意の2つの2Dの通常の長方形の間の交差の長方形を見つけるアルゴリズムです

4

4 に答える 4

4

左上隅の座標は次の式で与えられます(max(x4, x0), max(y4, y0))

右下隅の座標は次の式で与えられます(min(x2, x5), min(y2, y5))

交差点がないmax(x4, x0) > min(x2, x5)場合。max(y4,y0) > min(y2, y5)

于 2012-07-18T20:44:42.317 に答える
0

これはコメントとして投稿するのに長すぎると感じました:あなたはグーグルを使ってみましたか?利用可能なリンクはたくさんあります(多くはstackoverflowから):

重なり合う長方形の座標を取得する方法

重なり合う長方形の領域を見つけるための効率的なアルゴリズムとは何ですか

x / yグリッド上の2つの長方形間のオーバーラップを計算しますか?

http://www.leetcode.com/2011/05/determine-if-two-rectangles-overlap.html

あなたが貧弱なgoogle-fuを持っている場合:

http://www.google.com/search?q=find+coordinates+for+overlapping+rectangle

于 2012-07-18T20:46:53.837 に答える
0

2つの座標は、交差する三角形のそれぞれに属しているため、すでにわかっています。

他の2つは、2つの辺の交差アルゴリズムを使用して見つけることができます。最初に交差する辺の一次方程式を見つけ、次にそれらを使用して2本の線の交点を見つけます。

于 2012-07-18T20:48:32.630 に答える
0

これは同じためのJavaプログラムです。ここでは、長方形は任意の2つのコーナーポイント(p1とp2)で構成されています。

長方形を検証できます共通領域の長方形があるかどうかを確認できます

交差する長方形とその領域(Java)を取得できます。

パッケージcom.prb.problemSolvingSkill;

java.util.Arraysをインポートします。

パブリッククラスRectangle{

public class Point {
    /*
     * This is a 2D point with coordinate (x,y)
     */
    double x;
    double y;

    Point() {
        this.x = 0;
        this.y = 0;
    }

    Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public String show() {
        return "( " + x + " , " + y + " )";
    }

    public boolean isEqual(Point p) {
        return this.x == p.x && this.y == p.y;
    }

}

/**
 * Rectangle is constructed by any two corner points p1 and p2
 */
Point p1, p2;

public Rectangle() {
    this.p1 = new Point();
    this.p2 = new Point();
}

public Rectangle(double x1, double y1, double x2, double y2) {
    this.p1 = new Point(x1, y1);
    this.p2 = new Point(x2, y2);

}

public Rectangle(Point p1, Point p2) {
    this.p1 = p1;
    this.p2 = p2;
}

public void show() {

    System.out.println("---------- " + this + " ------------");
    System.out.println("Point  p1 is : " + p1.show());
    System.out.println("Point  p2 is : " + p2.show());

}

public boolean validate() {

    if (this.p1.x != this.p2.x && this.p1.y != this.p2.y)
        return true;
    else
        return false;
}

public double getArea() {

    double height = Math.abs(p1.y - p2.y);
    double width = Math.abs(p1.x - p2.x);

    return height * width;
}

/**
 * This is like a utility method
 * 
 * @param rect1
 * @param rect2
 * @return
 */
public static Rectangle getIntersectedRectangle(Rectangle rect1,
        Rectangle rect2) {

    if (!hasCommonArea(rect1, rect2))
        return null;

    /*
     * If Common area exists then find Rectangle
     * 
     * Two x-coordinate of intersected rectangle will be middle two
     * x-coordinate of four x-coordinates
     */
    double[] dXArr = new double[] { rect1.p1.x, rect1.p2.x, rect2.p1.x,
            rect2.p2.x };
    double[] dYArr = new double[] { rect1.p1.y, rect1.p2.y, rect2.p1.y,
            rect2.p2.y };

    Arrays.sort(dXArr);
    Arrays.sort(dYArr);

    Rectangle inRect = new Rectangle(dXArr[1], dYArr[1], dXArr[2], dYArr[2]);

    inRect.show();
    return inRect;
}

/**
 * This is like a utility method
 * 
 * @param rect1
 * @param rect2
 * @return
 */
public static boolean hasCommonArea(Rectangle rect1, Rectangle rect2) {

    boolean flag1 = true, flag2 = true;
    if ((Math.min(rect1.p1.x, rect1.p2.x) >= Math.max(rect2.p1.x,
            rect2.p2.x))
            || (Math.max(rect1.p2.x, rect1.p2.x) <= Math.min(rect2.p1.x,
                    rect2.p2.x))) {

        flag1 = false;
    }

    if ((Math.min(rect1.p1.y, rect1.p2.y) >= Math.max(rect2.p1.y,
            rect2.p2.y))
            || (Math.max(rect1.p2.y, rect1.p2.y) <= Math.min(rect2.p1.y,
                    rect2.p2.y))) {

        flag2 = false;
    }

    if (!(flag1 && flag2))
        System.out.println("Common Area doesnot exist");

    // System.out.println("flag1 :x " + flag1 + "  flag2 :y " + flag2);

    return flag1 && flag2;
}

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Rectangle rect1 = new Rectangle(1, 1, 6, 6);
    Rectangle rect2 = new Rectangle(1, 16, 6, 20);

    if (null != getIntersectedRectangle(rect1, rect2))
        System.out.println("Area is : "
                + getIntersectedRectangle(rect1, rect2).getArea()
                + " sq unit");

}

}

于 2014-03-28T11:30:39.193 に答える