1cb93a386Sopenharmony_ci// Copyright 2020 Google LLC. 2cb93a386Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. 3cb93a386Sopenharmony_ci#include "tools/fiddle/examples.h" 4cb93a386Sopenharmony_ciREG_FIDDLE_ANIMATED(l_system_plant, 256, 256, false, 0, 3) { 5cb93a386Sopenharmony_ci// L-System 6cb93a386Sopenharmony_ci// https://en.wikipedia.org/wiki/L-system#Example_7:_Fractal_plant 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_cistruct rules_t { 9cb93a386Sopenharmony_ci char c; 10cb93a386Sopenharmony_ci std::string s; 11cb93a386Sopenharmony_ci}; 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_cirules_t rules[6] = { 14cb93a386Sopenharmony_ci {'X', "F-[[X]+X]+F[+FX]-X"}, 15cb93a386Sopenharmony_ci {'F', "FF"}, 16cb93a386Sopenharmony_ci {'+', "+"}, 17cb93a386Sopenharmony_ci {'-', "-"}, 18cb93a386Sopenharmony_ci {'[', "["}, 19cb93a386Sopenharmony_ci {']', "]"}, 20cb93a386Sopenharmony_ci}; 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_cistd::string E(std::string s) { 23cb93a386Sopenharmony_ci if (s.size() == 0) { 24cb93a386Sopenharmony_ci return ""; 25cb93a386Sopenharmony_ci } 26cb93a386Sopenharmony_ci for (int i=0; i<6; i++) { 27cb93a386Sopenharmony_ci if (rules[i].c == s[0]) { 28cb93a386Sopenharmony_ci return rules[i].s + E(s.substr(1)); 29cb93a386Sopenharmony_ci } 30cb93a386Sopenharmony_ci } 31cb93a386Sopenharmony_ci return ""; 32cb93a386Sopenharmony_ci} 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_cistruct Pt { 35cb93a386Sopenharmony_ci SkScalar x; 36cb93a386Sopenharmony_ci SkScalar y; 37cb93a386Sopenharmony_ci SkScalar a; 38cb93a386Sopenharmony_ci}; 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_civoid draw(SkCanvas* canvas) { 41cb93a386Sopenharmony_ci canvas->drawColor(SK_ColorLTGRAY); 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci SkPaint p; 44cb93a386Sopenharmony_ci p.setColor(0xFFA6761D); 45cb93a386Sopenharmony_ci p.setAntiAlias(true); 46cb93a386Sopenharmony_ci p.setStyle(SkPaint::kStroke_Style); 47cb93a386Sopenharmony_ci p.setStrokeWidth(1); 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci std::vector<struct Pt> ptstack; 50cb93a386Sopenharmony_ci std::string plant = E(E(E(E(E("X"))))); 51cb93a386Sopenharmony_ci const double len = 2.5; 52cb93a386Sopenharmony_ci struct Pt pt = {128, 256, 3.14}; 53cb93a386Sopenharmony_ci SkPath path; 54cb93a386Sopenharmony_ci path.moveTo(pt.x, pt.y); 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci for (std::string::iterator it=plant.begin(); it!=plant.end(); ++it) { 57cb93a386Sopenharmony_ci if (*it == 'F') { 58cb93a386Sopenharmony_ci pt.x += len*sin(pt.a); 59cb93a386Sopenharmony_ci pt.y += len*cos(pt.a); 60cb93a386Sopenharmony_ci path.lineTo(pt.x, pt.y); 61cb93a386Sopenharmony_ci } else if (*it == '+') { 62cb93a386Sopenharmony_ci pt.a += (0.15 + sin(frame*2.0*3.14159)*0.05); 63cb93a386Sopenharmony_ci } else if (*it == '-') { 64cb93a386Sopenharmony_ci pt.a += (-0.15 + sin(frame*2.0*3.14159)*0.05); 65cb93a386Sopenharmony_ci } else if (*it == '[') { 66cb93a386Sopenharmony_ci ptstack.push_back(pt); 67cb93a386Sopenharmony_ci } else if (*it == ']') { 68cb93a386Sopenharmony_ci pt = ptstack.back(); 69cb93a386Sopenharmony_ci ptstack.pop_back(); 70cb93a386Sopenharmony_ci path.moveTo(pt.x, pt.y); 71cb93a386Sopenharmony_ci } 72cb93a386Sopenharmony_ci } 73cb93a386Sopenharmony_ci canvas->drawPath(path, p); 74cb93a386Sopenharmony_ci} 75cb93a386Sopenharmony_ci} // END FIDDLE 76