Advertisement
Guest User

Recursive Tree in Sine Motion by Gerhard Funk

a guest
Sep 30th, 2013
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.97 KB | None | 0 0
  1. // Recursive Tree in Sine Motion // Gerhard Funk www.gerhard-funk.de
  2.  
  3. PVector startPos = new PVector ();
  4. float startDistance = 100;
  5. int trunkAngle=-90;
  6. float branchesAngle=0;
  7. float angleAdd=0;
  8. float startLinThick=20;
  9. int iterNum=0;
  10. int iterLimit=10;
  11.  
  12. void setup() {
  13. size (800,800);
  14. smooth();
  15. frameRate(24);
  16. startPos.set(width/2,height/2,0.0);
  17. }
  18.  
  19. void draw () {
  20. background (235);
  21. int sunAngle = (frameCount%360)*4;
  22. int sunRadius = 300;
  23. float sunx = (cos(radians(sunAngle+180)) * sunRadius) + startPos.x;
  24. float suny = (sin(radians(sunAngle+180)) * sunRadius) + startPos.y;
  25.  
  26. ellipseMode(CENTER);
  27. fill(0);
  28. ellipse(startPos.x, startPos.y, 80, 80); //drawing black Circle at center
  29. fill(255,0,0);
  30. ellipse (sunx, suny, 50, 50); //drawing red Circle (Sun)
  31.  
  32. startDistance = round(suny-height/2)*-0.6;
  33. tree (startPos,trunkAngle,startDistance,startLinThick,iterNum);
  34. treeBezier(startPos,trunkAngle,startDistance,startLinThick,iterNum,false);
  35. branchesAngle = 75 * sin(radians(sunAngle));
  36.  
  37. fill(0,255,0);
  38. ellipse(startPos.x, startPos.y, 50, 50); //drawing green circle
  39. }
  40.  
  41. void tree (PVector startP, float angle, float distance, float linesThick, int _iterNum) {
  42. PVector endP = new PVector();
  43. endP.x=cos(radians(angle))*distance+startP.x;
  44. endP.y=sin(radians(angle))*distance+startP.y;
  45. //DRAW
  46. strokeWeight (linesThick);
  47. stroke(0);
  48. line(startP.x,startP.y,endP.x,endP.y);
  49. //RECURSION
  50. linesThick=linesThick*0.625;
  51. if (linesThick<=0) {linesThick=1;}
  52. angleAdd +=0.1;
  53. distance-=1;
  54. _iterNum+=1;
  55. if (_iterNum>=iterLimit) {return;}
  56. tree (endP,angle+branchesAngle,distance*0.625,linesThick, _iterNum);
  57. tree (endP,angle-branchesAngle,distance*0.625,linesThick, _iterNum);
  58. }
  59.  
  60. void treeBezier (PVector startP, float angle, float distance, float linesThick, int _iterNum, boolean mirror) {
  61. PVector endP = new PVector();
  62. PVector startT = new PVector();
  63. PVector endT = new PVector();
  64. float angleT = 30;
  65. float lengthT = 3; //attention, never set to zero, otherways causes “division by zero”
  66.  
  67. if(mirror) {angleT = angleT*-1;}
  68. endP.x=cos(radians(angle))*distance+startP.x;
  69. endP.y=sin(radians(angle))*distance+startP.y;
  70. startT.x=cos(radians(angle+angleT))*distance/lengthT+startP.x;
  71. startT.y=sin(radians(angle+angleT))*distance/lengthT+startP.y;
  72. endT.x=cos(radians(angle+angleT))*distance/lengthT*-1+endP.x;
  73. endT.y=sin(radians(angle+angleT))*distance/lengthT*-1+endP.y;
  74. //DRAW
  75. strokeWeight (linesThick/3);
  76. stroke(0,255,0);
  77. noFill();
  78. bezier(startP.x, startP.y, startT.x, startT.y, endT.x, endT.y, endP.x, endP.y);
  79. //RECURSION
  80. linesThick=linesThick*0.625;
  81. if (linesThick<=0) {linesThick=1;}
  82. angleAdd +=0.1;
  83. distance-=1;
  84. _iterNum+=1;
  85. if (_iterNum>=iterLimit) {return;}
  86. treeBezier (endP,angle+branchesAngle,distance*0.625,linesThick, _iterNum, true);
  87. treeBezier (endP,angle-branchesAngle,distance*0.625,linesThick, _iterNum, false);
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement