当前位置: 首页 > news >正文

圆的面积并三角形面积并

三角形面积并

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int maxn = 110;
#define x first
#define y second
typedef pair<double, double> PDD;
const double eps = 1e-8;
const double pi = acos(-1);
const double inf = 1e12;
PDD tr[maxn][3];
PDD q[maxn];
int n;
int sign(double x)
{if(fabs(x) < eps) return 0;if(x < 0) return -1;return 1;
}
int dcmp(double x, double y)
{if(fabs(x - y) < eps) return 0;if(x < y) return -1;return 1;
}
PDD operator + (PDD a, PDD b)
{return {a.x + b.x, a.y + b.y};
}
PDD operator - (PDD a, PDD b)
{return {a.x - b.x, a.y - b.y};
}
PDD operator * (PDD a, double t)
{return {a.x * t, a.y * t};
}
PDD operator / (PDD a, double t)
{return {a.x / t, a.y / t};
}
double operator * (PDD a, PDD b)
{return a.x * b.y - a.y * b.x;
}
double operator & (PDD a, PDD b)
{return a.x * b.x + a.y * b.y;
}
bool on_segment(PDD p, PDD a, PDD b)
{return sign((p - a) & (p - b)) <= 0;
}
PDD get_line_intersection(PDD p, PDD v, PDD q, PDD w)
{if(!sign(v * w)) return {inf, inf};auto u = p - q;double t = w * u / (v * w);auto o = p + v * t;if(!on_segment(o, p, p + v) || !on_segment(o, q, q + w)) return {inf, inf};return o;
}
double line_range(double a, int side)  // 求区间上线段并集长度,side用于区分左右
{int cnt = 0;for(int i = 0; i < n; i ++){auto t = tr[i];if(dcmp(t[0].x, a) > 0 || dcmp(t[2].x, a) < 0) continue;if(!dcmp(t[0].x, a) && !dcmp(t[1].x, a)){  // 特判一下左边和直线重合的情况if(side){q[cnt ++] = {t[0].y ,t[1].y};}}else if(!dcmp(t[2].x, a) && !dcmp(t[1].x, a)){  // 特判一下右边和直线重合的情况if(!side){q[cnt ++] = {t[2].y, t[1].y};}}else{double d[3];int u = 0;for(int j = 0; j < 3; j ++){auto o = get_line_intersection(t[j], t[(j + 1) % 3] - t[j], {a, -inf}, {0, inf * 2});if(dcmp(o.x, inf)) d[u ++] = o.y;}if(u){sort(d, d + u);q[cnt ++] = {d[0], d[u - 1]};}}}if(!cnt) return 0;for(int i = 0; i < cnt; i ++){  // 确保小的在下方,大的在上方if(q[i].x > q[i].y) swap(q[i].x, q[i].y);}sort(q, q + cnt);  // 求一遍区间合并double res = 0, st = q[0].x, ed = q[0].y;for(int i = 1; i < cnt; i ++){if(q[i].x <= ed) ed = max(ed, q[i].y);else{res += ed - st;st = q[i].x, ed = q[i].y;}}res += ed - st;return res;
}
double range_area(double a, double b)
{return (line_range(a, 1) + line_range(b, 0)) * (b - a) / 2;
}
int main()
{cin >> n;vector<double> v;for(int i = 0; i < n; i ++){for(int j = 0; j < 3; j ++){cin >> tr[i][j].x >> tr[i][j].y;v.push_back(tr[i][j].x);}sort(tr[i], tr[i] + 3);  // 排序后,方便求交点}for(int i = 0; i < n; i ++){  // 求每两条边的交点for(int j = 0; j < n; j ++){for(int x = 0; x < 3; x ++){for(int y = 0; y < 3; y ++){auto o = get_line_intersection(tr[i][x], tr[i][(x + 1) % 3] - tr[i][x],tr[j][y], tr[j][(y + 1) % 3] - tr[j][y]);if(dcmp(o.x, inf)) v.push_back(o.x);  // 如果存在交点}}}}sort(v.begin(), v.end());v.erase(unique(v.begin(), v.end()), v.end());double res = 0;for(int i = 0; i < v.size() - 1; i ++){res += range_area(v[i], v[i + 1]);}printf("%.2lf\n", res);return 0;
}

圆的面积并

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1010;
const double eps = 1e-8;
const double pi = acos(-1);
#define x first
#define y second
typedef pair<double, double> PDD;
typedef struct node
{PDD r;double R;
}Circle;
Circle a[maxn];
PDD q[maxn];
int n;
int dcmp(double x, double y)
{if(fabs(x - y) < eps) return 0;if(x < y) return -1;return 1;
}
double f(double x)  // 所有圆和X = x这条直线交集的长度
{int cnt = 0;for(int i = 0; i < n; i ++){auto X = fabs(a[i].r.x - x), R = a[i].R;if(dcmp(X, R) < 0){auto Y = sqrt(R * R - X * X);q[cnt ++] = {a[i].r.y - Y, a[i].r.y + Y};}}if(!cnt) return 0;sort(q, q + cnt); // 区间合并double res = 0, st = q[0].x, ed = q[0].y;for(int i = 1; i < cnt; i ++){if(q[i].x <= ed) ed = max(ed, q[i].y);else{res += ed - st;st = q[i].x, ed = q[i].y;}}res += ed - st;return res;
}
double simpson(double l, double r)
{auto mid = (l + r) / 2;return (r - l) * (f(l) + 4 * f(mid) + f(r)) / 6;
}
double asr(double l, double r, double s)
{double mid = (l + r) / 2;auto left = simpson(l, mid), right = simpson(mid, r);if(fabs(left + right - s) < eps) return left + right;return asr(l, mid, left) + asr(mid, r, right);
}
double get_area()
{cin >> n;double l = 2000, r = -2000; // 积分范围,根据题意来定for(int i = 0; i < n; i ++){cin >> a[i].r.x >> a[i].r.y >> a[i].R;l = min(l, a[i].r.x - a[i].R), r = max(r, a[i].r.x + a[i].R);}printf("%.3lf\n", asr(l - 100, r + 100, simpson(l, r)));
}

圆和多边形的面积并

// 求任意多边形和圆形面积交集的面积
// 利用三角剖分,将圆心和每条边的两个点连线,每次求三角形和原型交集的面积,累加求和即可。
// 要进行五种情况的分类讨论// 求三角形oab和圆面积交集的面积,圆心处于原点
PDD r;
double R;
double get_circle_triangle_area(PDD a, PDD b)
{auto da = get_dist(r, a), db = get_dist(r, b);if(dcmp(R, da) >= 0 && dcmp(R, db) >= 0) return a * b / 2;if(!sign(a * b)) return 0;PDD pa, pb;auto min_d = get_line_circle_intersection(a, b, pa, pb);if(dcmp(R, min_d) <= 0) return get_sector(a, b);if(dcmp(R, da) >= 0) return get_sector(pb, b) + a * pb / 2;if(dcmp(R, db) >= 0) return get_sector(a, pa) + pa * b / 2;return get_sector(a, pa) + pa * pb / 2 + get_sector(pb, b);
}
// 求面积,时间复杂度O(n)
double work()
{double res = 0;for(int i = 0; i < n; i ++){res += get_circle_triangle_area(q[i], q[(i + 1) % n]);}return fabs(res);
}

相关文章:

圆的面积并三角形面积并

三角形面积并 #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<vector> using namespace std; const int maxn 110; #define x first #define y second typedef pair<double, double> PDD; const d…...

Spring Data JPA介绍与CRUD实战演练

文章目录 一、Spring Data JPA 简介二、Spring Data JPA 与 MyBatis Plus 比较设计哲学和抽象层次SQL 控制学习曲线和技术要求性能与优化综合考虑 三、SpringDataJpa实战演练1. 创建user表2. 搭建Spring Boot开发环境3. pom.xml文件内容4. application.yml文件内容5. Applicati…...

Python网络爬虫实战6—下一页,模拟用户点击,切换窗口

【前期提要】感兴趣的可以看看往期文章哈~ Python网络爬虫5-实战网页爬取 Python网络爬虫4-实战爬取pdf Pyhon网络爬虫3-模拟用户点击 Python网络爬虫实战2-下载url下的pdf Python网络爬虫基础1 1.需求背景 针对长虹美菱电器说明书网页形式&#xff0c;编写爬虫代码&#xff…...

Notepad++插件 Hex-Edit

Nptepad有个Hex文件查看器&#xff0c;苦于每次打开文件需要手动开插件显示Hex&#xff0c;配置一下插件便可实现打开即调用 关联多个二进制文件&#xff0c;一打开就使用插件的方法&#xff0c;原来是使用空格分割&#xff01;&#xff01;&#xff01;...

Matlab要这样批量读取txt数据!科研效率UpUp第10期

假如我们有多组txt格式的数据&#xff1a; 其数据格式是这样的&#xff1a; 想要批量读取这些数据&#xff0c;并把他们画在一张图上&#xff0c;该怎么操作呢&#xff1f; ​之前有分享load函数的版本&#xff0c;本期进一步分享适用性更强的readtable函数的实现方法​。 首…...

buuctf----firmware

- -一定不能再ubutu22进行,我是在18(血泪教训) binwalk安装 buuctf firmware(binwalk和firmware-mod-kit的使用)_buu firmware-CSDN博客 参考博客 指令 sudo apt-get update sudo apt-get install python3-dev python3-setuptools python3-pip zlib1g-dev libmagic-dev pi…...

ssl证书90天过期?保姆级教程——使用acme.sh实现证书的自动续期

腾讯云相关文档相关参考-有的点不准确 前言 最近https到期了&#xff0c;想着手动更新一下https证书&#xff0c;结果发现证书现在的有效期只有90天&#xff0c;于是想找到一个自动更新证书的工具&#xff0c;发现了acme.sh&#xff0c;但是网上的文章质量参差不齐&#xff0…...

由于bug造成truncate table卡住问题

客户反应truncate table卡主&#xff0c;检查awr发现多个truncate在awr报告期内一直没执行完&#xff0c;如下&#xff1a; 检查ash&#xff0c;truncate table表的等待事件都是“enq: RO - fast object reuse”和“local write wait” 查找“enq: RO - fast object reuse”&am…...

Charles抓包工具系列文章(二)-- Repeat 回放http请求

一、什么是http请求回放 当我们对客户端进行抓包&#xff0c;经常会想要重试http请求&#xff0c;或者改写原有部分进行重新请求&#xff0c;都需要用到回放http请求。 还有一种场景是压力测试&#xff0c;对一个请求进行重复请求多少次&#xff0c;并加上适当的并发度。 这里…...

jemeter基本使用

后端关验签&#xff0c;设置请求头编码和token 配置编码和token...

【Golang】Steam 创意工坊 Mod 文件夹批量重命名

本文将介绍一个使用Go语言编写的脚本&#xff0c;其主要功能是解析XML文件并基于解析结果重命名文件夹。这个脚本适用于需要对文件夹进行批量重命名&#xff0c;并且重命名规则依赖于XML文件内容的情况。 脚本功能概述 Steam创意工坊下载的Mod文件夹批量重命名为id名称 运行前…...

求职刷题力扣DAY33--贪心算法part04

DAY 33 贪心算法part04 1. 452. 用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可…...

aws的eks(k8s)ingress+elb部署实践

eks&#xff08;k8s&#xff09;版本1.29 ingress 版本1.10.0 负载均衡elb 1. 创建Ingress-Nginx服务 部署项目地址【点我跳转】推荐自定义部署 可绑定acm证书什么的自己属性 这里就是aws上面Certificate Manager产品上面创建证书 导入 创建都行 对应集群版本推荐阵列GitH…...

大数据面试题之YARN

目录 1、介绍下YARN 2、YARN有几个模块 3、YARN工作机制 4、YARN有什么优势&#xff0c;能解决什么问题? 5、YARN容错机制 6、YARN高可用 7、YARN调度器 8、YARN中Container是如何启动的? 9、YARN的改进之处&#xff0c;Hadoop3.x相对于Hadoop 2.x? 10、YARN监控 1…...

最小生成树模板(prim,heap-prim,kruskal)

prim 出圈法&#xff0c;时间复杂度 O ( n 2 ) O(n^2) O(n2) #include<iostream> #include<vector> using namespace std; #define MAX_N 5000 #define inf 100000000 struct edge{int v,w; }; vector<edge>e[MAX_N5]; int d[MAX_N5],vis[MAX_N5]; int n,m…...

Centos 7 或 8配置国内yum源及epel源-1

官方教程 Yum工具详解 清理Yum缓存:[rootqfedu.com ~]# yum clean all缓存软件包信息: 提高搜索/安装软件的速度[rootqfedu.com ~]# yum makecache查询yum源信息: [rootqfedu.com ~]# yum repolist 查找软件:[rootqfedu.com ~]# yum search mysql 此命令会搜索到系…...

轻松解决Android复杂数据结构序列化

问题描述 当我编写quickupload库时&#xff0c;因为需要在 Service中进行上传任务&#xff0c;向Service传递时我发现需要传递的数据很多并且结构复杂&#xff0c;如果处理不好就会导致以下几个问题 耗时: 需要更多时间进行开发和测试以确保正确的数据处理。容易出错: 由于手…...

解析PDF文件中的图片为文本

解析PDF文件中的图片为文本 1 介绍 解析PDF文件中的图片&#xff0c;由两种思路&#xff0c;一种是自己读取PDF文件中的图片&#xff0c;然后用OCR解析&#xff0c;例如&#xff1a;使用PyMuPDF读取pdf文件&#xff0c;再用PaddleOCR或者Tesseract-OCR识别文字。另一种使用第…...

微信小程序表单

在我们的课程中&#xff0c;我们深入探讨了微信小程序表单的开发和应用。以下是我们课程的主要内容和收获&#xff1a; 一、课程目标 本课程旨在帮助学生掌握微信小程序表单的基本概念、开发流程和最佳实践。学生将学习如何创建和配置表单组件&#xff0c;处理表单数据&#xf…...

Javascript高级程序设计(第四版)--学习记录

var关键字&#xff1a;定义变量同时可以进行赋值 var message"hello" message 10 可以改变保存的值&#xff0c;也可以改变值的类型&#xff0c;但是不推荐这样写。 var声明的变量会成为包含它的函数的局部变量。 function test(){ var message "hello";…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...