计算几何模板

全是纯干货,方法理解可查阅算法入门到进阶一书 !

#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const double pi = acos(-1.0);//高精度圆周率
const double eps = 1e-8;//偏差值
const int maxp = 1010;//点的数量
//判断是否等于零,返回0为等于零,返回-1为小于,1为大于
int sgn(double x) {if (fabs(x) < eps)return 0;else return x < 0 ? -1 : 1;
}//判断是否相等,返回0为相等,返回-1为小于,1为大于
int dcmp(double x, double y) {if (fabs(x - y) < eps)return 0;else return x < y ? -1 : 1;
}//三维几何
struct Point3 {double x, y, z;Point3() {}Point3(double x, double y,double z) : x(x), y(y), z(z){}Point3 operator+(Point3 B) { return Point3(x + B.x, y + B.y,z + B.z); }Point3 operator-(Point3 B) { return Point3(x - B.x, y - B.y,z + B.z); }Point3 operator*(double k) { return Point3(x * k, y * k, z * k); }//放大k倍Point3 operator/(double k) { return Point3(x / k, y / k, z / k); }//缩小k倍bool operator==(Point3 B) { return sgn(x - B.x) == 0 && sgn(y - B.y) == 0 && sgn(z - B.z) == 0; }
};typedef Point3 Vector3;
//两点距离
double Distance(Point3 A, Point3 B) { return sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y) + (A.z - B.z) * (A.z - B.z));}struct Line3 {Point3 p1, p2;Line3() {}//根据端点确定直线Line3(Point3 p1, Point3 p2) : p1(p1), p2(p2) {}
};typedef Line3 Segment3;
//向量点积
double Dot(Vector3 A, Vector3 B) { return A.x * B.x + A.y * B.y + A.z * B.z;}//向量长度
double vector_length(Vector3 A) { return sqrt(Dot(A, A));}//向量长度平方
double vector_length_square(Vector3 A) { return Dot(A, A);}//向量夹角
double Angle(Vector3 A, Vector3 B) {return acos(Dot(A, B) / vector_length(A) / vector_length(B));
}//向量叉积;大于0,B在A逆时针方向;等于0,A、B重合
Vector3 Cross(Vector3 A, Vector3 B) { return Point3 (A.y * B.z - A.z * B.y,A.z * B.x - A.x * B.z,A.x *B.y - A.y *B.x);}//三点构成平行四边形面积(A为公共点)
double Area2(Point3 A, Point3 B, Point3 C) {return vector_length(Cross(B - A, C - A));
}//判断p是否在三角形ABC内,可以用Area2来计算;如果点p在三角形内部,那么用电p对三角形ABC进行刨分,形成的3个三角形的面积应和直接计算ABC的面积相等// dcmp(Area2(p, A, B) + Area2(p, B, C) + Area2(p, C, A), Area2(A, B, C)) == 0;//点在直线上
bool Point_line_relation(Point3 p, Segment3 v) {return sgn(vector_length(Cross(v.p1 - p,v.p2 - p))) == 0 && sgn(Dot(v.p1 - p, v.p2 - p)) == 0;
}//点到直线的距离
double Dis_point_line(Point3 p, Line3 v) {return vector_length(Cross(v.p2 - v.p1, p - v.p1)/ Distance(v.p1, v.p2));
}//点在直线上的投影
Point3 Point_line_proj(Point3 p, Line3 v) {double k = Dot(v.p2 - v.p1, p - v.p1) / vector_length_square(v.p2 - v.p1);return v.p1 + (v.p2 - v.p1) * k;
}//点到线段的距离
double Dis_point_seg(Point3 p, Segment3 v) {if (sgn(Dot(p - v.p1, v.p2 - v.p1)) < 0 || sgn(Dot(p - v.p2, v.p1 - v.p2)) < 0) //点的投影不在线段上return min(Distance(p, v.p1), Distance(p, v.p2));return Dis_point_line(p, v); //点的投影在线段上
}//三维 : 平面
struct Plane{Point3 p1, p2, p3;Plane(){}Plane(Point3 p1,Point3 p2,Point3 p3) : p1(p1) ,p2(p2), p3(p3){}
};//平面法向量
Point3 pvec(Point3 A, Point3 B, Point3 C) { return Cross(B - A, C - A); }
Point3 pvec(Plane f) { return Cross(f.p2 - f.p1, f.p3 - f.p1); }//四点共平面
bool Point_on_plane(Point3 A,Point3 B,Point3 C,Point3 D){return sgn(Dot(pvec(A, B, C), D - A)) == 0;
}//两平面平行
int parallel(Plane f1,Plane f2){return vector_length(Cross(pvec(f1), pvec(f2))) < eps;
}//两平面垂直
int vertical(Plane f1,Plane f2){return sgn(Dot(pvec(f1), pvec(f2))) == 0;
}//直线与平面的交点p,返回值是交点的个数
int Line_cross_plane(Line3 u,Plane f,Point3 &p){Point3 v = pvec(f); //平面的法向量double x = Dot(v, u.p2 - f.p1);double y = Dot(v, u.p1 - f.p1);double d = x - y;if(sgn(x) == 0 && sgn(y) == 0) return -1; //v在f上if(sgn(d) == 0) return 0; //v与f平行p = ((u.p1 * x) - (u.p2 * y)) / d; //v与f相交return 1;
}//四面体有向体积X6
double volume4(Point3 A,Point3 B,Point3 C,Point3 D){return Dot(Cross(B - A, C - A), D - A);
}

