Rating:1763 | 几何基础(6) 求多边形面积: 要想计算多边形的面积我们可以转化为求多个三角形的面积之和得到: 在解析几何里, △ABC的面积可以通过如下方法求得: 点坐标 => 边长 => 海伦公式 => 面积 但是问题就出现在这里了,用这种方法做的话,计算量大,精度损失。 这里就利用到叉积了: 叉积的几何意义 叉积的长度 |a × b| 可以解释成以a和b为边的平行四边形的面积。进一步就是说,三重积可以得到以a,b,c为边的平行六面体的体积。 a x b = a*b*sin θ ; a = (x1,y1) ,b = (x2,y2) ; a x b = x1y2 - x2y1 ; 所以得到 多边形面积公式:A=sigma(Ai) (i=1…N-2)(凹多边形也适用,如凹四边形,相当于一个大三角形减去一个小三角形,减去的小三角形其实就是加上负的有向面积)
代码如下: double mianji(int n) { double ans=0.0; point pt=edge[0]; for(int i=1;i<n-1;++i) { ans+=((edge[i]-pt)^(edge[i+1]-pt))/2; } return fabs(ans); }
判断点是否在线段上: 首先可以先用叉积判定点是否在线段的延长线上,或就在线上r=(p-l.s)^(p-l.e) 若r==0说明在l的线上或延长线上,情况如下: 后面还要判定是否在线段上,可以用点积判断: 分别用两端点指向p点的向量点积,t=(p-l.s)*(p-l.e) 若在线段外,两向量夹角为0,点积>=0; 否则在线段内,方向相反,两向量夹角180,点积<0 代码如下: bool online(point p,line l)//判断点是否在线段上 { return ((l.s-p)^(l.e-p)==0)&&((p-l.s)(p-l.e)<=0); }
判断点是否在凸包或在凸变形内(边上也行) 首先凸边形的点按逆时针已经排序好的情况下才可执行 若点是在凸边形内则按逆时针顺序每次指向两个点,那么它的叉积一定要么都是大于0或都是小于0,至于等于0就直接说明的边上的情况。 下面举例说明:
也可以举例p在凸边形外的情况,画图验证,肯定存在不同符号的情况
代码如下: //判断点是否在凸包内或说的凸边形内 //点已经按逆时针排序 bool inconvexpoly(point p[],point pt,int n) { for(int i=0;i<n;++i) { if(((p[(i+1)%n]-pt)^(p[i]-pt))>0)//在凸变形外 return false; if(((p[(i+1)%n]-pt)^(p[i]-pt))==0)//在边上 return true; } return true;//在凸边形内 }
继续更新中…… 以下内容于[2016-02-04 18:50:03]补充 <p style="white-space: normal;">修改:</p><p style="white-space: normal;">bool online(point p,line l)//判断点是否在线段上</p><p style="white-space: normal;">{</p><p style="white-space: normal;"> return ((((l.s-p)^(l.e-p))==0)&&((p-l.s)*(p-l.e))<=0);</p><p style="white-space: normal;">}</p><p><br/></p> |
Rating:1763 |
|