uva 11800 基础几何的图形判断

#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度,+临边相等——正方形,-长方形

对边相等,+临边相等——菱形,-平行四边形

某对边平行,梯形,否则普通四边形。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值