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

时间:2014-08-22 09:14:05

标签: java image-processing wolfram-mathematica processing

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

我已经看到很多关于结理论的链接,从punctual referencesgeneral information

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

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

我已经看到many软件可用(但many已旧,无法访问或可用)。 你有一些很好的分享指南吗?

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

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

2 个答案:

答案 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完成的标准结理论可视化和计算的例子。