随笔分类 - 计算几何
摘要:看了一些旋转卡壳的资料。理解的还是不深,推荐博客:http://blog.csdn.net/ACMakerPOJ2187裸凸包+旋转卡(qia)壳,O(n^2)的枚举也能过View Code //#pragma comment(linker,"/STACK:327680000,327680000")#include <iostream>#include <cstdio>#include <cmath>#include <vector>#include <cstring>#include <algorithm&
阅读全文
摘要:一些半平面交的题目,整理一下。多边形的核问题多边形的核指的是多边形内能够“看到”多边形所有顶点的点集,判断方法是用多边形所有的边切割原来的多边形,得到的新区域就是多边形的核。判断多边形的核是否存在:POJ 3335POJ 3130POJ 1474求多边形的核的面积:POJ 1279View Code //#pragma comment(linker,"/STACK:327680000,327680000")#include <iostream>#include <cstdio>#include <cmath>#include <ve
阅读全文
摘要:风水。。。是一门艺术。。。我在想要不要看看《周易》《葬经》什么的,等老了还能出去给人算算命,看看阴宅阳宅什么的,混口饭吃。嘿嘿,扯远了。。。 题意:给一个凸多边形,然后在里面放两个半径为r的圆。问怎么放能使覆盖的面积最大(spj)。 思路:把多边形的每一条边向“内”移r的距离,交得一个新多边形。在多边形上找两个尽量圆的点,放上圆心。关于怎么向内移动r的距离,见下图所以 point[i] 和 point[i+1] x轴上移动的距离就是r*cos(th), y轴上移动距离就是r*sin(th);View Code //#pragma comment(linker,"/STACK:3276
阅读全文
摘要:计算几何学半平面求交poj3384,poj2540 (+ poj3335, poj3130, poj 1474, poj1279, poj3525)可视图的建立poj2966点集最小圆覆盖zju1450对踵点poj2079半平面求交详见:http://www.cnblogs.com/vongang/archive/2013/02/19/2917246.html
阅读全文
摘要:分5种情况,模板转载自:http://hi.baidu.com/billdu/item/703ad4e15d819db52f140b0b题目大意:给你个简单多边形,和一个圆心在原点处的圆,求这个多边形与圆的重合部分的面积。也就是这个意思了……但是这看上去也太恶心了,怎么办?其实想一想就知道,我们平日求多边形面积用的就是三角形剖分,所以说我们应该化繁为简,通过求出来各三角形与圆的交,从而求出总面积。而且,剖分用的原点正好在圆心,这是很方便的一件事情。现在问题就转化成一个顶点在圆心的三角形了。但是这才是麻烦的开始,除去退化情况,我们应该至少考虑到以下五种情况:(一)三角形的两条边全部短于半径。最方
阅读全文
摘要:最近两次比赛出现两道相同类型的题,有人十几分钟就AC了,而有人卡了俩小时。。。反思。。先说hdu4353这道题,题意是要求一个从N个点1里边画出一个多边形来,然后给出M个点2。让这个(多边形的面积/多边形内点2的个数)最小。描述很复杂。。。但是仔细想想会发现,多边形的点越多,面积也就越大,所以,这里只能画三个点,也就是一个三角形。至于怎么求点2的个数,这是很有必要总结的,祭奠我那苦逼的俩小时吧。。。。先看一个图:这不是立体图,仅仅是个平面图。。。假设sum[i][j]表示i,j这条线上方这块区域的点的数目可以看到三角形内点2的数目 = sum[i][j] + sum[j][k] - sum[i
阅读全文
摘要:给一个棋盘,里边有许多黑白格子,要求找出一块连续的矩形,似的矩形内部的格子全部为白色,并且面积(周长)最大。王知昆的《浅谈用极大化思想解决最大子矩形问题》里边有讲解。这里给出模板void solve(int x) { //x表示要求矩形的颜色0为黑色,1为白色 int i, j; for(i = 1; i <= m; ++i) { H[i] = 0; L[i] = 1; R[i] = m; } int lm, rm; for(i = 1; i <= n; ++i) { lm = 1, rm = m; for(j ...
阅读全文
摘要:谢勇大神画了张图,然后这个问题就解决了。。。本质是“半平面交”问题。直线切割多边形,公共的部分就是多边形的核这里找到一个不错的模板:http://blog.csdn.net/accry/article/details/6070621http://blog.csdn.net/candy20094369/article/details/6703940#include <iostream>#include <cstdio>#include <cmath>#include <vector>#include <cstring>#include
阅读全文
摘要:计算几何学坐标离散化poj1151扫描线算法poj3277,poj1177,poj1151,poj1765,poj2280,poj3004多边形的核poj3130,poj3335几何工具的综合应用poj1066,poj1819,poj2043,poj3227,poj2165,poj3429 poj 1151线段树+坐标离散化;其实就是排序后重新编号~~扫描线算法poj 1177 (6/25)求相交矩形组成的新图形的周长。很早就看过这道题。昨天用了一下午加一个晚上的时间,终于把扫描线看出点东西了。嘿嘿,几个比较好的讲解:看着个学会的,代码风格很好:http://www.cppblog....
阅读全文
摘要:点结构struct Point { double x; double y; Point(double a = 0, double b = 0) : x(a), y(b) {}};1、浮点数过滤int dbcmp(double x) { if(x > eps) return 1; else if(x < -eps) return -1; return 0;}2、线段求交点(简化一下可以用来判线段相交(规范相交))double det(double x1, double y1, double x2, double y2) { //求叉积 ...
阅读全文
摘要:wikipedia上的证明给定顶点座标均是整点(或正方形格点)的简单多边形,皮克定理说明了其面积A和内部格点数目i、边上格点数目b的关系:A=i+b/2 - 1。证明因为所有简单多边形都可切割为一个三角形和另一个简单多边形。考虑一个简单多边形P,及跟P有一条共同边的三角形T。若P符合皮克公式,则只要证明P加上T的PT亦符合皮克公式(I),与及三角形符合皮克公式(II),就可根据数学归纳法,对于所有简单多边形皮克公式都是成立的。多边形设P和T的共同边上有c个格点。P的面积:iP+bP/2 - 1T的面积:iT+bT/2 - 1PT的面积:(iT+iP+c- 2) + (bT-c+ 2 +bP-c
阅读全文
摘要:计算几何学几何公式poj1265(pick定理)叉积和点积的运用poj2031,poj1039多边型的简单算法和相关判定poj1408,poj1584凸包poj2187,poj1113POJ 1265这题貌似。。。pick定理+线段上的整数点的个数+叉积求多边形面积。。。pick定理:http://www.cnblogs.com/vongang/archive/2012/04/07/2435741.html线段上的整数点的个数:算导上的推论,方程ax ≡ c (mod b)或者对模n有d个不同的解,或则无解。 同余方程可写成 ax + by = c. 即是线段ab上有d个整数点。叉积求...
阅读全文
摘要:/*做了两天,终于AC了。各种参考啊,判段点是否在多边形内是参考的网上的代码;求点到直线的距离是师兄传授的一套模板,只能说有好的模板就是好啊,自己写了好几遍没过,用师兄的模板写了一遍过了。思路:1、用叉积判断点是否在多边形内。2、求点到每个边的距离的最小值。*///My Code:#include <iostream>#include <cstdio>#include <cstring>#include <cmath>using namespace std;const int N = 110;const double eps = 1e-6;con
阅读全文
摘要:/*WA到暴了,不能用gets()!!!改成cin.getline() 就过了。把要用的数据都读出来,然后带入一个公式。设球上两个点(x1, y1),(x2, y2);sum = r*acos(sin(x1)*sin(x2) + cos(x1)*cos(x2)*cos(y1-y2));*///My Code:#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#define E 1e-5using namespace std;const int N = 100
阅读全文
摘要:/*从昨晚开始想这题,看到队友有人1Y很快过了,备受打击。然后就一直考虑各种情况,各种debug,都没能过。下午另一个队友也很快1Y了,很纳闷,问了一下,搜的解题报告,思路是把1*1的方格分成1000*1000个离散的点,然后统计被圆覆盖的点的个数。这个方法实在有点。。。无语。发现有的人一不会就搜解题报告,没意思,宁愿浪费时间也不那样做,这题算是间接的看得解题报告吧。检讨!*///Copy thinking code:#include <iostream>#include <cstdio>#include <cstring>#include <cmat
阅读全文
摘要:乱搞题,就是看仔细不仔细了。代码很水,分好几种情况。c所在的位置分三种情况,分别计算;ab那条线段也可能是平行x轴或y轴,也分别计算。My Code:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#define pi 3.1415926535using namespace std;struct point{ double x; double y;};int Abs(double x){ return x
阅读全文
摘要:/*思路完全搞乱,开始就没想清楚就写。我晕,各种WA。思路: 找到所有点中最下边一层点里边最靠左的点d。然后求d到其他每个点连线与x轴的夹角Θ(0 <=Θ <=π 因为d的纵坐标最小)。然后从小到大排序,找到存角度的数组里n/2号点就是要找的另一个点。*/My Code:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#define pi 3.1415926535using namespace
阅读全文
摘要:"不要把社会想的太复杂,有老人摔倒了要扶起来!他要是讹你,你就说我是计院的将来快30岁时工资才2000多,他要是还讹你说明他是软院的,穷疯了!"我吃饱撑的干嘛写多组数据输入呢!一组数据直接就能秒过!#include <cstdio>using namespace std;const int N = 1000;struct point{ int x; int y;}p[N];int n, max, cnt;double judge(point p1, point p2, point p3){ return (p1.x - p2.x)*(p1.y - p3.y) -
阅读全文
摘要:计算几何讲解:http://dev.gameres.com/Program/Abstract/Geometry.htm#判断两线段是否相交一个比较好的范例:http://www.wutianqi.com/?p=2407代码:#include <stdio.h>struct node{ double x1, y1; double x2, y2;}l[110];double X(double a, double b, double c, double d){ return a*d - b*c;}int judge(int i, int j){ double a = X(l[i].x1-
阅读全文

浙公网安备 33010602011771号