计算几何基础-2

文章目录

  • 直线:
  • 图形:
  • 求垂足
  • 求两圆交点
  • 直线与圆交点
  • 多边形问题
    • 判断一个点是否在任意多边形内部
    • Pick定理
  • 凸包
    • 求点集的凸包
      • 水平法:
      • 增量法:
  • 半平面
    • 半平面交
    • 求半平面交

直线:

struct Line{point p,v;Line(){}Line(point _p.point _v):p(_p),v(_v){}
}L[N];

图形:

在这里插入图片描述

求垂足

在这里插入图片描述

point vp(Line l,point p)//求p点向l做垂线得到的垂足 
{double Dis=dis(l,p);//求p到l的距离Dis Dis=Dis*Dis;double pDis=(p-l.p).length();//求AP距离pDis pDis=pDis*pDis;double vDis=sqrt(pDis-Dis);//勾股定理得到AH距离 point ans=l.p+l.v*(vDis/l.v.length());//通过方向单位向量乘长度得到路径,加起点得到答案 return ans;
}

求两圆交点

在这里插入图片描述

  1. 先求余弦定理 cosp1
  2. 反函数 角p1
  3. p1p2旋转到p11T方向
  4. 调整长度
  5. p1+p1T向量=T
    代码:
point get_intersection(circle A,circle B)
{point AB=B.o-A.o;double costheta=AB.length() * AB.length() + A.r *A.r-B.r*B.r;costheta=costheta/(2*AB.length()*A.r);//余弦定理AB=AB.rotatr(acos(costheta));//旋转theta角return A.o+AB*(A.r/AB.length()); 
} 

直线与圆交点

在这里插入图片描述
代码:

point get_intersection(circle A,Line B)
{point H=vp(B,A.o);//求垂线 double OH=(H-A.o).length();double HY=sqrt(A.r * A.r -OH * OH);return H + B.v *(HY/B.v.length());// return H + B.v *(-HY/B.v.length());
}

点+单位向量 * 长度

多边形问题

平面上n个点收尾顺次连接组成的平面图形
可能是凸多边形或者凹多边形

判断一个点是否在任意多边形内部

从这个点出发引一条射线,如果这个射线与多边形有奇数个交点则在内部,否则在外部在这里插入图片描述

double calc_S()
{double ans=0;int n=poly.size();for(int i=1;i<n;i++)ans+=poly[i-1]^poly[i];ans+=poly[n-1]^poly[0];return ans/2;
}

Pick定理

对于顶点都是整点的多边形,设其面积为S,多边形内部的点数为a,边上的点数为b,那么满足:
S = a + b/2 - 1

凸包

给出一个二维平面内的点集,如果任意两个点的连线都在点集内,则这个点集是个凸集
对于给定的散点集X,包含X的所有凸集的交集S叫做X的凸包
点就是墙上的钉子,用一个橡皮筋套在外面,收缩后形成的凸多边形就是凸包

求点集的凸包

水平法:

凸包一般使用水平法求解
将凸包分为上凸壳和下凸壳两部分,分别求解
每一部分按照x的坐标排序,用单调栈维护,利用叉积的符号判断凹凸性
在这里插入图片描述

增量法:

在这里插入图片描述
判断情况:
此时B合法
在这里插入图片描述
此时B不合法
在这里插入图片描述
不合法的点一定是最后添加入S的,且是连续的
在这里插入图片描述

//判断上凸包
sort(poly.begin(),poly.end(),cmp);
int top=0,n=poly.size();
Stack[++top]=poly[0];
for(int i=1;i<n;i++)
{point C=poly[i];while(top>1){point B=Stack[top];point A=Stack[top-1];point AB=B-A;point AC=C-A;if((AB^AC)>eps)top--;else break;}Stack[++top]=C;
}

半平面

• 顾名思义,就是平面的一半。一条直线会把平面分成两部分,就 是两个半平面。对于半平面,我们可以用直线方程式如: ax+by+c > 0 表示,更常用的是用直线表示

半平面交

• 顾名思义,就是多个半平面求交集。其结果可能是一个凸多边形、 无穷平面、直线、线段、点等。 • 什么时候需要半平面交?
• 1. 二维线性规划 (高中数学)
• 2. 求多边形的核 • 多边形的核:如果多边形中存在一个区域使得在区域中可以看到 多边形中任意位置(反之亦然),则这个区域就是多边形的核

求半平面交

