vine.scad 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. module vine(number, diameter, decrease, target, rateOfChange, chanceOfFork, chaos, chanceOfForkIncrease, seed = 1) {
  2. function rnd(s) = rands(0,1,1,s)[0];
  3. if (number > 0) {
  4. union() {
  5. polygon([
  6. [-diameter / 2,0],
  7. [(-diameter * decrease)/2, 3],
  8. [(diameter * decrease)/2, 3],
  9. [diameter / 2,0]
  10. ]);
  11. translate([0,3]) circle(diameter * decrease / 2);
  12. //cylinder(3, diameter, diameter * decrease);
  13. //translate([0,0,3]) sphere(diameter * decrease);
  14. }
  15. rndFork = rands(0,1,1,seed)[0];
  16. fork = rndFork < chanceOfFork;
  17. forks = fork ? [0,-45] : [0];
  18. rndForks = rands(0,1,len(forks),rndFork);
  19. rndForks2 = rands(0,1,len(forks),rndForks[len(rndForks) - 1]);
  20. rndForks3 = rands(0,1,len(forks),rndForks[len(rndForks2) - 1]);
  21. rndForks4 = rands(0,1,len(forks),rndForks[len(rndForks3) - 1]);
  22. for (i = [0:len(forks)-1]) {
  23. turn = rateOfChange * rndForks[i] * sign(target) + forks[i] * rndForks2[i] + (rndForks3[i] - .5) * chaos;
  24. translate([0,3,0]) rotate([0,0,turn])
  25. vine(
  26. number - 1,
  27. diameter * decrease,
  28. decrease,
  29. target - turn,
  30. rateOfChange,
  31. //fork ? chanceOfFork / 2 : chanceOfFork,
  32. fork ? 0 : chanceOfFork + chanceOfForkIncrease,
  33. chaos,
  34. chanceOfForkIncrease,
  35. rndForks4[i]
  36. );
  37. }
  38. }
  39. }
  40. /*
  41. $fn=16;
  42. linear_extrude(height = 10, center = true, convexity = 10)
  43. vine(
  44. number = 20,
  45. diameter = 3,
  46. decrease = .9,
  47. target = 0,
  48. rateOfChange = 4,
  49. chanceOfFork = 0,
  50. chanceOfForkIncrease = .116,
  51. chaos = 60,
  52. seed=3
  53. );
  54. */