
算法—计算几何
王老大_
奋斗在路上
展开
-
POJ 3304 Segments
题目大意:给你若干条线段,让你判断是否存在一条直线,使所有线段到这条直线的投影至少有一个交点。大概思路:若存在一条直线l和所有线段相交,作一条直线m和l垂直,则m就是题中要求的直线,所有线段投影的一个公共点即为垂足。即把问题转化成求是否存在一条直线与每条线段都有交点。这里用到枚举,枚举两两线段的各一个端点,连一条直线,再判断剩下的线段是否都和这条直线有交点。判断线段与直线l是原创 2015-02-15 15:29:32 · 417 阅读 · 0 评论 -
poj 1375 Intervals(解析几何 过圆外一点求与圆的切线)
题目大意:给出一个光源,给出一些圆,求投影区间。如图,先可以求出角a,通过半径与PQ距离,而角b也可以求出。那么就可以求出两条切线与Y轴的夹角,分别为a+b,b-a。之后利用角度求出各投影线段的左右顶点,排序判断即可。原创 2015-04-23 20:48:36 · 955 阅读 · 0 评论 -
计算几何题目推荐(转)
先是计算几何入门题推荐 :计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很 巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠。 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面大部分是模 板。如果代码一片混乱,那么会严重影响做题正确率。 4.注意精度控制。 5.能用整数的地方尽量用整数,要想到扩大数据的方法(扩大一倍, 或扩大sqrt2)。因为整数不转载 2015-02-14 10:50:26 · 500 阅读 · 0 评论 -
POJ 1269 Intersecting Lines(简单判断直线关系)
题目大意:给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。思路:先判断两条直线是不是同线,不是的话再判断是否平行,再不是的话就只能是相交的,求出交点。如何判断是否同线?如果p1,p2,p3共线,p1,p2,p4共线,那么两条p1p2,p3p4直线共线。即求(p1,p2,p3)以及(p1,p2,p4)的叉积,叉积都为0说明共线。如何判断是否平行?原创 2015-02-15 17:30:27 · 494 阅读 · 0 评论 -
POJ 2007 Scrambled Polygon(简单极角排序)
水题,根本不用凸包,就是一简单的极角排序。叉乘#include #include #include #include #include using namespace std;const int maxn=55;struct point{ double x,y;} p[maxn];double cross(point c1,point b1,poin原创 2015-03-13 10:36:40 · 569 阅读 · 0 评论 -
计算几何_多边形
判定凸多边形:顶点凹凸性法 连续三个顶点p1,p2,p3。计算p1p2,p2p3的叉乘,阶乘大于0,则表示p3点在线段p1和p2的左侧,然后依次计算下一个前后所组成向量的阶乘,如果在计算时,出现负值,则此多边形是凹多边形,如果所有顶点计算完毕,其结果都大于0,则多边形是凸多边形。判断点在凸多边形内外: ①:与判定凸多边形差不多,用判断点与多边形两顶点叉乘,都大于0,点在原创 2015-02-13 21:15:23 · 685 阅读 · 0 评论 -
POJ 1113 Wall (凸包模版题)
好久没写凸包,基本的都忘记了。悲伤。代码:#include <iostream>#include <cstdio>#include <math.h>#include <algorithm>using namespace std;#define N 1050#define PI acos(-1.0)int n,r;struct point{ int x,y; poin原创 2015-03-11 23:51:12 · 420 阅读 · 0 评论 -
POJ2653 Pick-up sticks(线段相交判断)
题意是一堆木条从天而降,要找到哪些木条是在最上面的。很简单的一道题,就是直接for循环判断会超时,这里运用了队列的思想。 附上代码:#include <iostream>#include <cstdio>using namespace std;#define eps 1e-8;struct point{ double x; double y;};struct line{原创 2015-03-11 10:59:46 · 497 阅读 · 0 评论 -
poj 1066 Treasure Hunt
题意:一个正方形围墙内有一些交错的内墙,内墙的端点都在正方形上,在正方形内部有一个点,求从正方形外到这个点的最少要走的门数,门只能是线段的中点方法:从一个点到终点不可能“绕过”围墙,只能穿过去,所以门是否开在中点是无所谓的,只要求四周线段中点到终点的线段与墙的最少交点个数即可。实际上,只需判断四周围墙的所有点与终点的连线与内墙的最少交点加一。 附上代码:#include <iostream>#i原创 2015-03-10 22:52:49 · 478 阅读 · 0 评论 -
POJ 3347 Kadj Squares(复杂的线段相交问题)
题意:给予n个正方形,要求45°角放置,最左边的正方形紧贴Y轴,所有的正方形的下面的端点都在X轴上。然后按照正方形不能交错但要尽可能的挨着的原则,摆放,最后输出从上往下看能看到的正方形的编号。思路:每新增一个正方形,就让它与左侧的每一个正方形贴紧,求其左端坐标,最终结果一定是最大的那个。然后求相应的最右端坐标。这样就转化为了线段,最后求出每条线段没有被覆盖的长度,如果长度大于0,即可输出,看了一些别原创 2015-03-11 22:42:47 · 551 阅读 · 0 评论 -
POJ 1410 Intersection(线段与矩形相交)
判断矩形和线段是否相交,没什么说的,正确理解题意中相交的定义具体代码:#include<iostream>#include<stdio.h>#include<cmath>using namespace std;typedef struct{ double x; double y;}point;point rect[4];point line[2];double mul原创 2015-03-11 18:18:09 · 408 阅读 · 0 评论 -
POJ 1228 Grandpa's Estate (稳定凸包)
读懂题意很关键,输入一个凸包上的点(没有凸包内部的点,要么是凸包顶点,要么是凸包边上的点),判断这个凸包是否稳定。所谓稳定就是判断能不能在原有凸包上加点,得到一个更大的凸包,并且这个凸包包含原有凸包上的所有点。 首先来了解什么是稳定的凸包。 比如有4个点: 这四个点是某个凸包上的部分点,他们连起来后确实还是一个凸包,但是它们不是稳定的, 我们发现,当凸包上存在一条边上的点只有端点两个原创 2015-03-21 14:03:22 · 879 阅读 · 0 评论 -
POJ 2826 An Easy Problem?! 好题
题目大意就是两根木块组成一个槽,问槽里能装多少雨水,注意雨水垂直落下,思路也很简单,就是分类讨论有点糟。 1.如果两条线段不相交或者平行,则装0; 2.有一条平行x轴,装0; 3.若上面覆盖下面的,装0; 4.其它,叉积求面积。直接上代码:include include include原创 2015-03-17 00:18:00 · 1044 阅读 · 0 评论 -
POj 1696 Space Ant (极角排序)
题意:一只蚂蚁,只会向左转,现在给出平面上很多个点,求解一种走法,能使得蚂蚁能经过的点最多,每个顶点该蚂蚁只能经过一次,且所行走的路线不能发生交叉.对于题目所输入的点,先找出最左下方的顶点(即纵坐标最小的顶点),然后对剩下的顶点按照对与左下点的极角排序,然后反复找最左下的点,反复进行极角排序,同时记录排序后左下的顶点.极角排序方法:利用叉积,看向量p1和p2的叉积是否小于零,是则说明p1在p2逆时针原创 2015-03-10 11:07:35 · 639 阅读 · 0 评论 -
POJ 1584 A Round Peg in a Ground Hole(点到直线距离,圆与多边形相交,多边形是否为凸)
题意:给出一个多边形和一个圆,问是否是凸多边形,若是则再问圆是否在凸多边形内部。分3步:1、判断是否是凸多边形2、判断点是否在多边形内部3、判断点到各边的距离是否大于等于半径上代码:#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorit原创 2015-03-20 16:54:53 · 734 阅读 · 0 评论 -
POJ 2318 TOYS && POJ 2398 Toy Storage
读懂题是关键。 POJ2318 TOYS 原题地址:http://poj.org/problem?id=2318题目大意:有一个大箱子,由n个板分为n+1块,标号为0~n已知盒子左上角和右下角的坐标及每个板上下两端的横坐标(板不会交错,且按顺序给出)然后给出玩具的坐标,统计每块空间内玩具个数(保证玩具一原创 2015-02-14 18:14:49 · 372 阅读 · 0 评论 -
POJ 3348 (凸包面积)
给你n棵树,可以用这n棵树围一个圈,然后在圈里面可以养牛,每个牛需要50平方米的空间,问最多可以养多少牛?其实就是求一个凸包,计算凸包面积,然后除以50,然后就得到答案,直接上模板。凸包这一类型的题目差不多,可以作为模板使用,时间复杂度是NlogN。#include #include #include #include #include using namespace s原创 2016-08-30 22:46:57 · 660 阅读 · 0 评论