计算几何(立体几何)基础篇

还是直接看板子,
根据板子上面的注释学内容。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const double eps = 1e-8;
int sgn(double x){
    if(fabs(x)<eps)return 0;
    if(x<0)return -1;
    else return 1;
}
struct point{
    double x,y,z;
    point(){};
    point(double _x,double _y,double _z){
        x=_x;
        y=_y;
        z=_z;
    }
    void input(){
        scanf("%lf%lf%lf",&x,&y,&z);
    }
    void output(){
        printf("%.2lf %.2lf %.2lf\n",x,y,z);
    }
    bool operator == (const point &b)const{
        return sgn(x-b.x)==0&&sgn(y-b.y)==0&&sgn(z-b.z)==0;
    }
    bool operator <(const point &b)const{
        return sgn(x-b.x)==0?(sgn(y-b.y)==0?sgn(z-b.z)<0:y<b.y):x<b.x;
    }
    double len(){
        return sqrt(x*x+y*y+z*z);
    }
    double len2(){
        return x*x+y*y+z*z;
    }
    double distance (const point &b)const{
        return sqrt((x-b.x)*(x-b.x)+(y-b.y)*(y-b.y)+(z-b.z)*(z-b.z));
    }
    point operator - (const point &b)const{
        return point (x-b.x,y-b.y,z-b.z);
    }
    point operator + (const point &b)const{
        return point (x+b.x,y+b.y,z+b.z);
    }
    point operator * (const double &b)const{
        return point (x*b,y*b,z*b);
    }
    point operator / (const double &b)const{
        return point (x/b,y/b,z/b);
    }
    double operator * (const point &b)const{
        return x*b.x+y*b.y+z*b.z;
    }
    point operator ^ (const point &b)const{
        return point (y*b.z-z*b.y,z*b.x-x*b.z,x*b.y-y*b.x);
    }
    double rad(point a,point b){
        point p = (*this);
        return acos(((a-p)*(b-p))/(a.distance(p)*b.distance(p)));
    }
    //变换长度
    point trunc(double r){
        double l=len();
        if(!sgn(l))return *this;
        r/=l;
        return point(x*r,y*r,z*r);
    }

};
struct line{
    point s,e;
    line(){};
    line(point _s,point _e){
        s=_s,e=_e;
    }
    bool operator  == (const line v){
        return (s==v.s)&&(e==v.e);
    }
    void input(){
        s.input();
        e.input();
    }
    double length(){
        return s.distance(e);
    }
    //点到直线的距离
    double dist_point_to_line(point p){
        return ((e-s)^(p-s)).len()/s.distance(e);
    }
    double dist_point_to_seg(point p){
        if(sgn((p-s)*(e-s))<0||sgn((p-e)*(s-e))<0)
        return min(p.distance(s),p.distance(e));
        return dist_point_to_line(p);
    }
    //返回点 p 在直线上的投影
    point line_prog(point p){
        return s + ( ((e-s)*((e-s)*(p-s)))/((e-s).len2()) );
    }
    //p 绕此向量逆时针 arg 角度
    point ratate(point p,double ang){
        if(sgn(((s-p)^(e-p)).len()) == 0)return p;
        point f1 = (e-s)^(p-s);
        point f2 = (e-s)^(f1);
        double len = ((s-p)^(e-p)).len()/s.distance(e);
        f1 = f1.trunc(len);f2 = f2.trunc(len);
        point h = p+f2;
        point pp = h+f1;
        return h+((p-h)*cos(ang))+((pp-h)*sin(ang));
    }
    //点在直线上
    bool point_on_seg(point p){
        return sgn(((s-p)^(e-p)).len())==0 &&sgn((s-p)*(e-p))==0;
    }
};
struct plane{
    point a,b,c,o;//o表示的是法向量
    plane(){};
    point pvec(){
        return (b-a)^(c-a);
    }
    plane(point _a,point _b,point _c){
        a=_a;
        b=_b;
        c=_c;
        o= pvec();
    }
    //ax+by+cz+d=0;
    plane(double _a,double _b,double _c,double _d){
        o=point(_a,_b,_c);
        if(sgn(_a)!=0)
        a=point((-_d-_c-_b)/_a,1,1);
        else if(sgn(_b)!=0){
            a=point (1,(-_d-_c-_a)/_b,1);
        }
        else if(sgn(_c)!=0){
            a= point (1,1,(-_d-_a-_b)/_c);
        }
    }
    //点在平面上的判断
    bool pointonplane(point p){
        return sgn((p-a)*o) == 0;
    }
    //两平面夹角
    double angleplane(plane f){
        return acos(o*f.o)/(o.len()*f.o.len());
    }
    //平面和直线的交点,返回交点个数
    int cross_line(line u,point &p){
        double x = o*(u.e-a);
        double y = o*(u.s-a);
        double d = x-y;
        if(sgn(d)==0)return 0;
        p=((u.s*x)-(u.e*y))/d;
        return 1;
    }
    //点到平面的最近点(也就是投影)
    point point_to_plane(point p){
         line u=line(p,p+o);
         cross_line(u,p);
         return p;
    }
    //平面和平面的交线
    int cross_plane(plane f,line &u){
        point oo=o^f.o;
        point v = o^oo;
        double d = fabs(f.o*v);
        if(sgn(d)==0)return 0;
        point q= a+(v*(f.o*(f.a-a))/d);
        u=line(q,q+oo);
        return 1;
    }
};
int main()
{
    printf("板子\n");
    return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算几何 目录 ㈠ 点的基本运算 1. 平面上两点之间距离 1 2. 判断两点是否重合 1 3. 矢量叉乘 1 4. 矢量点乘 2 5. 判断点是否在线段上 2 6. 求一点饶某点旋转后的坐标 2 7. 求矢量夹角 2 ㈡ 线段及直线的基本运算 1. 点与线段的关系 3 2. 求点到线段所在直线垂线的垂足 4 3. 点到线段的最近点 4 4. 点到线段所在直线的距离 4 5. 点到折线集的最近距离 4 6. 判断圆是否在多边形内 5 7. 求矢量夹角余弦 5 8. 求线段之间的夹角 5 9. 判断线段是否相交 6 10.判断线段是否相交但不交在端点处 6 11.求线段所在直线的方程 6 12.求直线的斜率 7 13.求直线的倾斜角 7 14.求点关于某直线的对称点 7 15.判断两条直线是否相交及求直线交点 7 16.判断线段是否相交,如果相交返回交点 7 ㈢ 多边形常用算法模块 1. 判断多边形是否简单多边形 8 2. 检查多边形顶点的凸凹性 9 3. 判断多边形是否凸多边形 9 4. 求多边形面积 9 5. 判断多边形顶点的排列方向,方法一 10 6. 判断多边形顶点的排列方向,方法二 10 7. 射线法判断点是否在多边形内 10 8. 判断点是否在凸多边形内 11 9. 寻找点集的graham算法 12 10.寻找点集凸包的卷包裹法 13 11.判断线段是否在多边形内 14 12.求简单多边形的重心 15 13.求凸多边形的重心 17 14.求肯定在给定多边形内的一个点 17 15.求从多边形外一点出发到该多边形的切线 18 16.判断多边形的核是否存在 19 ㈣ 圆的基本运算 1 .点是否在圆内 20 2 .求不共线的三点所确定的圆 21 ㈤ 矩形的基本运算 1.已知矩形三点坐标,求第4点坐标 22 ㈥ 常用算法的描述 22 ㈦ 补充 1.两圆关系: 24 2.判断圆是否在矩形内: 24 3.点到平面的距离: 25 4.点是否在直线同侧: 25 5.镜面反射线: 25 6.矩形包含: 26 7.两圆交点: 27 8.两圆公共面积: 28 9. 圆和直线关系: 29 10. 内切圆: 30 11. 求切点: 31 12. 线段的左右旋: 31 13.公式: 32

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值