以程序方式生成结(并将其可视化)

ran*_*ano 6 java processing wolfram-mathematica image-processing

我正在寻找一种算法,它提供了一种生成结的图形表示的方法(2D或3D,但前者,最好是矢量图形).

我已经看到了很多关于结理论的链接,从准时引用一般信息.

在尝试自己设计一些东西之前,我想了解一些现有软件的存在,这些软件不仅可以代表它们(在内存中),还可以在一些图形表示中进行可视化(有许多).它可以是库的形式,也可以是简单的函数,甚至是伪代码算法,它试图指定如何在屏幕上正确绘制知识.

正如之前的链接所暗示的那样,在Wolfram Mathematica中有一个包,命名KnotTheory就是这样(以几乎完整的方式).但是,它不可移植,也不是免费软件和访问它的模块对我来说非常麻烦(在Java中免费实现,只是为了命名一种语言,但每种语言都很好,从可移植性和开放性的角度看是理想的) .

我已经看到许多软件可用(但大多数都是旧的,无法访问或可用).你有一些很好的分享指南吗?

更新:由于两个投票结束这个问题已经出现,我正在以更务实和明确的方式重述它:是否有算法绘制和生成结?已经实施了一些东西

更新2(用于重新打开) 图形表示可以是3D渲染对象或2D svg图形(我正在从中抽象出来,因为我期待编程语言为Processing(或相同的Mathematica本身),它为您提供绘制的基元屏幕上的曲线(样条曲线,贝塞尔曲线等)(然后将它们导出为栅格或矢量图形).算法应采用一个结参数化作为输入(即,如果我们谈论由它们的交叉属性描述的结,它们的值是什么需要),返回上面的一个图形表示(即使是2d空间中的一系列点).也就是说,任何参数化都很好,我的目的只是为了得到如何绘制结的内省,以获得一个算法,以特定的方式做到这一点,导致一个特定的表示,会很好(Mathematica的lib似乎能够在如此多的表示中绘制它).

v.k*_*.k. 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;
}
Run Code Online (Sandbox Code Playgroud)