• 理论上有很多很多种求法,但是在实际应用中效率最高而且最好 写的是 S&I 增量法,也就是一个一个插入半平面并且更新答案。
• 核心思想:
• 1. 选取逆时针方向为正方向,把所有的直线变成向量。
• 2. 所有的向量按照极角排序,角度相同的保留左边的。
• 3. 按照顺序每次插入一个平面,删掉右面的部分,保留左边的部 分。
###具体方法:
1.选方向,排序(如上文)
• 2.用双端队列保存构成当前核的所有向量。
• 3.按照顺序遍历所有向量,每次加入判断影响
• 假设队列中最后两条直线的交点是左图所示。如果新加入了直线 后原来的交点在直线右侧,说明最后一条直线没有用,把它从队 列中删除。

在这里插入图片描述
看遍边6要不要保留,就看5和6的交点在直线的哪一侧
在这里插入图片描述

由p指向v的向量
ans存的交点
q存的边
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

eShopOnContainers 看微服务 ②:配置 启动

一、什么是dockerDocker 是一个开源项目&#xff0c;通过把应用程序打包为可移植的、自给自足的容器&#xff08;可以运行在云端或本地&#xff09;的方式&#xff0c;实现应用程序的自动化部署。使用 Docker 的时候&#xff0c;需要创建一个应用或服务&#xff0c;然后把它和它…

字符串距离(opj )(动态规划)

题目描述2988:计算字符串距离 对于两个不同的字符串&#xff0c;我们有一套操作方法来把他们变得相同&#xff0c;具体方法为&#xff1a; 修改一个字符&#xff08;如把“a”替换为“b”&#xff09;删除一个字符&#xff08;如把“traveling”变为“travelng”&#xff09;…

2021牛客暑期多校训练营9C-Cells【LGV引理,范德蒙德行列式】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11260/C 题目大意 一个平面上&#xff0c;nnn个起点(0,ai)(0,a_i)(0,ai​)分别对应终点(i,0)(i,0)(i,0)&#xff0c;每次只能往上或者往左走。求不交路径数。 1≤n≤5105,ai<ai1,an≤1061\leq n\leq 5\times 10^5,a_i&…

[ZJOI2010]网络扩容[网络流24题]

[ZJOI2010]网络扩容[网络流24题] 题意&#xff1a; 给定一张有向图&#xff0c;每条边都有一个容量 c 和一个扩容费用 w。这里扩容费用是指将容量扩大 1 所需的费用。求&#xff1a; 在不扩容的情况下&#xff0c;1 到 n 的最大流&#xff1b; 将 1 到 n 的最大流增加 k 所需…

判断整除(opj)(动态规划)

解析 与取模结合的动归&#xff0c;正常做即可 问题 眼瞎&#xff01;&#xff01;&#xff01; 这个序列的每个数都必须用到&#xff01;&#xff01;&#xff01; if(f[i-1][j]) f[i][j]1;上面这行就是不对的&#xff01;&#xff01;&#xff01; 头疼 仔细审题 opj的题…

[CF850F] Rainbow Balls

题目链接 题目描述 给定 nnn 种颜色的球&#xff0c;每种球有 aia_iai​ 个&#xff0c;对这些球执行以下操作&#xff1a; 有顺序地任意取两个球&#xff0c;将第二个球涂上第一个球的颜色&#xff0c;重复该操作至所有球颜色相同。 求期望操作次数&#xff0c;对 109710^9…

[USACO09FEB]Revamping Trails G

题意&#xff1a; 约翰一共有 N 个牧场.由 MM 条布满尘埃的小径连接。小径可以双向通行。每天早上约翰从牧场 1 出发到牧场 N 去给奶牛检查身体。 通过每条小径都需要消耗一定的时间。约翰打算升级其中 K 条小径&#xff0c;使之成为高速公路。在高速公路上的通行几乎是瞬间完…

NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成...

本篇内容属于非实用性&#xff08;拿来即用&#xff09;介绍&#xff0c;如对框架设计没兴趣的朋友&#xff0c;请略过。 快一个月没有写博文了&#xff0c;最近忙着两件事;一&#xff1a;阅读刘墉先生的《说话的魅力》&#xff0c;以一种微妙的&#xff0c;你我大家都会经常遇…

AT4353-[ARC101D]Robots and Exits【LIS】

正题 题目链接:https://www.luogu.com.cn/problem/AT4353 题目大意 数轴上有nnn个球mmm个洞&#xff0c;每次可以将所有球左移或者右移&#xff0c;球到洞的位置会掉下去。 求有多少让球掉进不同洞的方案。 1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105 解题思路 设一个球距离…

花店橱窗布置(洛谷P1854)(动态规划)