三维几何 --- 计算几何模板相关推荐

  1. (转)计算几何模板 - kuangbin

    转自:https://kuangbin.github.io/2019/04/28/20190428/#more 二维几何 // `计算几何模板` const double eps = 1e-8; co ...

  2. 计算几何模板中的代码

    计算几何模板代码选自kuangbin 7 计算几何 7.1 二维几何 // `计算几何模板` const double eps = 1e-8; const double inf = 1e20; con ...

  3. 【总结】计算几何模板

            计算几何模板 1.   几何公式 1.1 角: 1.正弦定理: a/sinA = b/sinB = c/sinC = 2R 2.余弦定理: a² = b²+c²-2bc*cosA b² ...

  4. 计算几何模板(大神整理)

    不知道出处,转载的转载... 计算几何模板 目录: 1.计算几何 2 1.1 注意 2 1.2几何公式 2 1.3 多边形 4 1.4多边形切割 7 1.5 浮点函数 8 1.6 面积 14 1.7球 ...

  5. UE4中三维几何总结——几何体

    UE4中三维几何总结--几何体 1.简述 2.基本图元 3.几何图元类型 3.1 凸面网格Convex Mesh 3.2 三角形网格Triangle Mesh 3.3 高度场Height Field ...

  6. 【三维几何学习】DiffusionNet: Discretization Agnostic Learning on Surfaces

    DiffusionNet 引言 一.方法简述 1.1 输入 1.2 网络 1.3 损失函数 二.分类实验 2.1 结果 2.2 代码 三.分割实验 3.1 结果 3.2 代码 四.一些想法 4.1 输 ...

  7. 计算机图形学(八):三维对象的表示(常用的三维几何建模方法)

    几何建模--利用交互方式将现实中的物体模型输入计算机,而计算机以一定的方式将其存储. 常用的三维几何建模方法包括三种:线框建模.表面建模.实体建模. 线框建模 线框建模是利用基本线素来定义设计目标的棱 ...

  8. 中国有完全自主的三维几何建模引擎和几何约束求解器吗?

    工业软件,就是"工业大脑".三维CAD系统,是工业核心数据的来源,属于核心的研发设计类工业软件.三维 CAD 软件的两大底层核心技术:三维几何建模引擎和几何约束求解器,目前均面临严 ...

  9. 淡雅创意不规则几何PPT模板

    模板介绍 淡雅创意不规则几何PPT模板.一套其它幻灯片模板,内含蓝色多种配色,创意风格设计,动态播放效果,精美实用. 希望下面这份精美的PPT模板能给你带来帮助,温馨提示:本资源使用PPT或PPTX等 ...

最新文章

  1. python中文读音ndarray-numpy中的ndarray方法和属性
  2. 数据库-优化-索引-索引的优化
  3. 还在用ABAP进行SAP产品的二次开发?来了解下这种全新的二次开发理念吧
  4. 《软件工程(第4版?修订版)》—第1章1.5节 系统的方法
  5. SpringBoot 学习二:操作数据库
  6. Eclipse-导入maven项目
  7. new delete 之placement new 和placement delete
  8. 制作Windows官方系统启动盘
  9. 逆向之制作扫雷外挂——003
  10. 球体弹性碰撞位置和速度计算算法
  11. 壹基金,李连杰的长尾理论
  12. ZJNU 2314-Sleepy Cow Herding
  13. 嵌入式开发——Linux操作系统
  14. 【R语言 数据挖掘】R语言如何做关联规则?
  15. xjoi 1542 玩玩拉格朗日四平方和定理
  16. android 微信朋友圈 全功能,Android仿微信朋友圈文字展开全文功能 Android自定义TextView仿微信朋友圈文字展开全文功能...
  17. 线路编码(NRZ,NRZI,8B/10B,Manchester等)
  18. 省考面试90+经验贴倾情奉献
  19. 品Spring:bean定义上梁山
  20. 《数据库系统原理》实验6:视图管理

热门文章

  1. 手把手教你实现一个人脸认证登录系统
  2. 支付宝花呗额度一直不涨?阿里老员工说出原因,亲测有效
  3. Redis-5.0.5集群配置
  4. VueUse(中文)——简介
  5. 寝室卫生问题的博弈分析及其解决方案
  6. 2021年危险化学品经营单位主要负责人考试题及危险化学品经营单位主要负责人模拟试题
  7. 多路测量实时同步工作原理_数字示波器原理
  8. px 、 rem 、 vw学习
  9. “新基建”背景下,智慧灯杆产业面临的问题及思考
  10. 工程建设项目全套流程,门清!