圆的面积并三角形面积并

三角形面积并

#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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/34419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

9. proxy sql实现读写分离

proxy sql实现读写分离 一、proxysql介绍二、proxysql实现读写分离1、环境描述2、两台数据库配置读写分离&#xff0c;从库添加read_only参数3、安装proxysql3.1 proxysql内置库说明3.2 main库中主要的表说明 4、在后端主库创建允许proxysql连接的用户5、在proxysql上添加后端服…

假冒国企现形记:股权变更视角下的甄别分析

启信慧眼-启信宝企业版 假冒国企公告2024-06-07&#xff0c;中粮集团有限公司官网发布《关于冒名中粮企业名单公告》。公告显示&#xff0c;”有不法分子通过伪造相关材料等方式&#xff0c;以我集团子公司名义开展业务&#xff0c;进行虚假宣传。经核实&#xff0c;上述公司假…

伸展树(数据结构篇)

数据结构之伸展树 伸展树 概念&#xff1a; 伸展树是一颗对任意一个节点被访问后&#xff0c;就经过一系列的AVL树的旋转操作将该节点放到根上的特殊二叉查找树。伸展树能保证对树操作M次的时间复杂度为O(MlogN)&#xff0c;而当一个查找树的一个节点刚好处于查找树最坏的情…

物联网系统运维——实验备份与恢复,数据镜像软件DRBD介绍,DRBD的安装和应用,extundelete的安装和应用(重点),环境准备,配置设置

一.数据备份 1.数据备份的重要性 备份是系统中需要考虑的最重要的事项,虽然这在系统的整个规划,开发和测试过程中甚至占不到1%,看似不太重要且默默无闻的工作只有到恢复的时候才能真正体现出其重要性,任何数据的丢失与数据宕机&#xff0c;都是不可以被接收的。 2.数据备份策…

基于Pytorch框架构建LeNet-5模型

Pytorch 一、训练模型1.导入必要的库2.设置超参数3.数据预处理4.读取数据 二、定义卷积神经网络1.定义卷积神经网络2.定义学习率3.实例化模型并且移动到GPU4.选择优化器 三、定义调整学习率的函数1.定义调整学习率的函数 四、训练模型1.设置模型为训练模式2.遍历训练数据加载器…

文本三剑客之awk:

文本三剑客awk&#xff1a; grep 查 sed 增删改查 主要&#xff1a;增改 awk 按行取列 awk awk默认的分隔符&#xff1a;空格&#xff0c;tab键&#xff0c;多个空格自动压缩为一个。 awk的工作原理&#xff1a;根据指令信息&#xff0c;逐行的读取文本内容&#xff0c;然…

【Day02】0基础微信小程序入门-学习笔记

文章目录 模板与配置学习目标WXML 模板语法1.数据绑定&#xff08;类似于 Vue2 &#xff09;2. 事件绑定3. 条件渲染4.列表渲染 WXSS模板样式1. rpx尺寸单位2.样式导入3. 全局样式和局部样式 全局配置1. window2. tabBar 页面配置网络数据请求总结 持续更新~ 模板与配置 学习目…

C语言从头学25—— exit() 函数及 atexit() 函数

我们在 main 程序里通过 "return 0;" 这个语句来结束整个程序的运行&#xff0c;而在函数(也可以叫子程序)中使用 return 语句结束函数运行并带着返回值 (如有的话) 返回到调用者那里&#xff0c;然后继续运行后边的代码。如果在子程序那里就想结束整个程序的运行&am…

纯血国产的应用开发框架,Solon v2.8.4 发布

Solon 框架&#xff01; Java “纯血国产”应用开发框架。开放原子开源基金会&#xff0c;孵化项目。从零开始构建&#xff08;非 java-ee 架构&#xff09;&#xff0c;有灵活的接口规范与开放生态。 追求&#xff1a; 更快、更小、更简单提倡&#xff1a; 克制、简洁、高效…

easy-es Map类型字段序列化问题:Unexpected character (‘n‘ (code 110)):

