2/14 计算几何初步
Posted 钟钟终
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2/14 计算几何初步相关的知识,希望对你有一定的参考价值。
凸多边形的性质:就是指一个多边形的每一个内角都小于180180度的的多边形
向量右转意味着图像凹进去了
https://www.luogu.com.cn/problem/P3744
使得一个凸多边形中一个点移动最少的距离使之变为凹多边形
#include <bits/stdc++.h>
#define inf 1000000000.0
using namespace std;
struct node
double x,y;
node (double x=0,double y=0):x(x),y(y)
node operator- (const node &r) const
return nodex-r.x,y-r.y;
e[1005];
int n;
double ans=inf;
double cross(node e1,node e2)
return fabs(e1.x*e2.y-e1.y*e2.x);
double len(node e1,node e2)
return sqrt((e1.x-e2.x)*(e1.x-e2.x)+(e1.y-e2.y)*(e1.y-e2.y));
double go(int i)
node e1=e[i]-e[i+1],e2=e[i]-e[i+2];
return cross(e1,e2)/len(e2,node(0.0));
signed main()
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf%lf",&e[i].x,&e[i].y);
e[n+1]=e[1];e[n+2]=e[2];
for(int i=1;i<=n;i++)
ans=min(ans,go(i));
cout<<ans/2<<endl;
return 0;
叉积的简单应用
https://www.luogu.com.cn/problem/P1355
注意坐标的顺序和向量的方向
#include <bits/stdc++.h>
using namespace std;
int read()
int ret = 0, ch;
while(!isdigit(ch = getchar()) && ch != '-');
bool bm = (ch == '-'); if(bm) ch = getchar();
while(ret = ret * 10 + (ch - '0'), isdigit(ch = getchar()));
return bm ? -ret : ret;
struct node
int x,y;
bool operator==(const node &r) const
return x == r.x && y == r.y;
node operator-(const node &r) const
return (node)x-r.x,y-r.y;
a,b,c,p,q;
int cross(const node &a,const node &b) //叉积
return a.x*b.y-a.y*b.x;
bool inn(const node &a,const node &b,const node &c)
//判断在边上
return a.x>=min(b.x,c.x)&&a.x<=max(b.x,c.x)
&& a.y>=min(b.y,c.y)&&a.y<=max(b.y,c.y)
&& cross(a-b,a-c)==0;
bool innn(const node &a,const node &b,const node &c,const node &d)
//判断是否在内部
return (cross(d-c,a-d)^cross(d-c,b-d))>=0;
//若向量AB×向量BP与向量AB×向量BH同号,则q,P在AB同侧。
signed main()
a.x=read()*3;a.y=read()*3;
b.x=read()*3;b.y=read()*3;
c.x=read()*3;c.y=read()*3;
p.x=read()*3;p.y=read()*3;
q.x=(a.x+b.x+c.x)/3;
q.y=(a.y+b.y+c.y)/3;
if(p==a||p==b||p==c)
cout<<"4"<<endl;
else if(inn(p,a,b)||inn(p,b,c)||inn(p,c,a))
cout<<"3"<<endl;
else if(innn(p,q,a,b)&&innn(p,q,b,c)&&innn(p,q,c,a))
cout<<"1"<<endl;
else
cout<<"2"<<endl;
return 0;
向量a=(x1,y1)和b=(x2,y2)共线,可得到x1y2-x2y1==0
若两个点在同一条直线上,则x1y2=x2y1
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=705;
const int inf=0x3f3f3f3f;
struct node
int x,y;
e[maxn];
int n,ma;
signed main()
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld%lld",&e[i].x,&e[i].y);
for(int i=1;i<=n-1;i++)
for(int j=i+1;j<=n;j++)
int tmp=2;
node p;
p.x=e[j].x-e[i].x;p.y=e[j].y-e[i].y;
for(int g=1;g<=n;g++)
if(g==i||g==j)
continue;
node p1;
p1.x=e[g].x-e[i].x;p1.y=e[g].y-e[i].y;
if(p.x*p1.y==p.y*p1.x)
tmp++;
ma=max(ma,tmp);
cout<<ma<<endl;
return 0;
以上是关于2/14 计算几何初步的主要内容,如果未能解决你的问题,请参考以下文章