3D版

#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<algorithm>
#define max(a,b) (((a)>(b))?(a):(b))
#define min(a,b) (((a)>(b))?(b):(a))
#define sign(x) ((x)>eps?1:((x)<-eps?(-1):(0)))
using namespace std;
const int MAXN=1000;
const double eps=1e-8,inf=1e50;
struct point3{double x,y,z;point3(){}point3(double _x,double _y,double _z){x=_x;y=_y;z=_z;}point3 operator-(const point3 &ne){return point3(x-ne.x,y-ne.y,z-ne.z);}point3 operator+(const point3 &ne){return point3(x+ne.x,y+ne.y,z+ne.z);}point3 operator*(const double t){return point3(x*t,y*t,z*t);}
};
struct line3{point3 a,b;line3(){}line3(point3 _a,point3 _b){a=_a;b=_b;}
};
struct plane3{point3 a,b,c;plane3(){}plane3(point3 _a,point3 _b,point3 _c){a=_a;b=_b;c=_c;}
};
point3 xmult(point3 a,point3 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);
}
double dmult(point3 a,point3 b){return a.x*b.x+a.y*b.y+a.z*b.z;
}
double lenth(point3 v){return sqrt(v.x*v.x+v.y*v.y+v.z*v.z);
}
double dist(point3 a,point3 b){return lenth(a-b);
}
double dist2(point3 a,point3 b){return dmult(a-b,a-b);
}
//平面法向量
point3 pvec(plane3 s){return xmult(s.b-s.a,s.c-s.a);
}
//判定点是否在线段上,包括端点和共线
bool point_on_seg(point3 p,line3 s){return sign(lenth(xmult(p-s.a,s.b-s.a)))==0&&(p.x-s.a.x)*(p.x-s.b.x)<eps&&(p.y-s.a.y)*(p.y-s.b.y)<eps&&(p.z-s.a.z)*(p.z-s.b.y)<eps;
}
//判断点在平面上
bool point_on_plane(point3 p,plane3 s){return sign(dmult(p-s.a,pvec(s)))==0;
}
//判定点是否在空间三角形上,包括边界,三点共线无意义
bool point_in_triangle( point3 p, plane3 s ) {return sign(lenth(xmult(s.a-s.b,s.a-s.c))-lenth(xmult(p-s.a,p-s.b))-lenth(xmult(p-s.b,p-s.c))-lenth(xmult(p-s.c,p-s.a)))!=0;
}
//判定点是否在空间三角形上,不包括边界,三点共线无意义
int point_in_triangle2( point3 p, plane3 s ) {return point_in_triangle(p,s)&&lenth(xmult(p-s.a,p-s.b))>eps&&lenth(xmult(p-s.b,p-s.c))>eps&&lenth(xmult(p-s.c,p-s.a))>eps;
}
//判定两点在线段同侧,点在线段上返回0,不共面无意义
bool same_side( point3 p1, point3 p2, line3 l ) {return dmult(xmult(l.a-l.b,p1-l.b),xmult(l.a-l.b,p2-l.b))>eps;
}
//判定两点在线段异侧,点在平面上返回0
bool opposite_side( point3 p1, point3 p2, line3 l ) {return dmult(xmult(l.a-l.b,p1-l.b),xmult(l.a-l.b,p2-l.b))<-eps;
}
//判定两点在平面同侧,点在平面上返回0
bool same_side( point3 p1, point3 p2, plane3 s ) {return dmult(pvec(s),p1-s.a)*dmult(pvec(s),p2-s.a)>eps;
}
//判定两点在平面异侧,点在平面上返回0
bool opposite_side( point3 p1, point3 p2, plane3 s ) {return dmult(pvec(s),p1-s.a)*dmult(pvec(s),p2-s.a)<-eps;
}
//判断直线平行
bool parallel(line3 u,line3 v){return sign(lenth(xmult(u.b-u.a,v.b-v.a)))==0;
}
//判定两线段相交,不包括端点和部分重合
bool seg_seg_inter( line3 u, line3 v ) {return point_on_plane(u.a,plane3(u.b,v.a,v.b))&&opposite_side(u.a,u.b,v)&&opposite_side(v.a,v.b,u);
}
//判定线段与空间三角形相交,包括交于边界和(部分)包含
int seg_triangle_inter( line3 l, plane3 s ) {return !same_side(l.a,l.b,s)&&!same_side(s.a,s.b,plane3(l.a,l.b,s.c))&&!same_side(s.b,s.c,plane3(l.a,l.b,s.a))&&!same_side(s.c,s.a,plane3(l.a,l.b,s.b));
}
//判定线段与空间三角形相交,不包括交于边界和(部分)包含
int seg_triangle_inter2( line3 l, plane3 s ){return opposite_side( l.a, l.b, s ) && opposite_side( s.a, s.b, plane3(l.a, l.b, s.c) ) && opposite_side( s.b, s.c, plane3(l.a, l.b, s.a) ) && opposite_side( s.c, s.a,plane3(l.a, l.b, s.b) );
}
//面面平行
bool parallel(plane3 s1,plane3 s2){return sign(lenth(xmult(pvec(s1),pvec(s2))))==0;
}
//判断直线垂直
bool vertical(line3 u,line3 v){return sign(dmult(u.b-u.a,v.b-v.a))==0;
}
//面面垂直
bool vertical(plane3 s1,plane3 s2){return sign(dmult(pvec(s1),pvec(s2)))==0;
}
//判断两直线的位置关系
int line_to_line(line3 u,line3 v){plane3 s1(u.a,u.b,v.a),s2(u.a,u.b,v.b);if(sign(lenth(xmult(pvec(s1),pvec(s2)))))return -1;//异面else if(parallel(u,v))return 0;//平行elsereturn 1;//相交
}
//直线与平面关系
int line_to_plane(line3 u,plane3 s){if(sign(dmult(pvec(s),u.b-u.a))==0){if(point_on_plane(u.a,s))return -1;//直线在平面上elsereturn 0;//直线平行于平面}elsereturn 1;//线面相交
}
//线面求交
point3 line_plane_intersection(line3 u,plane3 s){point3 ret=pvec(s),der=u.b-u.a;double t=dmult(ret,s.a-u.a)/dmult(ret,u.b-u.a);return u.a+der*t;
}
//线线求交
point3 line_interseciton(line3 u,line3 v){point3 ret=u.a,v1=xmult(u.a-v.a,v.b-v.a),v2=xmult(u.b-u.a,v.b-v.a);double t=lenth(v1)/lenth(v2)*(dmult(v1,v2)>0?-1:1);return ret+((u.b-u.a)*t);
}
//面面求交
line3 plane_intersection(plane3 u,plane3 v){line3 ret;ret.a=(line_to_plane(line3(v.a,v.b),u)==0)?line_plane_intersection(line3(v.b,v.c),u):line_plane_intersection(line3(v.a,v.b),u);ret.b=(line_to_plane(line3(v.c,v.a),u)==0)?line_plane_intersection(line3(v.b,v.c),u):line_plane_intersection(line3(v.a,v.c),u);return ret;
}
//点线距离
double dist_point_to_line(point3 p,line3 u){return lenth(xmult(p-u.a,u.b-u.a))/dist(u.a,u.b);
}
//点面距离
double dist_point_to_plane(point3 p,plane3 s){point3 pv=pvec(s);return fabs(dmult(pv,p-s.a))/lenth(pv);
}
//线线距离
double dist_line_to_line(line3 u,line3 v ) {point3 p=xmult(u.a-u.b,v.a-v.b);return fabs(dmult(u.a-v.a,p))/lenth(p);
}
//点线垂足
point3 vertical_foot(point3 p,line3 u){double t=dmult(p-u.a,u.b-u.a)/dist2(u.a,u.b);point3 ret=u.a;return ret+((u.b-u.a)*t);
}
//已知四面体六边求体积
double volume(double a,double b,double c,double d,double e,double f){double a2=a*a,b2=b*b,c2=c*c,d2=d*d,e2=e*e,f2=f*f;double tr1=acos((c2+b2-f2)/(2.0*b*c));double tr2=acos((a2+c2-e2)/(2.0*a*c));double tr3=acos((a2+b2-d2)/(2.0*a*b));double tr4=(tr1+tr2+tr3)/2.0;double temp=sqrt(sin(tr4)*sin(tr4-tr1)*sin(tr4-tr2)*sin(tr4-tr3));return a*b*c*temp/3.0;
}
//四面体体积
double volume(point3 a,point3 b,point3 c,point3 d){//abc面方向与d一致时为正return fabs(dmult(xmult(b-a,c-a),d-a))/6.0;
}

几何算法合集(3D)相关推荐

  1. 《安富莱嵌入式周报》第297期:开源生物医学成像系统,可肺部成像,C算法合集500例,突出极致运算速度,数值方法书籍,芯片级激光隔离,3D打印机固件Marlin

    往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...

  2. php 3 3公派算法代码,PHP常见算法合集代码实例

    许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣,下面是一些常用的算法和实例,大家可以好好学习下 一.文件夹遍历 function allFile($path = __DIR_ ...

  3. php最常见代码,PHP常见算法合集代码实例

    许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣,下面是一些常用的算法和实例,大家可以好好学习下 一.文件夹遍历<?php function allFile($path ...

  4. 算法合集之《信息学中守恒法的应用》(不错的文章保存一下)

    算法合集之<信息学中守恒法的应用>(不错的文章保存一下) by 三江小渡 [摘要]本文提出和总结了"守恒法",以及它在信 息学竞赛中的一些应用.守恒的本质是寻找变化中的 ...

  5. 程序员小灰漫画算法合集

    2017合集 2018合集 2019合集 2020合集

  6. 八大排序算法合集 (归并排序、交换排序、插入排序、选择排序......)

    目录 一.归并排序 二.交换排序 1.快速排序 2.冒泡排序 三.插入排序 1.直接插入排序(基于顺序查找) 2.折半插入排序(基于折半查找) 3.希尔排序(基于逐趟缩小增量) 四.选择排序 0.直接 ...

  7. 史上最全推荐系统传统算法合集

    ©作者 | YBH 学校 | 上海交通大学 研究方向 | 推荐系统 我花了半个多月将推荐系统传统算法分别进行了总结归纳,应该时目前全网最全的版本了.希望对大家了解推荐系统传统算法有所帮助. 推荐系统的 ...

  8. 【收藏】史上最全推荐系统传统算法合集

    猜你喜欢 0.[免费下载]2021年12月热门报告盘点1.如何搭建一套个性化推荐系统?2.从零开始搭建创业公司后台技术栈3.全民K歌推荐系统算法.架构及后台实现4.微博推荐算法实践与机器学习平台演进5 ...

  9. 蓝桥杯常用算法合集(JAVA)

    目录 1 判断闰年 2 计数月.日或者分钟 3 筛选素数 4 求组合数C(n,m)模板 5 全排列 6 并查集 1 判断闰年 我们知道,(1)如果是整百的年份,能被400整除的,是闰年:(2)如果不是 ...

  10. 互联网中常见的推荐算法合集

    在上网购物.看小说.买电影票的时候,都会遇到各种各样的推荐,给我们推荐一些我们曾经买过或收藏过的同类型产品,或者是推荐一些我们看过的小说题材相同的小说.那这些产品推荐都是如何实现的呢?我们今天就来聊聊 ...

最新文章

  1. 美多商城之购物车(购物车管理1)
  2. mxnet中的SoftmaxCrossEntropyLoss损失函数
  3. 浅谈“领域驱动设计”
  4. qt调用mysql加密接口_Qt实现客户端/服务器端登录验证|数据传输使用md5加密 | 学步园...
  5. 简单tarjan》一道裸题(BZOJ1051)(easy)
  6. 《Effective C#》读书笔记——条目19:保证0为值类型的有效状态.NET资源管理
  7. extern C的作用
  8. 你应当如何学习C++(以及编程)(rev#1)
  9. React Native windows环境安装遇到的坑
  10. html表单占位符,HTML5 输入表单动效 - 占位符上浮
  11. 6 redis 编译失败_Redis6 Windows 版本编译
  12. 【语音判别】基于matlab双门限法判别语音信号【含Matlab源码 1720期】
  13. mysql二进制还原表_MySQL 二进制文件恢复数据基础版本
  14. 爬取奇迹秀工具箱里面的文本和软件网盘链接
  15. TODS:从时间序列数据中检测不同类型的异常值
  16. 用层次分析法解决购买笔记本电脑的问题
  17. 基于pygame的小游戏开发
  18. h5 div自动排列
  19. 互联网高级测试工程师至少具备的能力
  20. 希尔伯特曲线的绘制c语言,[转载]希尔伯特曲线及其matlab画法

热门文章

  1. cocoStudio工具的使用-----场景编辑器
  2. 揭秘seo快排原理,seo快排流量
  3. 【答学员问】虚拟机不能正常启动,提示找不到VMX二进制文件
  4. 在启动时在Raspberry Pi上运行程序的五种方法
  5. Java SE 070 Retention及RetentionPolicy详解
  6. 广告创意设计都有哪些类型
  7. 转载:ant自动构建
  8. 【2020.10.29 洛谷团队赛 普及组】T6 U138025 小武的方程
  9. PPT:WMS仓储系统解决方案
  10. 一些框架图的色彩搭配