題目描述:
在二維坐標系中,所有的值是double類型,那么一個矩形可以由四個點來代表,(x1, y1)為最左的點,(x2, y2)為最上的點,(x3, y3)為最下的點,(x4, y4)為最右的點。
給定4個點代表的矩形,再給定一個點(x, y),判斷(x, y)是否在矩形中
題目分析:
- 矩形的邊平行於坐標軸
此時(x1, y1)為左上角的點,(x2, y2)為右上角的點,(x3, y3)為左下角的點,(x4, y4)為右下角的點。這種情況很好判斷。
- 矩形的邊不平行於坐標軸
此時,需要旋轉矩形,使之平行於坐標軸。
#include<iostream>
#include<cmath>
using namespace std;
bool isInside(double x1, double x4, double y1, 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;
}
bool isInside(double x1, double y1, double x2, double y2, double x3, double y3,
double x4, double y4, double x, double y)
{
if(x1 == x3) return isInside(x1, x4, y1, y4, x, y);
double l = y4 - y3;
double k = x4 - x3;
double s = sqrt(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, x4r, y1r, y4r, xr, yr);
}
int main()
{
double x1, y1, x2, y2, x3, y3, x4, y4, x, y;
cin >> x1 >> y1;
cin >> x2 >> y2;
cin >> x3 >> y3;
cin >> x4 >> y4;
cin >> x >> y;
if(isInside(x1, y1, x2, y2, x3, y3, x4, y4, x, y))
{
cout << "Yes" << endl;
}
else
{
cout << "No" <<endl;
}
return 0;
}