计算几何学入门知识

今天正式开始学习计算几何,下面是常用到的一些小知识。

1 P(x1,y1), Q(x2,y2),如果R(x,y)在线段PQ上,那么一定会有x=γx1+(1-γ)x2,y=γy1+(1-γ)y2

2 矢量的叉积具有这样的性质:下面说的P,Q都是指矢量: P*Q=c.如果c小0,说明Q在P的逆时针方向;=0说明P和Q共线,大于0说明Q在P的顺时针方向

3 由矢量叉积的性质,我们可以求折线段的拐向:对于有公共端点B的线段AB和BC,如果矢量AB*矢量BC<0,说明在B点处拐向了左侧,否则拐向右侧或者3点共线。

4 判断点Q在线段P1,P2上。需要满足两个条件,一是Q在P1P2所在的直线上,即P1Q*P1P2=0.二是Q在以P1,P2为对角顶点的矩形内。前者保证Q与P1,P2共线。后者保证Q不再P1P2的延长线或者反向延长线上。后者可以通过判断3个点的坐标得出。

5 判断两条线段P1P2和Q1Q2是否相交: (Q1P1*Q1Q2)*(Q1Q2*Q1P2)>=0 &&(P1Q1*P1P2)*(P1P2*P1Q2)>=0。我们可以这样想,两条线段相交,那么他们彼此一定是跨立的,通过画图我们可以很自然的得出结论

6 整数点与Pick定理

整数点就是坐标分量为整数的点。Pick定理:设以整数点为顶点的多边形的面积为S,多边形内部的整数点数为N,多边形边界上的整数点数为L,则N+1/2*L-1=S

下面是求解的代码,外加一个多边形的面积公式

//S=Inside+1/2*OnEdge-1
typedef struct Point{
int x,y;
}POINT;
int gcd(int a,int b)
{
if(b==0)
 return a;
else
 return gcd(b,a%b);
}
int OnEdge(int n,PPINT *p)//求多边形边上的整数点的个数 
{
int ret=0;
for(int i=0;i<n;i++)
{
ret+=gcd(fabs(p[i].x-p[(i+1)%n].x),fabs(p[i].y-p[(i+1)%n].y));
return ret;
}
}
int Inside(int n,POINT *p)//求多边形内整数点的个数 
{
int area;
for(int i=0;i<n;i++)
{
area+=p[(i+1)%n].y*(p[i].x-p[(i+2)%n].x);//多边形面积的计算公式
return (fabs(area)-OnEdge(n,p))/2+1; 
}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值