计算几何模板 (三维几何函数库)

/*******三维几何*******/
#include <iostream>  
#include <cstdio>  
#include <cmath>  
#define zero( x ) ( ( ( x ) > 0 ? ( x ) : -( x ) ) < eps )  
const double eps = 1e-8;  
struct point3  
{  
    double x, y, z;  
};  
struct line3  
{  
    point3 a, b;  
};  
struct plane3  
{  
    point3 a, b, c;  
};  
//计算 Cross Product U * V  
point3 xmult( point3 u, point3 v )  
{  
    point3 ret;  
    ret.x = u.y * v.x - 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;  
}  
//计算 Dot Product U ? V  
double dmult( point3 u, point3 v )  
{  
    return u.x * v.x + u.y * v.y + u.z * v.z;  
}  
//矢量差 U - V  
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;  
}  
//取平面法向量  
point3 pvec( plane3 s )  
{  
    return xmult( subt( s.a, s.b ), subt( s.b, s.c ) );  
}  
point3 pvec( point3 s1, point3 s2, point3 s3 )  
{  
    return xmult( subt( s1, s2 ), subt( s2, s3 ) );  
}  
//两点距离,单参数取向量大小  
double distance( point3 p1, point3 p2 )  
{  
    return sqrt( ( p1.x - p2.x ) * ( p1.x - p2.x ) + ( p1.y - p2.x ) * ( p1.y - p2.y ) + ( p1.z - p2.z ) * ( p1.z - p2.z ) );  
}  
//向量大小  
double vlen( point3 p )  
{  
    return sqrt( p.x * p.x + p.y * p.y + p.z * p.z );  
}  
//判定三点共线  
int dots_inline( point3 p1, point3 p2, point3 p3 )  
{  
    return vlen( xmult( subt( p1, p2 ), subt( p2, p3 ) ) ) < eps;  
}  
//判定四点共面  
int dots_onplane( point3 a, point3 b, point3 c, point3 d )  
{  
    return zero( dmult( pvec( a, b, c ), subt( d, a ) ) );  
}  
//判定点是否在线段上,包括端点和共线  
int dot_online_in( point3 p, line3 l )  
{  
    return zero( vlen( xmult( subt( p, l.a ), subt( p, l.b ) ) ) ) && ( l.a.x - p.x ) * ( l.b.x - p.x ) < eps && ( l.a.y - p.y ) * ( l.b.y - p.y ) < eps && ( l.a.z - p.z ) * ( l.b.z - p.z ) < eps;  
}  
int dot_online_in( point3 p, point3 l1, point3 l2 )  
{  
    return zero( vlen( xmult( subt( p, l1 ), subt( p, l2 ) ) ) ) && ( l1.x - p.x ) * ( l2.x - p.x ) < eps && ( l1.y - p.y ) * ( l2.y - p.y ) < eps && ( l1.z - p.z ) * ( l2.z - p.z ) < eps;  
}  
//判定点是否在线段上,不包括端点  
int dot_online_ex( point3 p, line3 l )  
{  
    return dot_online_in( p, l ) && ( !zero( p.x - l.a.x ) || ! zero( p.y - l.a.y ) || !zero( p.z - l.a.z ) ) && ( !zero( p.x - l.b.x ) || !zero( p.y - l.b.y ) || !zero( p.z - l.b.z ) );  
}  
int dot_online_ex( point3 p, point3 l1, point3 l2 )  
{  
    return dot_online_in( p, l1, l2 ) && ( !zero( p.x - l1.x ) || !zero( p.y - l1.y ) || !zero( p.z - l1.z ) ) && ( !zero( p.x - l2.x ) || !zero( p.y - l2.y ) || !zero(
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值