
计算几何
111111用户昵称不存在00000
这个作者很懒,什么都没留下…
展开
-
POJ1106->叉积判断点在直线的左右
POJ1106->叉积判断点在直线的左右题意: 给定平面上一些点的坐标,有一个半径固定,圆心固定且可以旋转的半圆形平面,求这个平面能覆盖到的最大点的数量。题解: 由于圆心半径一定,所以有效的点的坐标即是在这个圆形区域内的点的坐标,可以开个数组记录一下,之后可以通过枚举圆心和这些有效点构成的直线,并通过叉乘来统计每次在这条直线左侧的点的数量来更新答案。代码:#include <stdio.原创 2016-08-27 23:33:13 · 1847 阅读 · 0 评论 -
LightOJ1292->求最多共线点数
LightOJ1292->计算几何题意: 给出平面上n个点,要求最多有多少个点能共线。题解: 使用map存储每个点相对于原点的不同斜率上对应的点的个数,最后输出最大值即可。代码:#include <stdio.h>#include <iostream>#include <map>using namespace std ;int GCD(int a , int b) {return原创 2016-09-26 23:03:17 · 928 阅读 · 0 评论 -
LightOJ1203->求凸包最小内角角度
LightOJ1203题意: 被转化后的问题其实就是求凸包最小的内角角度。题解: 构造一个凸包,通过余弦定理遍历所有内角,求出最小角度。代码:#include <stdio.h>#include <iostream>#include <cmath>#include <algorithm>#include <float.h>using namespace std ;#defin原创 2016-09-07 23:27:00 · 523 阅读 · 0 评论 -
分治法求两点间最短距离->HDU5721
分治法求最近点对的距离:主要思想就是先把n个点按x坐标排序,然后求左边n/2个和右边n/2个的最近距离,最后合并。合并过程: 首先,假设点是n个,编号为1到n。我们要分治求,则找一个中间的编号m,先求出1到m点的最近距离设为d1,还有m+1到n的最近距离设为d2。这里的点需要按x坐标的顺序排好,并且假设这些点中,没有2点在同一个位置。(若有,则直接最小距离为0了)。 然后,令d为d1,原创 2016-08-27 00:25:44 · 4721 阅读 · 0 评论 -
跨立实验判断线段是否相交->POJ3304
在二维坐标下介绍一些定义:点:A(x1,y1),B(x2,y2) 向量:向量AB=( x2 - x1 , y2 - y1 )= ( x , y ); 向量的模 |AB| = sqrt ( x*x+y*y );向量的点积:向量叉积 结果为 x1*x2 + y1*y2。 点积的结果是一个数值。 点积的集合意义: 我们以向量 a 向向量 b 做垂线,则 | a | * cos(a,b)为 a原创 2016-08-25 00:05:22 · 741 阅读 · 0 评论 -
POJ2653->判断线段相交
POJ2653->判断线段相交题意: 有一些线段,按顺序给出,后给出的线段可能会覆盖住先给出的线段,求这些线段中最后没有被覆盖住的线段的编号。题解: 一次输入所有线段后,枚举编号1-n,用跨立实验去验证每条线段有没有被后面的线段覆盖,一旦查询到有编号大于它的线段跨立它,则跳出当前循环。代码:#include <stdio.h>#include <iostream>#include <原创 2016-08-27 00:06:13 · 592 阅读 · 0 评论 -
旋转卡壳->POJ2079
旋转卡壳:1.旋转卡壳求凸包直径: 如上图: 我们定起始点为A,首先从A点开始你顺时针找到凸包上距离A点最大距离的E点; 由于A到F的距离小于A到E的距离,此时我们旋转线的左端点到B点,再去计算B到F的距离,之后旋转线段的右端点,发现BG的距离小于BF,此继续旋转左端点到下一个顶点。 每次旋转卡壳的操作就是由一个固定的左端点,和旋转方向固定的右端点,求出其到一个右端点的原创 2016-09-03 17:56:05 · 451 阅读 · 0 评论 -
LightOJ1285->极角排序
LightOJ1285->极角排序题意: 给出平面上的N个点,每个点按照给出顺序编号,问能否只用一条线连接所有的点构成一个多边形,如果可以,则以最左下角的点为起点,逆时针输出多边形边上这些点的编号,否则输出impossible。题解: 其实只要点的个数大于等于3并且这些点不都在同一条直线上,就能被连出一个多边形。 因此需要进行极角排序。由于极角排序时是角度相同时横纵坐标从小到大,所以原创 2016-09-12 23:31:09 · 404 阅读 · 0 评论 -
POJ2187->凸包
POJ2187->凸包题意: 给出平面上n个点,求出这些点中距离最大的两个点。题解: 如果逐个枚举,时间复杂度将会相当高,不能满足题目要求。 可以构建一个凸包,再在凸包中枚举各个顶点之间的距离求最大值。代码:#include <stdio.h>#include <iostream>#include <cmath>#include <algorithm>#include <f原创 2016-08-30 23:38:52 · 368 阅读 · 0 评论 -
凸包Graham扫描法->HDU3847
Graham扫描法求凸包凸包定义: 点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内。 凸包最常用的凸包算法是Graham扫描法和Jarvis步进法。 Graham扫描法: 首先,找到所有点中最左边的(y坐标最小的),如果y坐标相同,找x坐标最小的. 以这个点为基准求所有点的极角(atan2(y-y0,x-x0)),并按照极角原创 2016-08-30 00:29:27 · 638 阅读 · 0 评论 -
POJ2318->叉积判断点在线段的左右
POJ2318->计算几何题意: 已知n条线段把一个区域分成了n+1部分,给出一些点的坐标,求每个小区域中有多少个点。题解: 利用叉积,线段两个端点为p1p2,记玩具坐标为p0,那么如果(p0p1 X p0p2) 叉积是小于0,那么就是在线段的左边,否则右边。 枚举即可,也能用二分优化。代码:#include <stdio.h>#include <iostream>#inclu原创 2016-08-25 18:21:38 · 853 阅读 · 0 评论 -
HDU1700->向量旋转
HDU1700->向量旋转题意: 一个圆的圆心在(0,0),已知圆上一点,求另外两点使得这三点构成的圆内接三角形周长最大。题解: 圆的内接三角形中,周长最大的为正三角形。 已知一点即知道了圆的半径,和一个圆心与该点构成的向量,旋转这个向量即可得到另外两个点。代码:#include <stdio.h>#include <iostream>#include <cmath>usin原创 2016-08-27 23:40:30 · 573 阅读 · 0 评论 -
LightOJ1190->判断一个点是不是在一个任意多边形内
算法介绍: http://blog.youkuaiyun.com/hjh2005/article/details/9246967代码:#include <stdio.h>#include <math.h>#define max(X,Y) ((X)>(Y) ? (X) : (Y))#define min(X,Y) ((X)<(Y) ? (X) : (Y))const int INF=0x7fffffff;原创 2016-09-26 23:17:04 · 445 阅读 · 0 评论