Versor(libvsr)
当前在Linux和Mac OS X上测试
主页(versor.mat.ucsb.edu)
文档
组合数学作弊表
Bibtex(用于在论文中引用此工作)
Versor公司 是的C++库 几何代数 ,有时称为 克利福德代数 ,对几何概念进行数字编码的系统。
标头通过模板元编程在编译时生成优化的代码。 图书馆的核心 小于150kb,支持任意维度和度量(受编译器限制…)。
该库可以仅用作数学,也可以用作具有内置图形的应用程序。 支持OpenGL和OpeGLES绘制例程。
首席开发者:Pablo Colapinto
gmail:wolftype
内容:
最近的更改
已经颁布了一些主要修订,更改了API。
名称空间用于区分代数:
vsr::nga::
是泛型n维函数的命名空间
vsr::cga::
是三维共形几何代数的名称空间
例如 vsr::nga::Round::
调用n-D轮元素的泛型实现,而 vsr::cga::Round::
调用3D CGA规范
所有静态函数结构( 圆形::
, 平面:
, 切线::
)是完整的(与之相反 Ro::
, 飞行高度::
和 助教::
). 我们注意到这些都是大写的,因为早期版本的devel分支使用小写名称空间。
构造:
现在用于在特定命名空间中构造有用的对象
例子: 构造::点(0,1,0)
在坐标处构造点 (0,1,0)
标题文件夹 /细节/空间/形式/绘图
和 /实用程序
组织各种文件
链接:
邮件列表 | AlloSphere研究小组
公共事业部:
另请参阅我的页面 Academia.edu学院
我的辩解, 铰接空间 ,介绍了几何代数,并探讨了其在参数化设计中的应用。 我的 硕士论文 在这之前,也可以作为介绍。
在C++Now,在Aspen,我给出了 关于元编程实现细节的演示
只要把代数和几何分开,它们的进展就很慢,用途也很有限; 但当这两门科学结合在一起时,它们相互促进,共同走向完美。 -约瑟夫·路易斯·拉格朗日 不应注意代数和几何在外观上不同的事实。 -奥马尔·卡亚姆 L'algèbre n'est qu'une géométrieécrite; 《圣母玛利亚》。 -苏菲·杰曼 如果你想看,学习如何表演 -海因茨·冯·福斯特
其他优秀软件:
编译
对于这个版本,您需要C++11支持,这现在很常见(gcc 4.7或更高版本或clang 3.2或更高),而对于图形支持,您需要glew。 请参阅 故障排除 有关安装glew的说明,请参阅下面的部分。
git克隆 https://github.com/wolftype/versor.git
您需要初始化子模块才能构建任何图形示例:
光盘versor 初始化子模块 git子模块更新
要在/examples中生成库和所有程序,请执行以下操作:
./建筑.sh
要只构建没有示例的库,请执行以下操作:
./build.sh—库
要构建不带图形的库,请执行以下操作:
./build.sh--数学
要在scratch/projects中编译和运行程序:
./run.sh scratch/projects/<文件夹>/<文件名>
注意,并不是所有项目都会像我在这个开发分支中更新它们的过程中那样编译。
在上面的末尾添加“配置” ./运行.sh
命令首先重新运行cmake以添加 <文件名>
目标列表。 例如,要构建和运行您编写的程序(例如,在名为scratch/projects/user/的文件夹中),您可以首先编写:
./run.sh scratch/projects/user/<文件名>--配置
这只需要在创建新文件时发生一次。 之后,您可以运行文件,而无需在末尾添加“configure”
用例
1.数学库:
#包括“vsr.h” 使用Vec=vsr::euclidean_Vec<3,float>;//<-- 定义在浮点上的三维欧氏向量 使用Biv=vsr::euclidean_bivector<3,float>;//<-- 三维双向量或“有向面积元素” 整型main(){ 自动v=Vec(1,2,3);//<-- 坐标为1,2,3的三维矢量; v.rotate(Biv::xy*.25).print();//<-- 在xy平面中旋转矢量并打印结果 返回0; };
2.独立应用程序(带窗口和gui)
在完全启用任意度量空间的同时, Versor公司 具有许多内置功能,专门用于处理三维空间的共形几何代数,这是建模所有欧几里德变换的方法:
点p=圆::点(0,0,0); 自动tp=p.translate(x,y,z); 自动rp=p.rotate(Biv::xy*θ)
故障排除
简介
Versor公司 提供了欧几里得和共形几何代数的运算和绘图例程, 物理学家、工程师和艺术家使用的相对较新的空间计算模型。 Versor公司 设计用于制作图形 在C++环境中进行几何代数实验更容易。 你可以使用这个库来绘制几何图形,探索 球面和双曲线空间、变换、设计机器人等。 我用它来攻读我的生物灵感工程博士学位。
我第一次开发 Versor公司 阅读Leo Dorst、Daniel Fontijne和Stephen Mann的《计算机科学的几何代数》。 这是一本很棒的书,如果你正在读这本书,你也应该考虑读那本。
许可证
本软件是根据FreeBSD(2条款)开源许可证授权的(参见版权/版权)。 这是一个许可且兼容的开放源码许可证,您可以自由地对源代码进行任何操作。 此外,我们强烈建议您给我发电子邮件,让我知道它的使用情况,以便我们都能了解更多信息。
最初的开发是为了帮助我建立有机形态的模型,由位于圣巴巴拉的加利福尼亚大学研究生部提供的Olivia Long Converse植物学研究奖学金提供了部分资金。 它还得到了Robert W.Deutsch基金会的支持。
一个简单的词:clifford代数及其所体现的空间关系常常让人感到抽象和畏惧。 但这是一次曲折、刺激的旅程,充满了奇怪的发现。 你一定会做一些,所以玩得开心!
背景
这里使用的同质5D CGA模型最初是由David Hestenes、Hongbo Li和Alan Rockwood于2001年提出的,通过优秀的 利奥·多斯特(Leo Dorst)、琼(Joan)和安东尼·拉森比(Anthony Lasenby)、爱德华多·拜罗·科洛卡诺(Eduardo Bayro-Corrochano)等人的精心工作。 这些研究人员的著作对我帮助很大。CGA是一种特殊的 克利福德代数 (也称为几何代数), 它操作组合超复数向量空间,这是威廉·克利福德(William Clifford)试图将哈密尔顿(Hamilton)的四元数与格拉斯曼(Grassmans)的扩张代数融合而来的。 因此 转换 我们的婚姻制度 抽象 。有关更多信息,请查看 链接 到底部的站点 本页。 例如,有关机器人学和“几何控制论”的实际应用,请参阅爱德华多·巴罗·科洛卡诺(Eduardo Bayro-Corrochano)的著作 刚体动力学和引力物理学中非常有用的算法,请参阅Joan和Anthony Lasenby的各种出版物。 要了解这一切的开始,请阅读大卫·赫斯特内斯(David Hestenes)的 经典力学的新基础 .
速度
典型的矩阵运算库具有用于向量和矩阵乘法的模板化内联函数。 Versor公司 类似,但服用类固醇,其中 向量 和稀疏 矩阵 各种尺寸的都叫 多向量 并表示几何图形 除了xyz方向和变换矩阵之外的元素。 圆、线、球体、平面、点都是代数元素 旋转、扭曲、扩张和弯曲这些变量的操作符。 这些元素和运算符都是 多矢量 它们以许多不同的方式相乘。
有什么新功能?
Versor的编译速度比以前快得多,而且没有任何愚蠢的预定列表 允许的操作或类型。 最值得注意的是,现在可以使用任意指标。 例如, xRoots.cpp示例计算两个点编组的所有欧几里德4D反射 (即F4和D4)。 所以你可以用超立方体和多立方体(8D立方体没问题!)。 尺寸的数量 allowed在某种程度上受到编译器基础结构的限制-如果您有未满足的需求,请告诉我!
至于CGA,所有的Pnt、Vec、Dll符号都和以前一样,但我已经开始添加实用函数 因为它能帮助人们摆脱困境。
auto pa=圆形::点(1,0,0); auto pb=圆形::点(0,1,0); auto-pc=圆形::点(-1,0,0); 自动圆=pa^pb^pc; 绘制(c);
它是如何工作的?
如果你喜欢函数模板元编程,可以看看代码 请让我知道你的想法。 如果你不这样做,我就不会… 但如果您有任何想法或问题,请随时联系我。
重点是什么
GA结合了许多其他数学(矩阵、张量、向量和李代数)。 它是 全面的 .CGA使用三维欧氏空间到 4D球体。 然后,在超球体上的操作被投影回3D。 这就是它的工作原理。
在我的 硕士论文 。但基本上, 几何代数提供了特别丰富的空间表达。 想象一下,你需要眼镜却不知道自己需要眼镜。 然后,当你戴上眼镜,世界就会改变 意外地。 GA就像是你大脑内部的眼镜。 保角的 几何代数(Geometric Algebra),尤其是这里列出的5D类型,就像x射线眼镜。 一个 出现的澄清点是 消除歧义 之前崩溃的概念。
例如,主要的歧义消除是 点 在空间和 矢量 在太空中。 点没有大小,但向量有大小。 点没有方向,但向量有方向。 积分为 无效的 矢量。 我们可以做 通过书写
Vec(1,0,0).null();
点为空矢量
指向0的正方形
两点的点(内)积返回其平方距离
两个Points的楔形(外)乘积返回一个Point Pair
稍后将详细介绍最后一点……定义了各种二进制运算符(主要是三个)。 我们现在可以介绍一个,它是 点 或 内部的 产品。 在数学中,两点的内积 帕
和 铅
写入\(p {a} \r地板p {b} \)。 在 Versor公司 我们使用 <=
操作员:
点pa=Vec(1,0,0).null(); 点pb=Vec(-1,0,0).null(); 标量平方分布=(pa<=pb)*-2;
在本例中,它将返回的Scalar值为 4
. The-2
因为内积真的回来了吗 一半的负片 平方距离。 我们可以将Scalar提取为c++double,如下所示:
双平方分布=(pa<=pb)[0]*-2;
点被认为是球体(实际上,双球体,更多信息 二元性 (稍后):它们是半径为零的球体。 因此,它们是一种 圆形 元素。 我们也可以通过这种方式构建要点:
圆::null(1,0,0);
或者你可以传入另一个元素
圆::null(Vec(1,0,0));
或者使用内置方法
点pa=Vec(1,0,0).null();
也可以使用宏生成点 PT公司
点pa=PT(1,0,0);
这只是“语法糖” Vec(1,0,0).null()
说到球体,我们也可以这样制作半径为的球体:
双球体dls=圆形::dls(Vec(1,0,0).null(),1);
或
双球体dls=圆形::dls(Vec(1,0,0),1);
或者,先指定半径,然后指定坐标:
双球体dls=圆形::dls(1/*<--半径*/,1,0,0)
所有这些都给出了坐标1,0,0处半径为1的双球面;
基础知识
Versor公司 以几何代数元素的基本范畴之一命名。 A类 动词 是一种类型 多向量 可用于合成几何变换, 即反射、平移、旋转、扭曲、膨胀和横向(特殊保角变换)。
稍后将详细介绍所有这些转换。
在Versor中 矢量
(或 Vec公司
)是典型的欧几里德三维元素。 它可以按正常方式建造:
Vec v(1,2,3);
存在一些内置向量:
向量::x x;//<-- X方向单位矢量矢量(1,0,0) Vec::y y;//<-- Y方向单位矢量矢量(0,1,0) Vec::z z;//<-- Z方向单位矢量矢量(0,0,1)
A类 矢量
可以使用 转子
,这与四元数非常相似。 然而,四元数通常是通过指定轴来构建的 和角度,转子通过指定 飞机 旋转角度。 最终,这对你来说会更有意义:总的来说 飞机 就是我们 将用于改变事物。 例如,反射是平面中的反射。 正如我们将看到的那样,飞机可以 超平面 这将允许更非凡的转变。
要引入的第一个全新元素是 双矢量
,这是我们将用来生成 转子
.双矢量表示 定向区域 和是 二重的 到叉积:典型向量代数中两个向量的叉积返回一个垂直于它们定义的平面的向量。 所以这不是全新的, 但有点新鲜。
双向量也只有三个元素长,并且是以向量的方式构建的。
Biv b(1,2,3);
存在一些内置Bivectors:
Biv::xy-xy;//<-- XY逆时针单位面积Biv(1,0,0) 业务::xz xy;//<-- XZ逆时针单位面积Biv(0,1,0) Biv::yz-xy;//<-- YZ逆时针单位面积Biv(0,0,1)
虽然写作完全有效 矢量
, 双矢量
和 转子
,你会注意到我把他们的昵称改成了三个字母, Vec公司
和 腐烂
. 这取决于您:长名称和昵称版本在libvsr中都是有效的(它们是相互定义的类型)。
Biv b=Biv::xy; 双θ=PIOVERTWO; Vec v1=Vec::x.rot(b*θ)
您还可以使用生成转子 Gen::rot(<some bivector>)
事实上,所有转换都可以这样生成,然后应用于任意元素。 例如, 电动机
可以生成同时平移和旋转元素的。 这也称为 扭曲 .
电机m=发电机::mot(<一些双线>);//<-- 围绕双线制作扭曲电机 点p=Vec(0,0,0).null().sp(m);//<-- 将上述电机应用于点
你会注意到 二重的 元素的版本:如 双线
(或 Dll(深蓝色)
简称)。 这是因为在抽象几何的真实世界中,通常有 定义元素的两种方法。 例如,我们可以构建一个 直接的 线路
在Y轴上,通过楔入两个点,沿着无穷大:
直线lin=Vec(0,0,0).null()^Vec(1,0).nll()^Inf(1);
或者,我们可以通过垂直于的双向量平面定义一条直线,并通过一个支持向量确定直线距原点的距离。 要转换以上内容 在它的对偶表示中,我们只调用dual()方法:
Dll Dll=lin.dial();
对于那些感兴趣的人来说,这种对偶表示与普吕克坐标同构,普吕克尔坐标在螺旋理论中用于扭转物体。 在这里,我们也可以使用 用双线生成扭曲周围事物的变换。
桂
示例/*.cpp文件包括对GLV框架的绑定,用于窗口和用户界面控件。 这为快速开始构建您自己的基于GA的图形应用程序提供了最少的必要黏合剂。
该界面具有内置的gui、鼠标信息和键盘信息。
//... 应用程序的成员 圆-圆; //。。。 在App::setup()中 objectController.attach(&circle);
将上述代码放入应用程序中,可以通过点击“T”、“R”和“S”键(用于平移、旋转和缩放)来单击和修改几何元素 按任意其他键取消选择所有元素。
[ 内置接口 ]
| | | 关键|响应 ——————————————— | —————————————————————
~
|切换全屏。
SHIFT(轮班)
+ 鼠标
或 箭头键
|在x和z方向上平移相机。
CTRL公司
+ 鼠标
或 箭头键
|旋转相机
中高音
+ 箭头键
|旋转模型视图。
T型
|转换元素
R(右)
|旋转图元
S公司
|缩放图元 选项卡
|从导航模式(默认)切换到对象操作模式 任何其他键|释放所有元素
操作员
代数的元素是几何实体(圆、平面、球体等)和操作符(旋转、平移、扭曲等) 作用于代数元素。 所有这些都被称为 多向量 因为它们不仅仅是你的典型向量。
多向量元素通常使用三个重载二进制运算符进行组合:
这个 几何 元素的乘积 A类
和 B类
:
A*B类
将两个多向量元素相乘。 这在将一个乘以另一个的倒数时非常有用(请参见 !
操作员,如下)。
这个 外部 元素的乘积 A类
和 B类
:
A^B类
将两个多向量“楔入”在一起。 它来自格拉斯曼的扩展代数,可以被认为是一种从较小维度创建更高维度的方法。 例如,楔入两个 矢量
(定向幅度)一起返回 双矢量
(定向区域)。 楔入2 点数
一起返回一个 PointPair(点对)
. 楔形三 点数
一起返回一个 圆形
.
这个 内部 元素的乘积 A类
和 B类
:
A<=B
还有一个 换向器 产品(差异)
A%B公司
以及一些过载操作,包括,
反向:
! A类
返回\(A^{-1}\)
相反:
~A
返回\(\波浪线{A}\)
最后,由于我用完了重载操作符,一些基本方法
A.联合()
返回\(\bar{A}\)
A.发票()
它返回\(\hat{A}\)
总之:
|Versor|Math|描述||| | ————— | ————————————————————————- | :—————————————————————————————————————————————: | - | | A*B类
|\(AB\)|将两个元素相乘(在A*的情况下,B查找元素之间的比率)| | A^B类
|\(A\楔子B\)|将两个元素楔入一起(构建更高维的元素)| | A<=B
|\(A\rfloor B\)或\(\boldsymbol{A}\cdot B\)|从B中提取合同A(返回B中“最不象A”的部分,排序为)| | A%B公司
|\(A\乘以B\)|换向器,等于\(\frac{1}{2}(AB-BA)\)| | ! A类
|(A^{-1})|A的逆命题| | ~答
|\(\ tilde{A}\)|A的反面| | A.结合()
|\(\bar{A}\)|共轭| | A.发票()
|\(\hat{A}\)|对合|
元素
为了使编写代码的过程更快,代数的所有元素都用3个字母表示。 或者,您也可以使用长格式名称。
[ 基本要素 ] 类型|长形式|描述| ——- | ———————— | :————————————————————————————-: |
欧几里得的 ||
Sca公司
| 标量
|一个实数
Vec公司
| 矢量
|定向幅度,或3D矢量,典型的笛卡尔风格
Biv公司
| 双矢量
|定向区域。 使用它们制作转子: 发电机::Rot(Biv b)
三个
| 三向量
|有向体积元素
圆形 ||
Pnt公司
| 点
|空向量: Pnt a=Vec(1,0,0).null()
标准
| 指针对
|0球体(直线上的球体): Par Par=Pnt a^Pnt b
Cir公司
| 圆形
|A 1-球体: Cir Cir=Pnt a ^Pnt b ^Pnt c
速度
| 球体
|A 2-球体: Sph Sph=Pnt a ^Pnt b ^Pnt c ^Pnt d
Dls公司
| 双球体
|类型定义为点: typedef Pnt Dls
扁平 ||
林
| 线路
|直线电话:例如。 Lin Lin=Par Par^Inf(1)
Dll(深蓝色)
| 双线
|双线:例如。 Dll Dll=lin.dial()
Pln公司
| 平面
|直接平面:例如。 Pln-Pln=循环输入(1)
Dlp公司
| 双平面
|双平面:例如。 Dlp Dlp=
Flp公司
| 扁平点
|
Versors公司 ||
腐烂
| 转子
|旋转元素(就像四元数一样)
Trs公司
| 翻译家
|转换元素 迪尔
| 扩张器
|膨胀元素
莫特
| 电动机
|沿轴扭曲图元
Trv公司
| 变压器
|围绕原点弯曲元素 英国标准时间
| 助推器
|围绕“动态观察”弯曲元素
摘要 ||
Mnk公司
| 闵可夫斯基飞机
|
磅/平方英寸
| 伪标量
|
Inf公司
| 无穷
|
还有其他的(例如,仿射平面、直线和点),但以上内容已经足够了。 例如,也有内置宏
欧洲药典
|原点处的球体。
相对长度单位
|原点的虚拟球体。
PT(x,y,z)
|x,y,z处的空点
欧洲药典
和 相对长度单位
可以调用,而不是 Inf公司
使用非欧几里德度量(分别为球面和双曲线)
通过调用Draw::Render可以绘制许多欧几里德元素( ). 有些人也不能,因为这并不明显 如何绘制它们(例如标量),或者是因为我不知道如何绘制,或者是由于我忘记或懒惰。 如果你 想要一些可绘制的东西,请告诉我,我会添加它。或者尝试自己添加它,然后通过github发送拉请求。
通过调用它们的 双重()
方法
所有元素都可以通过 sp(<旋量>)
方法
所有元素都可以用 re(<versor>)
方法
versor由几何实体构造,通常使用 消息::
日常工作。 操作符也可以由操作符操作-您可以旋转平移或扭曲提升。
vsr通用op.h
和 vsr_cga3D_操作.h
包含从其他元素生成元素的大部分函数。 一些准则:
消息::
方法 生成 或以其他方式操作versors
房间::
方法创建或以其他方式操作 圆形 元素(点、点对、圆、球体)
平面:
方法创建或以其他方式操作 扁平 元素(直线、双线、平面、双平面或平面点)
切线::
方法创建或以其他方式操作 切线 元素(切线向量、切线双向量、切线三向量)
发电机
| | | 返回|函数|描述 ———- | —————————————————- | ————————————————————————- Rot|Gen::Rot(const Biv&b);|//<- 从双矢量生成转子 Trs|Gen::Trs(const Drv&v);|//<- 从方向向量生成转换器 Mot|Gen::Mot(const Dll&d);|//<- 从双线生成电机 Dil|Gen::Dil(const Pnt&p,double amt);|//<- 从点和数量生成扩张器 Trv|Gen::Trv(续Tnv&v);|//<- 从切线向量生成Transveror Bst|Gen::Bst(常量Par&p);|//<- 从点对生成Booster
反思
除了上述“偶数”旋量外,我们还可以反映。 反射(在球体、圆或点对中,或在直线或平面上)可以通过书写进行计算
Pnt p=PT(1,0,0); Pnt r=p.re(CXY(1))// 圆中点的反射 r=r/r[3]// 点的重正化
re()方法计算 v.re(C)
作为 C*v.发票()*~C
其中inv()是对合。 用动词 C类
和一个元素 五
你也可以试试 C*v*! C类
。在圆或球体中反转可能会更改 元素的权重(对于x处的点,它将改变x^2)
链接
纸张