计算几何
文章平均质量分 74
丶阿明
Hello World!
展开
-
ZOJ 1081 Points Within
分析:按顺序给你n边形的n个坐标,和一些点的坐标,让你判断这些点是不是在多边形内。用改进弧长法来求解比较好,原理可参看网上的,下面附我写的代码。# include typedef struct point { int x,y; }Point; Point v[105]; int main() { int i,n,m,cur,nex,ans,f,原创 2015-08-13 20:42:41 · 436 阅读 · 0 评论 -
POJ 1279 Art Gallery
分析:题目就是让你求多边形的核的面积,多边形的核就相当于在某一点能看到所有顶点(不穿过边),这些点的集合就是多边形的核。# include # include # define EPS 1e-8 struct point { double x,y; }; void Swap(point &a,point &b)//交换两点 { point t;原创 2015-08-16 22:58:12 · 516 阅读 · 0 评论 -
ECNU 1624 求交集多边形面积
分析:题意就是要求两个多边形相交的部分的面积如果会求多边形的核,这题就不难了,可以看我写的一篇POJ 1279 求多边形的核,因为本题已经说了给定的是顺时针方向,所以把POJ 1279的逆时针改下,再稍微改几个地方几可以了。# include # include # define EPS 1e-8 struct point { double x,y; }; vo原创 2015-08-16 23:06:22 · 735 阅读 · 0 评论 -
求两线段交点
如果给你4个点A,B,C,D的坐标,让你求线段AB与线段CD的交点(必相交),首先求出过点A,B的直线ax+by+c=0,因为y-A.y=(B.y-A.y)/(B.x-A.x)*(x-A.x),所以得到a=B.y-A.y; b=A.x-B.x; c=A.y*B.x-A.x*B.y; 向量AD X AB =(D.x-A.x)*(B.y-A.y)-(B.x-A.X)*(D.y-A.y) =(B.y原创 2015-08-16 23:58:37 · 1069 阅读 · 0 评论 -
POJ 2187 Beauty Contest
分析:给你一些点,让你求距离最大的两个点之前距离的平方。首先求出凸包,然后可以枚举凸包上所有顶点的距离找到最大值,也可以用旋转卡壳来求凸包直径。后者原理网上很多,解释的也挺好,我就放下我的代码就好了。# include # include using namespace std; struct point { int x,y; }v[50005]; int原创 2015-08-14 22:47:22 · 356 阅读 · 0 评论 -
POJ 1113 Wall
分析:给你n个点的坐标和半径l,求形成的凸包的周长和一个圆的周长和,结果4舍5入。求凸包就用Graham扫描法就好了,以下附两个代码,意思都差不多,要注意的是,double类型的变量存在误差,所以判断是否相等时应该是:a-b# include # include # include # define PI acos(-1.0)# define EPS 1e-8 using name原创 2015-08-12 21:22:45 · 332 阅读 · 0 评论 -
POJ 1228 Grandpa's Estate
分析:给你一些点,这些点都在凸包的边或顶点上,问你凸包是不是稳定的,稳定凸包就是每条边上都至少有3个点,否则再多加一个点能形成更大的凸包,如果一条边上有>=3个点,这样在多加一个点,虽然也可能会形成更大的凸包,但一定不满足所有点都在边上,所以每条边都应该至少有3个点才稳定。用Graham扫描法求凸包时,会将除最左下角的点外其余的点排序,排序的规则是按照其余点和最左下角的连线和x轴所形成的角度排序的原创 2015-08-13 20:10:18 · 562 阅读 · 0 评论 -
POJ 1385 Lifting the Stone
分析:给你一n边形,和n个顶点的坐标,让你求多边形的重心。思路就是将第一个点和其余点相连,这样就组成了n-2个三角形,然后求这n-2个三角形的重心,再按照质点组的重心求就可以了,公式是:其中A表示质点的坐标,m表示质点的重量,转化为多边形就是,这n-2个三角形的重心坐标,和n-2个三角形的面积,因为可能是凹多边形,这样凹进去的面积就是负的,质量也是负的,所以计算时不影响。# include原创 2015-08-13 20:35:20 · 706 阅读 · 0 评论 -
POJ 1106 Transmitters
分析:给你半圆的圆心,半径和一些点的坐标,问你这个半圆绕圆心旋转最多能覆盖多少点。能覆盖的点,点到圆心的距离肯定是小于等于半径的,将这些点找出来,然后分别以圆心和这些点的连线为半圆的一条边,判断有多少点是在这条边的同一侧。# include # include struct point { int x,y; }; point v[150],p; double原创 2015-08-13 19:44:40 · 457 阅读 · 0 评论 -
HDU 2036 改革春风吹满地
分析:逆时针给你一个n边形的n个坐标,让你求面积。从第一个顶点开始和其余各个顶点相连作向量这样得到n-2个三角形,三角形abc的面积是:向量ab X 向量ac (叉积),然后把这n-2个三角形的面积累加就行了,即使存在凹多边形也没关系,应该叉积是有方向的,凹的话,结果是负的,就是减去了那凹进去的面积。# include int main() { int n,i,x[10原创 2015-08-12 20:58:54 · 422 阅读 · 0 评论 -
POJ 1584 A Round Peg in a Ground Hole
分析:给你n边形的坐标、圆心坐标和半径,问你这n边形是不是凸多边形,如果不是输出:HOLE IS ILL-FORMED,否则,如果圆在凸包内就输出:PEG WILL FIT,否则输出:PEG WILL NOT FIT。因为这n边形的坐标是按顺时针或逆时针给出的,所以判断时只有看每相邻两边的叉积符号是否相同,不同的话就不是凸包。在判断圆心是否在凸包内,这个也好判断,也是看叉积符号是否一致,再判断有没原创 2015-08-12 21:15:28 · 632 阅读 · 0 评论 -
HDU 5476 Explore Track of Point
题意:给你3个点A,B,C的坐标,其中AB=AC,M为BC的中心,三角形内有一点P,让你求P的轨迹的长度,使得min{∠MPB+∠APC,∠MPC+∠APB}最大。当P在以BC为底的△ABC的高上时,必有∠MPB+∠APC=∠MPC+∠APB=180°,所以P的轨迹长度之一为△ABC的高h.现在就是求P的其它的轨迹长度,使∠MPB+∠APC=∠MPC+∠APB=180°。作⊙O,使得B原创 2015-10-15 17:34:59 · 626 阅读 · 0 评论