作者:henu_wxj

链接:https://blog.nowcoder.net/n/550f3088f8904dcb8b0b992fd349f1c0

来源:牛客网

前提提要:向量叉积以后改用 ^ 符号,重载运算符后发现表示更清晰。

friend double operator ^ (Point a,Point b){return a.x*b.y-a.y*b.x;}

三角形面积的计算。

1.解析几何法:由众多三角形的面积公式得出的结果:

(r是三角形内切圆半径)(R是三角形外接圆半径)

其中:

2.向量叉积法:任意两边向量的叉积的绝对值的1/2即为三角形的面积。

Code:

double TriangleArea(V l1,V l2){return fabs((l1.end-l1.start)^(l2.end-l2.start))/2;
}

多边形面积的计算。

现在讨论简单多边形,不考虑自交多边形,计算时采用剖分思想,将其转化为求多个三角形面积的子问题集合。

有三种转化方法:

1.将多边形内的一点与多边形顶点连线,可将多边形划分成多个三角形,分别求出每个三角形的面积,累加起来即为多边形的面积。

如图,J为多边形内一点。

2.采用三角剖分的方法,取多边形的一个顶点作为剖分出的三角形顶点,三角形的其他点作为多边形上相邻的点,

由于叉乘有正有负,所以正好可以抵消掉多余的面积部分。面积的计算公式为:

如图,以A点为剖分顶点。

以B点为剖分顶点。

计算得到的面积都一样。

Code:

//简单多边形面积,由n个点构成Dots顶点集,按顺序存储。
double Poly_Area(){double ans=0;for(int i=1;i<n;++i){ans+=(Dots[i]-Dots[0])^(Dots[i+1]-Dots[0]);}return fabs(ans)/2.0;
}

若所取得的点不在多边形内,也不是多边形的顶点,而是原点时,多边形的面积公式也可以写成:

Code:

//简单多边形的面积,Dots[]为顶点集,n为多边形的顶点个数。
double Poly_Area2(){Dots[n]=Dots[0];double ans=0;for(int i=0;i<n;++i){ans+=(Dots[i])^(Dots[i+1]);}return fabs(ans)/2.0;
}

照例进行OJ测试:

牛客练习赛36-F:https://ac.nowcoder.com/acm/contest/328/F

前缀和+多边形面积。

ACCode:

// luogu-judger-enable-o2
//#pragma comment(linker, "/STACK:1024000000,1024000000")#include<stdio.h>
#include<string.h>
#include<math.h> //#include<map>
#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#include<fstream>
#include<iostream>
#include<algorithm>
using namespace std; #define ll long long
#define Pair pair<int,int>
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
//std::ios::sync_with_stdio(false);
//  register
const int MAXN=1e5+10;
const int INF32=0x3f3f3f3f;
const ll INF64=0x3f3f3f3f3f3f3f3f;
const int MOD=998244353;
const double PI=acos(-1.0);
const double EPS=1.0e-12;struct Point{double x,y;Point(double _x=0,double _y=0){x=_x;y=_y;}friend Point operator + (const Point &a,const Point &b){return Point(a.x+b.x,a.y+b.y);}friend Point operator - (const Point &a,const Point &b){return Point(a.x-b.x,a.y-b.y);}friend double operator ^ (Point a,Point b){return a.x*b.y-a.y*b.x;}
}Dots[MAXN];
struct V{Point start,end;double ang;V(Point _start=Point(0,0),Point _end=Point(0,0),double _ang=0.0){start=_start;end=_end;ang=_ang;}friend V operator + (const V &a,const V &b){return V(a.start+b.start,a.end+b.end);}friend V operator - (const V &a,const V &b){return V(a.start-b.start,a.end-b.end);}
}Edge[MAXN],stk[MAXN];
double Seare[MAXN];
int n;int Parellel(const V &a,const V &b){return fabs((a.end-a.start)^(b.end-b.start))<EPS;
}
Point LineInterDot(const V &l1,const V &l2){Point p;double S1=(l2.end-l1.start)^(l2.start-l1.start);double S2=(l2.start-l1.end)^(l2.start-l1.start);p.x=(l1.start.x*S2+l1.end.x*S1)/(S1+S2);p.y=(l1.start.y*S2+l1.end.y*S1)/(S1+S2);return p;
}
double TriangleArea(V l1,V l2){return fabs((l1.end-l1.start)^(l2.end-l2.start))/2;
}
double Poly_Area(){double ans=0;for(int i=1;i<n;++i){ans+=(Dots[i]-Dots[0])^(Dots[i+1]-Dots[0]);}return fabs(ans)/2.0;
}
double Poly_Area2(){Dots[n]=Dots[0];double ans=0;for(int i=0;i<n;++i){ans+=(Dots[i])^(Dots[i+1]);}return fabs(ans)/2.0;
}
int main(){int n,q;cin>>n>>q;for(int i=1;i<=n;++i){cin>>Dots[i].x>>Dots[i].y;}for(int i=1;i<n;++i){Seare[i]=Seare[i-1]+((Dots[i]-Dots[1])^(Dots[i+1]-Dots[1]))/2.0;}double sum=Seare[n-1],ans=0;
//  for(int i=1;i<n;++i){
//      cout<<Seare[i]<<" ";
//  }cout<<endl;while(q--){int a,b;double res=0;cin>>a>>b;if(a>b) swap(a,b);if(a+1==b) continue;res=Seare[b-1]-Seare[a-1];res-=((Dots[a]-Dots[1])^(Dots[b]-Dots[1]))/2;ans=max(ans,min(res,sum-res));}cout<<ans<<endl;
}
/*
4 2
0.5 0.5
10.5 0.5
10.5 10.5
0.5 10.5
1 3
4 2
*/

