/*================================================================================
题目:输入四个点的坐标,求证四个点是不是一个矩形
关键点:
1.相邻两边斜率之积等于-1,
2.矩形边与坐标系平行的情况下,斜率无穷大不能用积判断。
3.输入四点可能不按顺序,需要对四点排序
作者:sunnyrain
日期:2007.9.2 & 2007.9.3
运行环境:vc++ 6.0
==================================================================================*/
#include<iostream>
#include<limits>
using namespace std;
const double MAX = numeric_limits<double>::max(); //斜率最大值
class Point
{
float x;
float y;
public:
Point(float _x = 0, float _y = 0):x(_x),y(_y){}
float getX() const
{
return x;
}
float getY() const
{
return y;
}
//为点重新设置坐标
void set(float _x,float _y)
{
x = _x;
y = _y;
}
//重载 == 成员操作符
bool operator == (Point& p)
{
return (this->x == p.x && this->y == p.y);
}
//重载流插入操作符
friend istream & operator >> (istream& is, Point & p)
{
return is>>p.x>>p.y;
}
};
class Line //两点形成一条直线/线段
{
Point start;
Point end;
double k; //斜率
public:
Line(){}
Line(Point s,Point e):start(s),end(e)
{
if(start.getX() - end.getX() != 0)
k = (start.getY() - end.getY())/(start.getX() - end.getX()) ;
else
k = MAX; //两点x坐标相等则斜率无穷大
}
double getK()
{
return k;
}
};
//查找数组pp中是否存在点p,是返回数组序号,否返回-1
int findPoint(Point *pp,int size,Point &p)
{
for(int i=0;i<size;i++)
{
if(pp[i] == p)
return i;
}
return -1;
}
//主函数
int main()
{
Point p[4];
Point *s[4];
int i;
for(i=0; i<4; i++)
{
cout<<"Please input the coordinates of the "<<i+1<<" point in format /"x.xx y.yy/""<<endl;
cin>>p[i];
}
/* p[0].set(0,0);
p[1].set(1,1);
p[2].set(2,0);
p[3].set(1,-1);*/
float left,up,right,down;
//获取四点x坐标最大值和最小值
left = p[0].getX(); //left为四点x坐标最小值
right = p[0].getX(); //right为四点x坐标最大值
for(i=1;i<4;i++)
{
if(left>p[i].getX())
left = p[i].getX();
if(right<p[i].getX())
right = p[i].getX();
}
//获取四点y坐标最大值和最小值
up = p[0].getY(); //up为四点y坐标最大值
down = p[0].getY(); //四点y坐标最小值
for(i=1;i<4;i++)
{
if(up<p[i].getY())
up = p[i].getY();
if(down > p[i].getY())
down = p[i].getY();
}
//判断矩形与坐标系平行情况
Point P1(left,up),P2(right,up),P3(right,down),P4(left,down);
if(findPoint(p,4,P1) != -1 && findPoint(p,4,P2) != -1 && findPoint(p,4,P3) != -1 && findPoint(p,4,P4) != -1)
{
cout<<"是矩形"<<endl;
return 0;
}
//按照顺时针方向对四点排序
for(i=0;i<4;i++)
{
if(p[i].getX() == left)
s[0] = &p[i];
else if(p[i].getY() == up)
s[1] = &p[i];
else if(p[i].getX() == right)
s[2] = &p[i];
else if(p[i].getY() == down)
s[3] = &p[i];
}
//排序后的四点顺时针相连组成矩形边
Line one(*s[0],*s[1]),two(*s[1],*s[2]),three(*s[2],*s[3]),four(*s[3],*s[0]);
cout<<"k1 = "<<one.getK()<<endl;
cout<<"k2 = "<<two.getK()<<endl;
cout<<"k3 = "<<three.getK()<<endl;
cout<<"k4 = "<<four.getK()<<endl;
//判断相邻边斜率之积是否都等于0
if(one.getK()*two.getK() == -1 || (one.getK() == 0 && two.getK() == MAX) || (one.getK() == MAX && two.getK() == 0) )
if(two.getK()*three.getK() == -1 || (two.getK() == 0 && three.getK() == MAX) || (two.getK() == MAX && three.getK() == 0) )
if(three.getK()*four.getK() == -1 || (three.getK() == 0 && four.getK() == MAX) || (three.getK() == MAX && four.getK() == 0) )
if(four.getK()*one.getK() == -1 || (four.getK() == 0 && one.getK() == MAX) || (four.getK() == MAX && one.getK() == 0) )
{
cout<<"是矩形!"<<endl;
return 0;
}
cout<<"不是矩形"<<endl;
return 0;
}