Versor(libvsr)

几何代数的(快速)通用C++库,包括欧几里德、射影、共形、时空等。

当前在Linux和Mac OS X上测试

主页(versor.mat.ucsb.edu)

文档

组合数学作弊表

Bibtex(用于在论文中引用此工作)

Versor公司是的C++库几何代数,有时称为克利福德代数,对几何概念进行数字编码的系统。

标头通过模板元编程在编译时生成优化的代码。图书馆的核心小于150kb,支持任意维度和度量(受编译器限制…)。

该库可以仅用作数学,也可以用作具有内置图形的应用程序。支持OpenGL和OpeGLES绘制例程。

首席开发者:Pablo Colapinto
gmail:wolftype

内容:

最近的更改

已经颁布了一些主要修订,更改了API。

邮件列表|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();

稍后将详细介绍最后一点……定义了各种二进制运算符(主要是三个)。我们现在可以介绍一个,它是内部的产品。在数学中,两点的内积写入\(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.hvsr_cga3D_操作.h包含从其他元素生成元素的大部分函数。一些准则:

发电机

| | |
返回|函数|描述
———- | —————————————————- | ————————————————————————-
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)

纸张