查看作者更多博客:https://blog.nowcoder.net/remil

acm 凹多边形面积_解析几何|面积的计算相关推荐

  1. python计算圆环的面积_巧用转化 计算圆环面积

    巧用转化,计算圆环面积 学校操场新刷了奥运五环的标志, 我与小佳想运用所学过的知识计算出其中 一个圆环的面积. 我们先确定了外圆的直径是 6 分米,内圆直径是 4 分米.然后计算出 S 外圆 = π ...

  2. java输入长和宽输出面积_用Java实现计算矩形的面积与周长

    输入长宽,计算出矩形面积与周长. 二.功能设计 编写程序,定义一个矩形类,具有长.宽.面积.周长共四个成员变量,计算面积和计算周长的两个方法,在主类中创建矩形对象,输入长和宽,输出矩形的面积和周长. ...

  3. 重叠面积_重叠面积——动点产生的重叠面积问题

    本文开始介绍重叠面积问题. 顾名思义,此类问题主要是求两个几何图形的重叠部分的面积. 解题的关键为画出图形,然后再表示面积. 文中的中考真题选自以下地区: 2019•资阳.2019•鸡西.2019黄冈 ...

  4. 解析几何--面积的计算

    前提提要:向量叉积以后改用 ^ 符号,重载运算符后发现表示更清晰. friend double operator ^ (Point a,Point b){return a.x*b.y-a.y*b.x; ...

  5. 用python计算圆的面积_用Python计算大圆距

    用python计算圆的面积 The shortest distance between two locations on the surface of Earth (or any planet) is ...

  6. c#中计算三角形面积公式_【面积系列专题】三角形面积公式之水平宽铅垂高

    点击上方蓝字关注我们 [面积系列专题] 三角形面积公式之水平宽铅垂高 TSQ中学数学微信:TSQmaths 一.本文说明 三角形的面积公式计算较多,而在平面直角坐标系中的三边都不与坐标轴平行的三角形面 ...

  7. 两条曲线所围成的面积_人教版数学六年级上册 5.3:圆的面积(一) 微课视频|知识点|课件解析|同步练习...

    [教学微课堂] [知识点] 一.圆的认识 1.日常生活中的圆 2.画图.感知圆的基本特征 (1)实物画图 (2)系绳画图 3.对比,感知圆的特征:我们以前学过的长方形.正方形.平行四边形.梯形.三角形 ...

  8. Java黑皮书课后题第4章:4.4(几何:六边形面积)六边形面积可以通过下面公式计算(s是边长) 编写程序,提示用户输入六边形的边长,然后显示它的面积

    4.4(几何:六边形面积)六边形面积可以通过下面公式计算(s是边长) 编写程序,提示用户输入六边形的边长,然后显示它的面积 题目 题目概述 运行示例 破题 代码 题目 题目概述 4.4(几何:六边形面 ...

  9. 三调 图斑地类面积_图斑地类面积理论值计算方法说明

    图斑地类面积理论值 计算方法说明 1 计算原则 1.1 面积平差原则 任何平差结果必须满足以下原则: ( 一 ) 涉及图形变化的图斑,分割或合并操作后,图斑地类面积总值应保持不变. ( 二 ) 图斑地 ...

最新文章

  1. gedit把关键字符替换为回车键
  2. java 接口文件夹_Java NIO.2 使用Path接口来监听文件、文件夹变化
  3. 关于在虚拟机上进行wp7的开发
  4. Java 高阶 —— native 关键字与 JNI
  5. cesium 页面截图_Cesium开发入门篇 | 02Cesium开发环境搭建及第一个示例
  6. 2018-04-22jenkins+maven+svn环境搭建学习心得
  7. 基于51单片机的交通灯控制系统设计
  8. 2006年最一针见血的199句话!经典
  9. 牛津大学VGG团队提出:改进遮挡检测的Tri-Layer插件 | BMVC 2022
  10. 一键去“码”的AI,还能认出带上口罩的脸
  11. gyp ERR! stack Error: Can't find Python executable python, you can set the PYT HON env variable.
  12. wordpress图像大小_为WordPress优化图像
  13. 一文看懂国内人工智能行业产业链全景(必收藏)
  14. 课堂实验一 SQL基础练习
  15. 【软件安全】API HOOK
  16. 语音识别-人工智能实验室旗下语音识别频道,汇集最新最全的语音识别新闻及资讯,让您掌握语音识别第一手的资讯-中国人工智能网-Powered by www.AiLab.cn
  17. Microsoft.Office.Interop.Word引用- 无法嵌入互操作类型
  18. 有哪些一般人不知道的数据获取方式
  19. 抵押房怎么办理房产证
  20. android手机短信转发+隐藏应用程序图片+开机自启

热门文章

  1. 沣西新城大数据产业园:打造大数据全生态链
  2. oracle 学习之:建视图时报ora-01031
  3. linux下udp多线程编程
  4. 执行带返回参数的存储过程
  5. ElasticSearch是否有架构?
  6. 【360开源】2018开源项目汇总
  7. python 验证码识别 阿里云_python3调用阿里云图像识别OCR-实现验证码识别
  8. vue $ 符号(例如vm.$data vs vm.data):读取实例属性 vs 读取 data 数据
  9. golang中new、make及取地址符()
  10. nasm实现的用vmware运行自做的linux启动盘的引导代码