传送门 文章目录解析问题代码解析 一道很正常的动态规划 dp[i][j]表示到第j个花瓶放了第j朵花的dp最优值 注意&#xff1a;是严格使第i朵放在j瓶 找到最优解递归输出即可 问题 又是初始化的问题&#xff01;&#xff01;&#xff01; 一开始把dp赋值成负无穷时落掉了j0的一行…

P4009 汽车加油行驶问题

题目描述&#xff1a; 题解&#xff1a; 看了很多题解&#xff0c;无论什么解法都绕不开分层图 在本题中加满油的车每次可以移动K步&#xff0c;那么我们就可以建立一个K1层的分层图&#xff0c;表示汽车油量k的状态&#xff08;油量0…k&#xff09;&#xff0c;然后根据题目…

P7294-[USACO21JAN]Minimum Cost Paths P【单调栈】

正题 题目链接:https://www.luogu.com.cn/problem/P7294 题目大意 nmn\times mnm的网格&#xff0c;当你在(x,y)(x,y)(x,y)时你有两种选择 花费x2x^2x2的代价向右移动花费cyc_ycy​的代价向下移动 qqq次询问(1,1)(1,1)(1,1)走到(x,y)(x,y)(x,y)的最小代价。 1≤n≤109,1≤m,q…

.net core i上 K8S(五).netcore程序的hostip模式

正文上一章讲了pod的管理&#xff0c;今天再分享一个pod的访问方式1.Pod的HostIP模式Pod的HostIP模式&#xff0c;可以通过宿主机访问pod内的服务&#xff0c;创建yaml文件如下apiVersion: v1 kind: Pod metadata: name: netcore-podlabels:app: netcorepod spec:containers: …

状态压缩:枚举子集(最优组队)(ybtoj)(动态规划)

解析 很裸的状压dp 但是直接暴力的话状态2n,枚举2n 乘在一起会T诶 怎么办呢&#xff1f; 使用下面这个循环&#xff0c;就可以保证只会枚举当前状态s的子集 for(int i(s-1)&s;i;i(i-1)&s){........ }证明 举举例子就挺明显了 为什么不重不漏呢&#xff1f; 首先i肯…

P7295-[USACO21JAN]Paint by Letters P【平面图欧拉公式】

正题 题目链接:https://www.luogu.com.cn/problem/P7295 题目大意 给出n∗mn*mn∗m的网格&#xff0c;每个格子上有字母&#xff0c;相同字母的四联通相邻格子为连通&#xff0c;每次询问一个子矩阵求连通块个数。 1≤n,m,q≤10001\leq n,m,q\leq 10001≤n,m,q≤1000 解题思路…

【活动(深圳)】告别2018之12.22 大湾区.NET Meet 大会 ,同时有网络直播

今年的 Connect(); 主题更加聚焦开发者工具生产力、开源&#xff0c;以及无服务器&#xff08;Serverless&#xff09;云服务。Visual Studio 2019 AI 智能加持的 IntelliCode、实时代码协作共享 Live Share&#xff0c;.NET Core 3.0的预览版本附带了大量更新&#xff0c;旨在…

带花树算法

对于一般的二分图匹配我们肯定会想到匈牙利算法&#xff0c;但是如果图中出现奇环怎么办&#xff1f;此时匈牙利算法就不可以了&#xff0c;就需要另一个算法&#xff1a;带花树算法 主要就是为了解决奇环的问题 我们匹配时会发现&#xff0c;如果存在奇环&#xff0c;传统的匈…

最短路径(状压dp)(ybtoj)

解析 “bug总有de完的一天” 头疼 暴力写的话本题显然复杂度是假的 有一个很好的思路优化时间复杂度 先用dp[k][i]表示**从第k个关键点到任意i点的最短路 跑k遍 SPFA或迪杰斯特拉 即可 然后转移时可以只考虑关键点 使状态转移数大大降低 细节 头真疼 边界条件&#xff1a; …

P3352-[ZJOI2016]线段树【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3352 题目大意 nnn个数字的一个序列&#xff0c;每次随机选择一个区间让这个区间所有数等于这个区间的最大值&#xff0c;重复qqq次&#xff0c;对每个位置求所有情况下这个位置的值的和。 1≤n,q≤4001\leq n,q\leq 4001≤n…

P2403 [SDOI2010]所驼门王的宝藏(强连通分量)(拓扑排序)

文章目录题目描述解析代码洛谷传送门题目描述 解析 看题目要求很容易想到强连通分量缩点加拓扑dp 但是问题在于存图 第一感就是和暴力和每个点连边 但那样无论点数和边数都很爆炸 随后我们发现这个图非常稀疏 所以我们可以只连有宝藏的点 然而这样边数会被一行横门这样的数据…