叉乘应用:判断多边形凹凸
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;
}