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 计算几何初步的主要内容,如果未能解决你的问题,请参考以下文章

计算几何凸多边形判断方法(未完)

计算几何中的凸包类问题

如何在python openCV中计算六边形的内角

该怎样用几何画板绘制正五边形呢

立体几何初步--立体几何体

为啥三角形内角和是180度?