首页 > 其他分享 >三角刨分和面积计算

三角刨分和面积计算

时间:2024-01-29 22:56:02浏览次数:18  
标签:lf% return Point double 线段 三角 pb 计算 刨分

1. POJ2986 A Triangle and a Circle

题意:给定一个三角形,一个圆的圆心和半径,求圆和三角形的面积交

 

利用三角剖分,计算简单多边形和圆的相交面积

三角剖分的步骤:

  1. 多边形上的每条边都与圆心构成三角形
  2. 算出每个三角形与圆的相交面积
  3. 根据有向面积的正负累加到答案中

计算每个三角形与圆的相交面积,分为5种情况:

  1. 线段与圆心共线:返回0
  2. 线段完全在圆内:1个三角形的有向面积
  3. 线段完全在圆外:1个扇形的有向面积
  4. 线段一端在圆内:1个三角形+1个扇形的有向面积
  5. 线段是圆的割线:1个三角形+2个扇形的有向面积

注意:

  1. 圆心位于坐标的原点
  2. da,db 是圆心到线段两端点的距离
  3. d 是圆心到线段的最近距离
  4. pa,pb 是线段与圆的两个交点

时间:O(n*T)

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <cmath>
 5 #define x first
 6 #define y second
 7 using namespace std;
 8 
 9 typedef pair<double,double> Point;
10 const double eps=1e-8;
11 const double PI=acos(-1.0);
12 double R;
13 Point p[4],o; //顶点和圆心
14 
15 Point operator+(Point a,Point b){ //向量+
16   return Point(a.x+b.x,a.y+b.y);
17 }
18 Point operator-(Point a,Point b){ //向量-
19   return Point(a.x-b.x,a.y-b.y);
20 }
21 Point operator*(Point a,double t){ //数乘
22   return Point(a.x*t,a.y*t);
23 }
24 Point operator/(Point a,double t){ //数除
25   return Point(a.x/t,a.y/t);
26 }
27 double operator*(Point a,Point b){ //叉积
28   return a.x*b.y-a.y*b.x;
29 }
30 double operator&(Point a,Point b){ //点积
31   return a.x*b.x+a.y*b.y;
32 }
33 double len(Point a){ //模长
34   return sqrt(a&a);
35 }
36 double dis(Point a,Point b){ //距离
37   return len(b-a);
38 }
39 Point getNode(Point a,Point u,Point b,Point v){ //直线交点
40   double t=(a-b)*v/(v*u);
41   return a+u*t;
42 }
43 Point rotate(Point a,double b){ //逆转角
44   return Point(a.x*cos(b)-a.y*sin(b),a.x*sin(b)+a.y*cos(b));
45 }
46 bool onSegment(Point p,Point a,Point b){ //p在线段ab上
47   return fabs((a-p)*(b-p))<eps && ((a-p)&(b-p))<=0;
48 }
49 Point norm(Point a){ //单位向量
50   return a/len(a);
51 }
52 double getDP2(Point a,Point b,Point& pa,Point& pb){
53   Point e=getNode(a,b-a,o,rotate(b-a,PI/2)); //垂足
54   double d=dis(o,e);
55   if(!onSegment(e,a,b)) d=min(dis(o,a),dis(o,b));
56   if(R<=d) return d; //线段在圆外
57   double len=sqrt(R*R-dis(o,e)*dis(o,e));
58   pa=e+norm(a-b)*len;
59   pb=e+norm(b-a)*len; //pa,pb:线段与圆的两交点
60   return d;           //d:圆心到线段的最近距离
61 }
62 double sector(Point a,Point b){ //扇形面积
63   double angle=acos((a&b)/len(a)/len(b)); //[0,Pi]
64   if(a*b<0) angle=-angle;
65   return R*R*angle/2;
66 }
67 double getArea(Point a,Point b){ //面积的交
68   if(fabs(a*b)<eps) return 0; //共线
69   double da=dis(o,a),db=dis(o,b);
70   if(R>=da && R>=db) return a*b/2; //ab在圆内
71   Point pa,pb;
72   double d=getDP2(a,b,pa,pb); //d:圆心到线段的最近距离
73   if(R<=d) return sector(a,b); //ab在圆外
74   if(R>=da) return a*pb/2+sector(pb,b); //a在圆内
75   if(R>=db) return sector(a,pa)+pa*b/2; //b在圆内
76   return sector(a,pa)+pa*pb/2+sector(pb,b); //ab是割线
77 }
78 int main(){
79   while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf",
80   &p[0].x,&p[0].y,&p[1].x,&p[1].y,&p[2].x,&p[2].y,&o.x,&o.y,&R)!=-1){
81     for(int i=0;i<3;i++) p[i].x-=o.x,p[i].y-=o.y; //三角形顶点平移
82     o=Point(0,0); //圆心平移到原点
83     double res=0;
84     for(int i=0;i<3;i++) res+=getArea(p[i],p[(i+1)%3]);
85     printf("%.2lf\n",fabs(res)); //点可能顺时针
86   }
87   return 0;
88 }

 

