计算几何好模板

来自九野大神的博

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

const double EPS = 1e-9;
const int MAXN = 40;

struct Point3  //空间点
{
    double x, y, z;
    Point3( double x=0, double y=0, double z=0 ): x(x), y(y), z(z) { }
    Point3( const Point3& a )
    {
        x = a.x;
        y = a.y;
        z = a.z;
        return;
    }
    void showP()
    {
        printf("%f %f %f \n", x, y, z);
    }
    Point3 operator+( Point3& rhs )
    {
        return Point3( x+rhs.x, y+rhs.y, z+rhs.z );
    }
};

struct Line3   //空间直线
{
    Point3 a, b;
};

struct plane3   //空间平面
{
    Point3 a, b, c;
    plane3() {}
    plane3( Point3 a, Point3 b, Point3 c ):
        a(a), b(b), c(c) { }
    void showPlane()
    {
        a.showP();
        b.showP();
        c.showP();
        return;
    }
};

double dcmp( double a )
{
    if ( fabs( a ) < EPS ) return 0;
    return a < 0 ? -1 : 1;
}

//三维叉积
Point3 Cross3( Point3 u, Point3 v )
{
    Point3 ret;
    ret.x = u.y * v.z - v.y * u.z;
    ret.y = u.z * v.x - u.x * v.z;
    ret.z = u.x * v.y - u.y * v.x;
    return ret;
}

//三维点积
double Dot3( Point3 u, Point3 v )
{
    return u.x * v.x + u.y * v.y + u.z * v.z;
}

//矢量差
Point3 Subt( Point3 u, Point3 v )
{
    Point3 ret;
    ret.x = u.x - v.x;
    ret.y = u.y - v.y;
    ret.z = u.z - v.z;
    return ret;
}

//两点距离
double TwoPointDistance( Point3 p1, Point3 p2 )
{
    return sqrt( (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y) + (p1.z - p2.z)*(p1.z - p2.z) );
}

//向量的模
double VectorLenth( Point3 p )
{
    return sqrt( p.x*p.x + p.y*p.y + p.z*p.z );
}

//空间直线距离
double LineToLine( Line3 u, Line3 v, Point3& tmp )
{
    tmp = Cross3( Subt( u.a, u.b ), Subt( v.a, v.b ) );
    return fabs( Dot3( Subt(u.a, v.a), tmp ) ) / VectorLenth(tmp);
}

//取平面法向量
Point3 pvec( plane3 s )
{
    return Cross3( Subt( s.a, s.b ), Subt( s.b, s.c ) );
}

//空间平面与直线的交点
Point3 Intersection( Line3 l, plane3 s )
{
    Point3 ret = pvec(s);
    double t = ( ret.x*(s.a.x-l.a.x)+ret.y*(s.a.y-l.a.y)+ret.z*(s.a.z-l.a.z) )/( ret.x*(l.b.x-l.a.x)+ret.y*(l.b.y-l.a.y)+ret.z*(l.b.z-l.a.z) );
    ret.x = l.a.x + ( l.b.x - l.a.x ) * t;
    ret.y = l.a.y + ( l.b.y - l.a.y ) * t;
    ret.z = l.a.z + ( l.b.z - l.a.z ) * t;
    return ret;
}

/************以上模板*************/
/*来自九野神的博*/
时间: 2024-12-21 12:43:02

计算几何好模板的相关文章

计算几何-圆 模板 训练指南267

#include #include #include #include #include #include #include #include #include #include #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const double eps = 1e-10; const int inf = 0x3f3f3f3f; using namespace

计算几何 --- 凸包 模板

//Memory Time // 1347K 0MS // by : Snarl_jsb #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<vector> #include<queue> #include<stack> #include<map> #

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

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

计算几何基本模板

待更新... #include<iostream> #include<cmath> #include<algorithm> using namespace std; const double PI = acos(-1); const double EPS = 1e-8;//实数精度 //点结构类型 struct Point{ double x, y; Point(double a = 0, double b = 0){ x = a; y = b; } }; //线段结构

计算几何 部分模板

1 struct vector 2 { 3 double x,y; 4 vector (double X=0,double Y=0) 5 { 6 x=X,y=Y; 7 } 8 } 9 typedef vector point; 向量四则运算 1 vector operator + (vector a,vector b) {return vector (a.x+b.x,a.y+b.y); } 2 vector operator - (vector a,vector b) {return vecto

hihocoder #1040 矩形判断(计算几何问题 给8个点的坐标,能否成为一个矩形 【模板思路】)

#1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T(1<=T<=100),代表测试数据的数量. 每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (0 <= x1, y1, x2, y2 <= 100000):其中(x1, y1), (x2,y2)代表一条线段的两个端点. 输出 每组数据输出一行YES或者NO,表示输入的

2015年ACM长春区域赛比赛感悟

距离长春区域赛结束已经4天了,是时候整理一下这次比赛的点点滴滴了. 也是在比赛前一周才得到通知要我参加长春区域赛,当时也是既兴奋又感到有很大的压力,毕竟我的第一场比赛就是区域赛水平,还是很有挑战性的.在接到通知后,我便开始临阵抱佛脚,课也不怎么听了,上课把时间全都用在了看各种算法上,回到实验室便整理模板.开cf练手.在去比赛前,已经将所看过的算法模板都整理好了. 周五上午9点三刻左右,我们便出发了,需要经历12个小时才能到达我们此次的目的地——长春,途中我还将计算几何稍微看了一下.直到晚上11点

【HDOJ】1348 Wall

计算几何-凸包模板题目,Graham算法解. 1 /* 1348 */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <cstdlib> 6 #include <cmath> 7 #include <algorithm> 8 using namespace std; 9 10 #define MAXN 1005 11 12 typed

计算几何 部分常用函数模板

来自<算法竞赛入门经典-训练指南> 刘汝佳/陈峰 清华大学出版社 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const double eps = 1e-8; int dcmp(double x) /