判斷一個點是否在矩形內部

題目

在二維座標系中,所有的值都是double類型,那麼一個矩形可以有4個點來代表,(x1,y1)爲最左的點,(x2,y2)爲最上的點,(x3,y3)爲最下的點,(x4,y4)爲最右的點。給定4個點代表的矩形,再給定一個點(x,y),判斷(x,y)是否在矩形中。

問題分析

1.如果矩形的邊平行於x軸或者平行於y軸
2.矩形的邊並不平行於x軸或者y軸

JAVA代碼實現

package otherquestions;

public class IsInside1209 {

	/**
	 * 判斷某個點是否在矩形內
	 * @param x1   矩形的左邊界的橫座標
	 * @param y1   矩形的左邊界的縱座標
	 * @param x4   矩形的右邊界的橫座標
	 * @param y4   矩形的右邊界的縱座標
	 * @param x  待測點的橫座標
	 * @param y  待測點的縱座標
	 * @return   判斷結果:是或者不是
	 */
	public boolean isInside(double x1, double y1, double x4, double y4,
			double x, double y) {
		if (x <= x1) {
			return false;
		}
		if (x >= x4) {
			return false;
		}
		if (y >= y1) {
			return false;
		}
		if (y <= y4) {
			return false;
		}
		return true;
	}
	
	/**
	 * 判斷是否在不規則的矩形內
	 * 通過座標變換把矩形轉成平行的情況,在旋轉時所有的點跟着轉動
	 * @param x1
	 * @param y1
	 * @param x2
	 * @param y2
	 * @param x3
	 * @param y3
	 * @param x4
	 * @param y4
	 * @param x
	 * @param y
	 * @return
	 */
	public boolean isInside(double x1, double y1, double x2, double y2, 
			double x3, double y3, double x4, double y4, double x, double y) {
		if (y1 == y2) {
			return isInside(x1, y1, x4, y4, x, y);
		}
		double l = Math.abs(y4 - y3);
		double k = Math.abs(x4 - x3);
		double s = Math.abs(k * k + l * l);
		
		double sin = l / s;
		double cos = k / s;
		
		double x1R = cos * x1 + sin * y1;
		double y1R = -x1 * sin + y1 * cos;
		
		double x4R = cos * x4 + sin * y4;
		double y4R = -x4 * sin + y4 * cos;
		
		double xR = cos * x + sin * y;
		double yR = -x * sin + y * cos;
		return isInside(x1R, y1R, x4R, y4R, xR, yR);
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章