标签:lf%,return,Point,double,线段,三角,pb,计算,刨分
From: https://www.cnblogs.com/rw666/p/17995534

相关文章

  • 【面试突击】计算机网络面试实战(下)
    欢迎关注公众号【11来了】,及时收到AI前沿项目工具及新技术的推送!在我后台回复「资料」可领取编程高频电子书!在我后台回复「面试」可领取硬核面试笔记!Https的工作原理Http的内容是明文传输的,铭文数据经过中间代理服务器、路由器、wifi热点等多个物理节点,如果被劫持会导致传输......
  • 计算机职业道德与工程伦理
    一、计算机伦理学概述1.工程的狭义概念工程是以满足人类需求的目标为指向,应用各种相关的知识和技术手段,调动多种自然与社会资源,通过一群人的相互协作,将某些现有实体(自然的或人造的)汇聚并建造为具有预期使用价值的人造产品的过程。工程具有社会性和探索性......
  • 基于 GPU 渲染的高性能空间包围计算
    空间包围检测在计算机图形学、虚拟仿真、工业生产等有着广泛的应用。现代煤矿开采过程中,安全一直是最大的挑战之一。地质空间中存在诸多如瓦斯积聚、地质构造异常、水文条件不利等隐蔽致灾因素,一旦被触发,可能引发灾难性的后果。因此在安全生产过程中有效的管理和规避各隐蔽致灾因......
  • 计算机语言的发展史
    第一代语言机器语言我们都知道计算机的基本计算方式都是基于二进制的方式二进制:01011011101110101010010这种代码是直接输入给计算机使用的,不经过任何的转换!第二代语言汇编语言解决人类无法读懂机器语言的问题指令代替二进制目前应用:逆向工程机器人病毒......
  • 云计算学习day5
    首先学习了如何找文件一共有三种:locate格式:locate文件(夹)优点:块(相当于目录寻找)缺点:不全,会列出所有包含内容的文件,新建的搜不到(需刷新update)which只能用于搜索命令位置$PATH(命令文件)echo$PATH(列出所有命令文件所在的文件夹)which命令=whereis(更详细)find缺点:慢(相......
  • 计算机软件
    计算机软件可以使计算机按照事先预定好的顺序完成特定的功能计算机软件按照其功能划分为系统软件和应用软件系统软件:DOS,Windows,Linux,Android,iOS,Mac应用软件:WPS,QQ,微信,吃鸡,英雄联盟,王者荣耀,绝地求生····软件、开发、软件开发人机交互(图形化界面,命令......
  • 计算机硬件
    一些物理设备按系统结构的要求构成一个有机整体为计算机软件运行提供物质基础。计算机硬件组成CPU主板内存电源、主机箱硬盘显卡键盘、鼠标显示器CPUMemory(内存)Motherboard(主板)IO设备冯·诺伊曼体系结构,又称为普林斯顿结构计......
  • 什么是计算机
    Computer:全称电子计算机,俗称为电脑电脑能够按照程序运行,自动,高速处理海量数据的现代化智能电子设备由硬件和软件两部分组成常见的形式有台式机,笔记本还有大型计算机等等广泛应用到:科学计算【卫星火箭的偏差等】、数据处理【大数据时代,物联网】、自动控制【无人机,无人驾驶汽......
  • 光计算(一): 片上人工智能光计算芯片发展背景
    以下文章来源于知乎:Lightigo作者:Lightigo链接:https://zhuanlan.zhihu.com/p/679642599?utm_campaign=shareopn&utm_medium=social&utm_oi=758427772610682880&utm_psn=1733845535713226752&utm_source=wechat_session本文仅用于学术分享,如有侵权,请联系后台作删文处理前言:今......
  • 计算机体系结构读后感
    通过强调成本、性能和能耗之间的权衡以及优秀的工程设计,阐述那些为未来技术发展奠定基础的基本原理。上述量化方法对过去的隐式并行计算机是有效的,我们相信它对未来的计算机同样有效。重要概念没有时效性但此时第6版再及时不过体系结构利用摩尔定律和登纳德缩放比例定律,构......