acm 凹多边形面积_解析几何|面积的计算
作者: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 凹多边形面积_解析几何|面积的计算相关推荐
- python计算圆环的面积_巧用转化 计算圆环面积
巧用转化,计算圆环面积 学校操场新刷了奥运五环的标志, 我与小佳想运用所学过的知识计算出其中 一个圆环的面积. 我们先确定了外圆的直径是 6 分米,内圆直径是 4 分米.然后计算出 S 外圆 = π ...
- java输入长和宽输出面积_用Java实现计算矩形的面积与周长
输入长宽,计算出矩形面积与周长. 二.功能设计 编写程序,定义一个矩形类,具有长.宽.面积.周长共四个成员变量,计算面积和计算周长的两个方法,在主类中创建矩形对象,输入长和宽,输出矩形的面积和周长. ...
- 重叠面积_重叠面积——动点产生的重叠面积问题
本文开始介绍重叠面积问题. 顾名思义,此类问题主要是求两个几何图形的重叠部分的面积. 解题的关键为画出图形,然后再表示面积. 文中的中考真题选自以下地区: 2019•资阳.2019•鸡西.2019黄冈 ...
- 解析几何--面积的计算
前提提要:向量叉积以后改用 ^ 符号,重载运算符后发现表示更清晰. friend double operator ^ (Point a,Point b){return a.x*b.y-a.y*b.x; ...
- 用python计算圆的面积_用Python计算大圆距
用python计算圆的面积 The shortest distance between two locations on the surface of Earth (or any planet) is ...
- c#中计算三角形面积公式_【面积系列专题】三角形面积公式之水平宽铅垂高
点击上方蓝字关注我们 [面积系列专题] 三角形面积公式之水平宽铅垂高 TSQ中学数学微信:TSQmaths 一.本文说明 三角形的面积公式计算较多,而在平面直角坐标系中的三边都不与坐标轴平行的三角形面 ...
- 两条曲线所围成的面积_人教版数学六年级上册 5.3:圆的面积(一) 微课视频|知识点|课件解析|同步练习...
[教学微课堂] [知识点] 一.圆的认识 1.日常生活中的圆 2.画图.感知圆的基本特征 (1)实物画图 (2)系绳画图 3.对比,感知圆的特征:我们以前学过的长方形.正方形.平行四边形.梯形.三角形 ...
- Java黑皮书课后题第4章:4.4(几何:六边形面积)六边形面积可以通过下面公式计算(s是边长) 编写程序,提示用户输入六边形的边长,然后显示它的面积
4.4(几何:六边形面积)六边形面积可以通过下面公式计算(s是边长) 编写程序,提示用户输入六边形的边长,然后显示它的面积 题目 题目概述 运行示例 破题 代码 题目 题目概述 4.4(几何:六边形面 ...
- 三调 图斑地类面积_图斑地类面积理论值计算方法说明
图斑地类面积理论值 计算方法说明 1 计算原则 1.1 面积平差原则 任何平差结果必须满足以下原则: ( 一 ) 涉及图形变化的图斑,分割或合并操作后,图斑地类面积总值应保持不变. ( 二 ) 图斑地 ...
最新文章
- gedit把关键字符替换为回车键
- java 接口文件夹_Java NIO.2 使用Path接口来监听文件、文件夹变化
- 关于在虚拟机上进行wp7的开发
- Java 高阶 —— native 关键字与 JNI
- cesium 页面截图_Cesium开发入门篇 | 02Cesium开发环境搭建及第一个示例
- 2018-04-22jenkins+maven+svn环境搭建学习心得
- 基于51单片机的交通灯控制系统设计
- 2006年最一针见血的199句话!经典
- 牛津大学VGG团队提出:改进遮挡检测的Tri-Layer插件 | BMVC 2022
- 一键去“码”的AI,还能认出带上口罩的脸
- gyp ERR! stack Error: Can't find Python executable python, you can set the PYT HON env variable.
- wordpress图像大小_为WordPress优化图像
- 一文看懂国内人工智能行业产业链全景(必收藏)
- 课堂实验一 SQL基础练习
- 【软件安全】API HOOK
- 语音识别-人工智能实验室旗下语音识别频道,汇集最新最全的语音识别新闻及资讯,让您掌握语音识别第一手的资讯-中国人工智能网-Powered by www.AiLab.cn
- Microsoft.Office.Interop.Word引用- 无法嵌入互操作类型
- 有哪些一般人不知道的数据获取方式
- 抵押房怎么办理房产证
- android手机短信转发+隐藏应用程序图片+开机自启
热门文章
- 沣西新城大数据产业园:打造大数据全生态链
- oracle 学习之:建视图时报ora-01031
- linux下udp多线程编程
- 执行带返回参数的存储过程
- ElasticSearch是否有架构?
- 【360开源】2018开源项目汇总
- python 验证码识别 阿里云_python3调用阿里云图像识别OCR-实现验证码识别
- vue $ 符号(例如vm.$data vs vm.data):读取实例属性 vs 读取 data 数据
- golang中new、make及取地址符()
- nasm实现的用vmware运行自做的linux启动盘的引导代码