计算几何入门

poj 3304

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <set>
#include <string>
#include <math.h>
using namespace std;
const int maxn=1e6+10;
const double EXP=1e-9;
struct point  { double x,y;};
struct segment{ point a,b; }pa[maxn];
struct line   { point a,b; line(point x,point y){ a=x,b=y; };   };;
double XXX(point a,point b,point c)
{
    return (c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y);
}
bool check_x(line a,segment b)
{
    point x=a.a;
    point y=a.b;
    point c=b.a;
    point d=b.b;
    if( XXX(c,x,y)*XXX(d,x,y)<=0 ) return 1;
    return 0;
}
bool check_f(line a,int n)
{
    //<<"n"<<endl;
    point c=a.a;
    point d=a.b;
    if( fabs( sqrt( (c.x-d.x)*(c.x-d.x)+(c.y-d.y)*(c.y-d.y) ) )<EXP ) return false;
   // cout<<1<<endl;
    for(int i=1;i<=n;i++)  if( check_x(a,pa[i])==0 ) return false;
    return true;
}
int main()
{
    int T; scanf("%d",&T);
    while(T--)
    {
        int n; scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            point a;point b;
            scanf("%lf %lf %lf %lf",&a.x,&a.y,&b.x,&b.y);
            pa[i]={a,b};
        }
        bool flag=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {

                 if(check_f(line(pa[i].a,pa[j].a),n)) { flag=1; break;}
                 if(check_f(line(pa[i].a,pa[j].b),n)) { flag=1; break;}
                 if(check_f(line(pa[i].b,pa[j].a),n)) { flag=1; break;}
                 if(check_f(line(pa[i].b,pa[j].b),n)) { flag=1; break;}
            }
        }
        if(flag==1) printf("Yes!\n");
        else        printf("No!\n");
    }
}

poj 2398

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1e6+10;
const double EXP=1e-9;
struct point{double x,y;};
struct segment{ point a,b; }pa[maxn];
int n,m;
int num[maxn];
int d[maxn];
void make(point s)
{
    int l=0;
    int r=n+1;
    while(l+1!=r)
    {
        int mid=(l+r)/2;
        point a=pa[mid].a;
        point b=pa[mid].b;
        double x1=a.x-s.x;
        double y1=a.y-s.y;
        double x2=b.x-s.x;
        double y2=b.y-s.y;
        if(x1*y2-x2*y1>EXP) r=mid;
        else              l=mid;
    }
    //cout<<r<<endl;
    num[r]++;
    //cout<<r<<endl;
    return;
}
bool up(segment a,segment b)
{
    return a.a.x<b.a.x;
}
int main()
{
  //  ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    while(1)
    {
        scanf("%d",&n); if(n==0) break;
        scanf("%d",&m);
        memset(num,0,sizeof(num));
        memset(d,0,sizeof(d));
        double x1,y1,x2,y2; scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
        pa[0]={{x1,y2},{x1,y1}};
        pa[n+1]={ {x2,y2},{x2,y1}};
        for(int i=1;i<=n;i++)  { double a,b;scanf("%lf %lf",&a,&b); pa[i]={ {b,y2},{a,y1}};  }
        sort(pa,pa+n+1,up);
        for(int i=1;i<=m;i++)  { double a,b;scanf("%lf %lf",&a,&b); point x={a,b}; make(x);  }
        for(int i=1;i<=n+1;i++){ d[num[i]]++;  }
        printf("Box\n");
        for(int i=1;i<=m;i++)
        {
            if(d[i]) printf("%d: %d\n",i,d[i]);
        }

    }
    return 0;
}

原文地址:https://www.cnblogs.com/Andromeda-Galaxy/p/10446311.html

时间: 2024-10-20 13:57:26

计算几何入门的相关文章

hdu 1086(计算几何入门题——计算线段交点个数)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086 You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7167    Accepted Submission(s): 3480 Problem Description Ma

计算几何入门向

