我正在寻找一种算法,它提供了一种生成knots图形表示的方法(2D或3D,但前者,最好使用矢量图形)。
我已经看到很多关于结理论的链接,从punctual references到general information。
在尝试自己设计一些东西之前,我想了解一些现有软件的存在,这些软件不仅可以代表它们(在内存中),还可以在一些图形表示中进行可视化(有{{ 3}})。它可能以库的形式出现,或者是一个简单的函数,甚至是伪代码算法,它试图指定如何在屏幕上正确绘制知识。
正如之前的链接所示,Wolfram Mathematica中有一个名为KnotTheory
的软件包(以几乎完整的方式)。但是,它不可移植,也不是免费软件和访问它的模块对我来说非常麻烦(在Java中免费实现,只是为了命名一种语言,但每种语言都很好,从可移植性和开放性的角度看是理想的)
我已经看到many软件可用(但many已旧,无法访问或可用)。 你有一些很好的分享指南吗?
更新: 由于已经出现了两个关闭这个问题的投票,我正在以更务实和明确的方式重申它:是否有算法来绘制和生成结?已经实施了一些东西
更新2(重新开放) 图形表示可以是3D渲染对象或2D svg图形(我正在从中抽象出来,因为我期待编程语言为Processing(或相同的Mathematica本身),它为您提供绘制曲线的基元(样条,贝塞尔曲线,等等在屏幕上(然后将它们导出到栅格或矢量图形)。 该算法应采用一个结参数化作为输入(即,如果我们讨论由它们的交叉属性描述的结,它们的值是所需的),返回上面的一个图形表示(即使是二维空间中的一系列点) )。也就是说,任何参数化都很好,我的目的只是为了得到如何绘制结的内省,以便得到一个以特定方式做到这一点的算法,导致一个特定的表示,就好了(Mathematica的lib似乎能够在很多表示中画出来。)
答案 0 :(得分:1)
这样的东西?
void setup() {
size(300, 300, P3D);
}
void draw() {
background(36, 10, 28);
int f = frameCount%360;
translate(width/2, height/2);
if (frameCount >= 360 && frameCount <= 1080 )
rotateY(radians(f));
stroke(0);
drawKnot(40);
translate(knotX(f)*40, knotY(f)*40, knotZ(f)*40);
noStroke();
fill(180,50,145);
sphere(10);
}
void drawKnot(float sz) {
stroke(200);
for (int i = 0; i < 360; i++) {
point(knotX(i)*sz, knotY(i)*sz, knotZ(i)*sz);
}
}
float knotX(int n) {
return sin(radians(n)) + 2*sin(radians(n*2));
}
float knotY(int n) {
return cos(radians(n)) - 2*cos(radians(n*2));
}
float knotZ(int n) {
return sin(radians(n*3))*-1;
}
答案 1 :(得分:1)
Wolfram Mathematica有基本的结理论,包括可视化,内置:
http://reference.wolfram.com/language/ref/KnotData.html
软件文档中的这个网页包含许多可以使用Mathematica完成的标准结理论可视化和计算的例子。