題目
在二維座標系中,所有的值都是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);
}
}