#include <bits/stdc++.h>
using namespace std;
int T, kase, a, b;
char res[7][30] = {"", "Square", "Rectangle", "Rhombus", "Parallelogram", "Trapezium", "Ordinary Quadrilateral"};
struct Point
{
int x, y;
Point(int x = 0, int y = 0): x(x), y(y) { }
Point(const Point& rhs) : x(rhs.x), y(rhs.y) { }
};
typedef Point Vector;
Vector operator + (const Vector& A, const Vector& B) { return Vector(A.x + B.x, A.y + B.y); }
Vector operator - (const Point& A, const Point& B) { return Vector(A.x - B.x, A.y - B.y); }
Vector operator * (const Vector& A, int p) { return Vector(A.x * p, A.y * p); }
bool operator == (const Point& a, const Point &b)
{
return a.x == b.x && a.y == b.y;
}
bool operator < (const Point& p1, const Point& p2)
{
return p1.x < p2.x || (p1.x == p2.x && p1.y < p2.y);
}
int Dot(const Vector& A, const Vector& B) { return A.x * B.x + A.y * B.y; }
int Cross(const Vector& A, const Vector& B) { return A.x * B.y - A.y * B.x; }
int Length(const Vector& A) {return Dot(A, A);}
vector<Point> ConvexHull(vector<Point>& p)
{
// 预处理,删除重复点
sort(p.begin(), p.end());
p.erase(unique(p.begin(), p.end()), p.end());
int n = p.size();
int m = 0;
vector<Point> ch(n + 1);
for (int i = 0; i < n; i++)
{
while (m > 1 && Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2]) < 0) m--;
ch[m++] = p[i];
}
int k = m;
for (int i = n - 2; i >= 0; i--)
{
while (m > k && Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2]) < 0) m--;
ch[m++] = p[i];
}
if (n > 1) m--;
ch.resize(m);
return ch;
}
Point read_point()
{
scanf("%d%d", &a, &b);
return Point(a, b);
}
int solve()
{
vector<Point> p;
for (int i = 0; i < 4; i++)
p.push_back(read_point());
vector<Point> points = ConvexHull(p);
if (points.size() != 4) return 6;
Point& A = points[0], & B = points[1], & C = points[2], & D = points[3];
Vector BA = B - A, DA = D - A, CD = C - D, CB = C - B;
int lBA = Length(BA), lDA = Length(DA), lCD = Length(CD), lCB = Length(CB);
if (Dot(BA, DA) == 0 && Dot(DA, CD) == 0 && Dot(CD, CB) == 0)
if (lBA == lDA) return 1; else return 2;
if (lBA == lCD && lDA == lCB)
if (lBA == lDA) return 3; else return 4;
if (Cross(BA, CD) == 0 || Cross(DA, CB) == 0) return 5;
return 6;
}
int main(int argc, char const *argv[])
{
scanf("%d", &T);
while (T--)
printf("Case %d: %s\n", ++kase, res[solve()]);
return 0;
}
给无序的4个点,问是什么四边形。
自然是先凸包算法排序,
三个角90度,+临边相等——正方形,-长方形
对边相等,+临边相等——菱形,-平行四边形
某对边平行,梯形,否则普通四边形。