|
Ivan Mahonin |
23236b |
#include <math.h>
|
|
Ivan Mahonin |
23236b |
#include <gtk/gtk.h>
|
|
Ivan Mahonin |
23236b |
|
|
Ivan Mahonin |
23236b |
|
|
Ivan Mahonin |
23236b |
const double pi = 3.141592653589793;
|
|
Ivan Mahonin |
23236b |
|
|
Ivan Mahonin |
23236b |
void line(cairo_t *cr, double x1, double y1, double x2, double y2) {
|
|
Ivan Mahonin |
23236b |
cairo_move_to(cr, x1, y1);
|
|
Ivan Mahonin |
23236b |
cairo_line_to(cr, x2, y2);
|
|
Ivan Mahonin |
23236b |
cairo_set_source_rgba(cr, 0, 0, 0, 1);
|
|
Ivan Mahonin |
23236b |
cairo_stroke(cr);
|
|
Ivan Mahonin |
23236b |
}
|
|
Ivan Mahonin |
23236b |
|
|
Ivan Mahonin |
23236b |
void figure(cairo_t *cr, double x1, double y1, double x2, double y2, int level) {
|
|
Ivan Mahonin |
23236b |
if (level < 5) {
|
|
Ivan Mahonin |
23236b |
double ax = (x2 - x1)/3 + x1;
|
|
Ivan Mahonin |
23236b |
double ay = (y2 - y1)/3 + y1;
|
|
Ivan Mahonin |
23236b |
|
|
Ivan Mahonin |
23236b |
double cx = (x1 - x2)/3 + x2;
|
|
Ivan Mahonin |
23236b |
double cy = (y1 - y2)/3 + y2;
|
|
Ivan Mahonin |
23236b |
|
|
Ivan Mahonin |
23236b |
double bx = (ax + cx)/2 + (cy - ay)*sin(60.0/180.0*pi);
|
|
Ivan Mahonin |
23236b |
double by = (ay + cy)/2 - (cx - ax)*sin(60.0/180.0*pi);
|
|
Ivan Mahonin |
23236b |
|
|
Ivan Mahonin |
23236b |
figure(cr, x1, y1, ax, ay, level+1);
|
|
Ivan Mahonin |
23236b |
figure(cr, ax, ay, bx, by, level+1);
|
|
Ivan Mahonin |
23236b |
figure(cr, bx, by, cx, cy, level+1);
|
|
Ivan Mahonin |
23236b |
figure(cr, cx, cy, x2, y2, level+1);
|
|
Ivan Mahonin |
23236b |
} else {
|
|
Ivan Mahonin |
23236b |
line(cr, x1, y1, x2, y2);
|
|
Ivan Mahonin |
23236b |
}
|
|
Ivan Mahonin |
23236b |
}
|
|
Ivan Mahonin |
23236b |
|
|
Ivan Mahonin |
23236b |
gboolean draw(GtkWidget *widget, cairo_t *cr, gpointer data) {
|
|
Ivan Mahonin |
23236b |
cairo_set_source_rgba(cr, 0.9, 0.9, 0.9, 1);
|
|
Ivan Mahonin |
23236b |
cairo_paint(cr);
|
|
Ivan Mahonin |
23236b |
figure(cr, 100, 400, 500, 400, 0);
|
|
Ivan Mahonin |
23236b |
return TRUE;
|
|
Ivan Mahonin |
23236b |
}
|
|
Ivan Mahonin |
23236b |
|
|
Ivan Mahonin |
23236b |
void activate(GtkApplication* app, gpointer data) {
|
|
Ivan Mahonin |
23236b |
GtkWidget *window = gtk_application_window_new (app);
|
|
Ivan Mahonin |
23236b |
g_signal_connect(window, "draw", G_CALLBACK(draw), NULL);
|
|
Ivan Mahonin |
23236b |
gtk_window_set_default_size(GTK_WINDOW(window), 600, 600);
|
|
Ivan Mahonin |
23236b |
gtk_widget_show_all(window);
|
|
Ivan Mahonin |
23236b |
}
|
|
Ivan Mahonin |
23236b |
|
|
Ivan Mahonin |
23236b |
int main(int argc, char **argv) {
|
|
Ivan Mahonin |
23236b |
GtkApplication *application = gtk_application_new(NULL, 0);
|
|
Ivan Mahonin |
23236b |
g_signal_connect(application, "activate", G_CALLBACK(activate), NULL);
|
|
Ivan Mahonin |
23236b |
int status = g_application_run(G_APPLICATION(application), argc, argv);
|
|
Ivan Mahonin |
23236b |
g_object_unref(application);
|
|
Ivan Mahonin |
23236b |
return status;
|
|
Ivan Mahonin |
23236b |
}
|