叉乘应用:判断多边形凹凸
P × Q
①若结果为正,则P在Q的顺时针方向;
②若结果为负,则P在Q的逆时针方向;
③若结果为零,则P与Q共线,也就是平行,可能同向可能反向

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;

int main() {
	double px[100],py[100];
	double ax[100],ay[100];
	double ex;
	int n;
	cin >> n;
	for(int i = 0; i < n; ++i) {
		cin >> px[i] >> py[i];
	}
	cin >> ex; //ex为正则放大,为负则缩小;
	for(int i = 0; i < n; ++i) {
		double v1x = px[i==0?n-1:i-1] - px[i],
		    v1y = py[i==0?n-1:i-1] - py[i];
		double v2x = px[i==n-1?0:i+1] - px[i],
		    v2y = py[i==n-1?0:i+1] - py[i];
		double no1 = sqrt(v1x * v1x + v1y * v1y);
		double no2 = sqrt(v2x * v2x + v2y * v2y);
		//double s1 = v1y / no1,s2 = v2y / no2;
		//cout << "sin1 : " <<s1 << " ; "<<"sin2 : " <<s2<<endl;
		double judge = v1x * v2y - v2x * v1y;
		//cout << "judge: "<< judge <<endl;
		v1x /= no1; v1y /= no1;
		v2x /= no2; v2y /= no2;
		//double cos = (v1x * v2x + v1y * v2y) / (no1 * no2);
		//cout << "cos : " << cos <<endl;
		double l = -ex/sqrt((1 - (v1x * v2x + v1y * v2y)) / 2);
		if(judge > 0) l = -l;
		ax[i] = v1x + v2x;
		ay[i] = v1y + v2y;
		l /= sqrt(ax[i] * ax[i] + ay[i] * ay[i]);
		ax[i] *= l; ay[i] *= l;
		ax[i] += px[i]; ay[i] += py[i];
	}
	for(int i = 0; i < n; ++i) {
		cout << "("<<ax[i]<<" , "<<ay[i]<<")"<<endl;
	}
	return 0;
}
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