POJ 1931 Biometrics (计算几何、标量积、向量积)

题目看起来比较有趣,模拟人脸识别,指纹识别。具体是这样的:用两组点分别表示两个几何图形,判断这两个几何图形是否相似。“相似“的标准是:通过旋转和放大缩小操作能过使两个图形相等。

判断旋转要用到向量积和标量积,光用一个是不够的,因为 sin 和 cos 函数在 0 到 360 度定义域内的值不是唯一的。

判断放大缩小,只要算向量的模就可以。

#include<iostream>
#include<cmath>
#define EPS 1e-9
#define feq(a, b) (fabs((a)-(b)) < EPS)
using namespace std;

typedef struct{
	double x, y;
} POINT;

POINT vect[2][20];

double dist(POINT a, POINT b){
	return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
}

double crossProduct(POINT a, POINT b){
	POINT o = {0, 0};
	return ((a.x * b.y) - (a.y * b.x)) / (dist(a, o) * dist(b, o));
}

double dotProduct(POINT a, POINT b){
	POINT o = {0, 0};
	return ((a.x * b.x) + (a.y * b.y)) / (dist(a, o) * dist(b, o));

}

void print(POINT a[], int n){
	for(int i = 0; i < n; i++)
		cout << a[i].x << " " << a[i].y << endl;
}

int main(){
	int n;
	while(cin >> n){
		if(n == 0)
			break;
		for(int j = 0; j < 2; j++){					 //input
			POINT origin;
			cin >> origin.x >> origin.y;
			for(int i = 0 ; i < n - 1; i++){
				POINT temp, temp2;
				cin >> temp.x >> temp.y;
				temp2 = temp;
				temp.x -= origin.x;
				temp.y -= origin.y;
				vect[j][i] = temp;
				origin = temp2;
			}
		}
		bool eq = true;		
		double angle = crossProduct(vect[0][0], vect[1][0]);		//判断旋转
		double angle1 = dotProduct(vect[0][0], vect[1][0]);
		for(int i = 1; i < n - 1; i++){
			double temp = crossProduct(vect[0][i], vect[1][i]);
			double temp1 = dotProduct(vect[0][i], vect[1][i]);
			if(!feq(temp, angle) || !feq(temp1, angle1)){
				eq = false;
				break;
			}
		}
		POINT o = {0, 0};
		double ratio = dist(vect[0][0], o)/dist(vect[1][0], o);		//判断伸缩
		for(int i = 1; i < n - 1; i++){
			double temp = dist(vect[0][i], o)/dist(vect[1][i], o);
			if(!feq(temp, ratio)){
				eq = false;
				break;
			}
		}
		if(eq)
			cout << "similar" << endl;
		else
			cout << "dissimilar" << endl;

	}
}




基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值