Data IndexName("demo") public class EasyEsDemo {IndexIdprivate String id;private String name;private int age;// 这个Map字段因为NameFilter过滤器&#xff0c;导致fastjson序列化后为{null:"value"}这种形式&#xff0c;insert报错private Map<…

gateway整合sentinel限流

官方文档&#xff1a;https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81 从 1.6.0 版本开始&#xff0c;Sentinel 提供了 Spring Cloud Gateway 的适配模块&#xff0c;可以提供两种资源维度的限流&#xff1a; route 维度&#xff1a;即在 Spr…

【第28章】Vue实战篇之用户重置密码

文章目录 前言一、调用接口二、重置密码三、界面展示总结 前言 这里我们来通过调用后端接口来完成密码重置功能并且修改成功清除缓存重新登录。 一、调用接口 export const userResetPasswordService (data)>{return request.patch(/user/updatePwd, data) }二、重置密码…

【数据结构与算法】详解循环队列:基于数组实现高效存储与访问

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​ 目录 一、引言 &#x1f343;队列的概念 &#x1f343;循环队列的概念 &#x1f343;为什…

DIY灯光特效:霓虹灯动画制作教程

下面我们根据这张霓虹灯案例,教大家如何用智能动物霓虹灯闪烁的效果,大家可以根据思路,实现自己想要的动效效果,一起动手来做吧。 即时设计-可实时协作的专业 UI 设计工具 设置背景 新建画板尺寸为:800PX^600PX,设置背景色#120527。 绘制主题 输入自己喜欢文案,轮廓化,具体…

网络基础-协议

一、ARP 通过IP得到Mac 首先会查看缓存的arp表中是否有相应的IP和Mac对应关系&#xff0c;如果有直接进行包封装。如果没有则进行广播当对应的地址就收到广播包后会根据arp中的源地址进行单播返回相应的IP和Mac对应关系。 arp -a 查看现有的arp缓存 二、RARP反向地址解析 通过…

好公司也需要在好的价格买入

在《战胜华尔街》的第七章&#xff0c;林奇先生还进一步支出在合适的价格买入的重要性。他指出“那些股价线上涨幅度超过了收益线的股票&#xff0c;一般要么是横盘整理&#xff0c;要么是股价回调到与其盈利水平比较相当的合理价位。”因此&#xff0c;“在大牛市中&#xff0…

酒店多商户版微信小程序源码

一站式预订新体验 一、引言&#xff1a;打破传统&#xff0c;开启智能预订新时代 在数字化浪潮的推动下&#xff0c;传统的酒店预订方式已经逐渐无法满足现代人的需求。为此&#xff0c;一款集众多酒店商户于一体的“酒店多商户版小程序”应运而生&#xff0c;以其便捷、智能…

江门电子行业实施MES系统前后对比

在江门电子行业实施MES系统之前和之后的对比可以涉及以下几个方面&#xff1a; 生产效率提升&#xff1a;实施MES系统后&#xff0c;江门电子行业可以实现生产过程的实时监控和优化&#xff0c;减少生产中的浪费和停机时间&#xff0c;提高生产效率。 质量控制改善&#xff1a;…

【机器学习】机器学习重要方法——深度学习:理论、算法与实践

文章目录 引言第一章 深度学习的基本概念1.1 什么是深度学习1.2 深度学习的历史发展1.3 深度学习的关键组成部分 第二章 深度学习的核心算法2.1 反向传播算法2.2 卷积神经网络&#xff08;CNN&#xff09;2.3 循环神经网络&#xff08;RNN&#xff09; 第三章 深度学习的应用实…

webworker 入门教程

参考&#xff08;阮一峰的网络日志&#xff09;&#xff1a;https://www.ruanyifeng.com/blog/2018/07/web-worker.html Web Worker 的作用&#xff1a; 就是为 JavaScript 创造多线程环境&#xff0c;允许主线程创建 Worker 子线程&#xff0c;将一些任务分配给后者运行。在主…