Sierpinski curve: Difference between revisions
m
Refactored C++ code
Alpha bravo (talk | contribs) (Added AutoHotkey) |
m (Refactored C++ code) |
||
Line 173:
#include <string>
class sierpinski_curve {
std::string rewrite(const std::string& s) {▼
public:
void write(std::ostream& out, int size, double x, double y,
private:
void line(std::ostream& out);
void execute(std::ostream& out, const std::string& s);
double x_;
double y_;
int angle_;
int length_;
};
void sierpinski_curve::write(std::ostream& out, int size, double x, double y,
int length, int order) {
length_ = length;
x_ = x;
y_ = y;
angle_ = 45;
out << "<svg xmlns='http://www.w3.org/2000/svg' width='"▼
<< size << "' height='" << size << "'>\n";▼
out << "<rect width='100%' height='100%' fill='white'/>\n";▼
out << "<path stroke-width='1' stroke='black' fill='none' d='";▼
std::string s = "F--XF--F--XF";▼
for (int i = 0; i < order; ++i)▼
s = rewrite(s);▼
out << "'/>\n</svg>\n";▼
}
std::string sierpinski_curve::rewrite(const std::string& s) {
std::string t;
for (char c : s) {
Line 184 ⟶ 215:
}
void sierpinski_curve::line(std::ostream& out
}
void sierpinski_curve::execute(std::ostream& out, const std::string& s
out << 'M' << x_ <<
for (char c : s) {
case 'F':
▲ line(out, x, y, length, angle);
case
angle_ = (angle_ + 45) % 360;
break;
case '-':
angle_ = (angle_ - 45) % 360;
break;
}
}
}
int main() {
std::ofstream out("sierpinski_curve.svg");
if (!out) {
Line 214 ⟶ 246:
return 1;
}
sierpinski_curve s;
▲ out << "<svg xmlns='http://www.w3.org/2000/svg' width='"
s.write(out, 545, 5, 10, 7, 5);
▲ << size << "' height='" << size << "'>\n";
▲ out << "<rect width='100%' height='100%' fill='white'/>\n";
▲ out << "<path stroke-width='1' stroke='black' fill='none' d='";
▲ std::string s = "F--XF--F--XF";
▲ for (int i = 0; i < order; ++i)
▲ s = rewrite(s);
▲ execute(out, s, x, y, length, 45);
▲ out << "'/>\n</svg>\n";
return 0;
}</lang>
{{out}}
See: [https://slack-files.com/T0CNUL56D-
=={{header|Factor}}==
|