如何将L系统逻辑应用于段

时间:2015-07-20 11:39:09

标签: javascript canvas recursion fractals l-systems

编辑
这是一个正确应用长度和模型的新版本,但没有正确定位模型。我认为这可能会有所帮助。

http://codepen.io/pixelass/pen/78f9e97579f99dc4ae0473e33cae27d5?editors=001

我有2个画布实例

  1. 模型
  2. 结果
  3. 在模型视图上,用户可以拖动手柄来修改模型 然后,结果视图应该将模型应用于每个段(相对)

    这只是分形曲线的基本l系统逻辑,尽管我在将模型应用于分段时遇到了问题。

    如下图所示:红线应该复制模型,但我无法弄清楚如何正确应用逻辑

    我在这里有一个演示版:http://codepen.io/pixelass/pen/c4d7650af7ce4901425b326ad7a4b259

    enter image description here

    ES6

    //gcc ./cos.c -O1 -fopenmp -ffast-math -lm -mavx2 
    #include <math.h>
    
    int N = 3200;
    double b[3200];
    double a[3200];
    
    int main (void)
    {
      int i;
    
      #pragma omp simd
      for (i = 0; i < N; i += 1)
      {
        b[i] = cos (a[i]);
      }
    
      return (0);
    }
    

1 个答案:

答案 0 :(得分:0)

编写一个函数来变换给定点的点,旧原点(模型线段的起点),新原点(子线段的起点),角度和比例(已经计算过)这些):

var transformPoint = function transformPoint(point, oldOrigin, newOrigin, angle, dist) {

  // subtract old origin to rotate and scale relative to it:
  var x = point.x - oldOrigin.x;
  var y = point.y - oldOrigin.y;

  // rotate by angle
  var sine = sin(angle)
  var cosine = cos(angle)
  var rotatedX = (x * cosine) - (y * sine);
  var rotatedY = (x * sine) + (y * cosine);

  // scale
  rotatedX *= dist;
  rotatedY *= dist;

  // offset by new origin and return:
  return {x: rotatedX + newOrigin.x - oldOrigin.x, y: rotatedY + newOrigin.y - oldOrigin.y }
}

您需要使用旧原点进行翻译(以便可以围绕它进行旋转),然后旋转,然后缩放,然后按新原点进行翻译。然后返回点。

modelLogic [0]是旧的原点,因为它定义了模型中段的起点,而点[0]是新的原点,因为它是变换映射到的原点。

您可以通过drawModel函数调用该函数,如下所示:

  let p1 = transformPoint(modelLogic[0], modelLogic[0], points[0], angle, dist);
  let p2 = transformPoint(modelLogic[1], modelLogic[0], points[0], angle, dist);
  let p3 = transformPoint(modelLogic[2], modelLogic[0], points[0], angle, dist);
  let p4 = transformPoint(modelLogic[3], modelLogic[0], points[0], angle, dist);
  let p5 = transformPoint(modelLogic[4], modelLogic[0], points[0], angle, dist);

并更改您的绘图代码以使用返回的点p1,p2等而不是x1,y1,x2,y2等。

或者,您可以创建一个矩阵来表示所有这些平移,旋转和缩放变换,并依次变换每个点。