这是一个计算几何入门的教程. 与计算几何密切相关的就是坐标系,坐标系上的点可以用下面数据结构实现. struct Point { double x,y; Point(int x,int y) :x(x),y(y){}; };typedef Point Vector; 向量也是经常需要的,由于和点所需储存的信息相同,可以直接定义为别名. 由于需要使用大量加减乘除,我们可以重载运算符达到很好的使用效果. /× 挖坑,有时间再写代码 ×/ 我们也可以用STL的虚数类来实现点和向量. typedef c

[您有新的未分配科技点]计算几何入门(1):点,向量以及向量的简单应用

在打了一阵数据结构之后,老师表示"今天晚上让学长给你们讲一下计算几何"--然后就死了.jpg 昨天晚上一直在推数学的式子以及回顾讲课的笔记--计算几何特点就是多而杂,即使是入门部分也是如此-- 首先,我们从二维的几何问题开始处理. 我们知道,高中解析几何计算几何的基础是向量(Vector)和点(Point),所以我们先来表示这两个概念: 在计算几何中,点和向量一般用结构体来存储,像这样: 1 struct Point 2 { 3 double x,y,rad; 4 Point(doub

计算几何入门模板(持续更新)

我也算是刚入门计算几何吧,想写一篇入门的模板,让那些和我一样刚入门的人都能看懂就好. 首先要有一些理论知识,这可以百度,我就不多说了,通过百度,你要知道: ①叉积可以判断3个点共线,还可以判断2个点构成直线,第3个点在直线的左边还是右边. ②判断两条线段相交要有2个条件,一个是矩形的什么定理(名字太长,忘了)另一个就是4个点的叉积相乘小于0(也就是异号) 之后就可以看下我收集的简单的模板了. #include <map> #include <set> #include <li

计算几何入门之aizu两题 Projection Reflection

---恢复内容开始--- 使用complex类来写计算几何. 第一题 传送门: 题意给定一直线输入一个点求输入点到该直线射影交点的坐标: = p0到p2向量称为v2,p0到p1向量称为v1 易求得p0到t的向量为 (v2·v1)*(v1的方向向量) . 用复数表示每个点和每个向量,则将v1*(v2的共轭复数)得到的实部就是x1*x2虚部就是y1*y2. 这样求得了p0到t的向量v3,所以ansx=xp0+xv3,ansy=yp0+yv3; 第二题  题意类似,做法相同.不再赘述. 现在贴第二题代

TOYS(计算几何-入门)

题目 '^'代表叉乘 '?'代表点乘 点积:a?b=ax*bx+ay*by 叉积:a^b=ax*by-bx*ay 有了这些,代码就呼之欲出了. 首先read(线段) 然后read(点) 发现满足二分性(点A一定在前t条线后,在后n-t条线前) 于是,二分优化查找 O(mlogn) #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include &l

UVA - 11646 - Athletics Track (计算几何~)

题目地址:点这里 思路:计算几何入门题,首先,两个圆弧是同一个圆的,所以这个圆是矩形的外接圆,那么矩形中心就是圆心,由长宽算出角度和半径(这时用单位长度表示),再算出一个单位长度的实际长度,从而得出长和宽 AC代码: #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cmath> using namespace std;

计算几何相关

任意多边形面积-有向面积 凸包算法(Graham扫描法)详解 蒟蒻blog(计算几何入门) 原文地址:https://www.cnblogs.com/Gkeng/p/12079028.html

【COGS &amp; USACO】896. 圈奶牛(凸包)

http://cojs.tk/cogs/problem/problem.php?pid=896 我的计算几何入门题... 看了看白书的计算几何部分,,恩好嘛.. 乃们都用向量!!!! 干嘛非要将2个点确定一条线变成一个点从原点o出发的射线!!!! 这就是所谓的玩概念吗 然后用所谓的向量加减,是这些向量起点相同,然后就变成了原点o出发的射线!!! 然后你们还在玩概念!我跪了. (以上纯属蒟蒻吐槽) 好吧,计算几何非常有用的..简化了不少操作. 这里还有啥点积啥叉积.点积就是同一起点的向量(终点)的