movie command line arguments
This commit is contained in:
parent
a8b4bb7c2c
commit
78769593a7
95
main.c
95
main.c
@ -11,6 +11,7 @@
|
|||||||
#include "linalg.h"
|
#include "linalg.h"
|
||||||
|
|
||||||
#define TOGGLE(a) do { (a) = !(a); } while(0)
|
#define TOGGLE(a) do { (a) = !(a); } while(0)
|
||||||
|
#define SIGN(x) ((x) > 0 ? 1.0 : -1.0)
|
||||||
|
|
||||||
DrawingContext *screen_context;
|
DrawingContext *screen_context;
|
||||||
|
|
||||||
@ -33,8 +34,16 @@ void setupContext(DrawingContext *ctx, int argc, char *argv[])
|
|||||||
ctx->parameter2 = atof(argv[8]);
|
ctx->parameter2 = atof(argv[8]);
|
||||||
else
|
else
|
||||||
ctx->parameter2 = 1.0;
|
ctx->parameter2 = 1.0;
|
||||||
// ctx->parameter = 2.77;
|
if(argc > 12) {
|
||||||
// ctx->parameter = 0.1;
|
ctx->movie_filename = argv[9];
|
||||||
|
ctx->movie_parameter_duration = atof(argv[10]);
|
||||||
|
ctx->movie_parameter2_duration = atof(argv[11]);
|
||||||
|
ctx->movie_n_frames = atoi(argv[12]);
|
||||||
|
} else {
|
||||||
|
ctx->movie_n_frames = 0;
|
||||||
|
}
|
||||||
|
// ctx->parameter = 2.77;
|
||||||
|
// ctx->parameter = 0.1;
|
||||||
ctx->show_boxes = 0;
|
ctx->show_boxes = 0;
|
||||||
ctx->show_boxes2 = 0;
|
ctx->show_boxes2 = 0;
|
||||||
ctx->show_attractors = 0;
|
ctx->show_attractors = 0;
|
||||||
@ -44,10 +53,10 @@ void setupContext(DrawingContext *ctx, int argc, char *argv[])
|
|||||||
ctx->show_dual_limit = 0;
|
ctx->show_dual_limit = 0;
|
||||||
ctx->show_text = 1;
|
ctx->show_text = 1;
|
||||||
ctx->mode = 0;
|
ctx->mode = 0;
|
||||||
ctx->use_rotation_basis = 2;
|
ctx->use_rotation_basis = 1;
|
||||||
ctx->limit_with_lines = 0;
|
ctx->limit_with_lines = 0;
|
||||||
ctx->use_repelling = 0;
|
ctx->use_repelling = 0;
|
||||||
ctx->show_marking = 1;
|
ctx->show_marking = 0;
|
||||||
ctx->marking.x = -0.73679;
|
ctx->marking.x = -0.73679;
|
||||||
ctx->marking.y = -0.01873;
|
ctx->marking.y = -0.01873;
|
||||||
ctx->show_coxeter_orbit = 0;
|
ctx->show_coxeter_orbit = 0;
|
||||||
@ -79,7 +88,7 @@ void computeMatrix(DrawingContext *ctx, gsl_matrix *result, const char *type)
|
|||||||
{
|
{
|
||||||
gsl_matrix **gen = getTempMatrices(ctx->ws, 6);
|
gsl_matrix **gen = getTempMatrices(ctx->ws, 6);
|
||||||
|
|
||||||
// ERROR(strlen(type) != 2, "Invalid call of computeRotationMatrix()\n");
|
// ERROR(strlen(type) != 2, "Invalid call of computeRotationMatrix()\n");
|
||||||
|
|
||||||
initializeTriangleGeneratorsCurrent(gen, ctx);
|
initializeTriangleGeneratorsCurrent(gen, ctx);
|
||||||
gsl_matrix_set_identity(result);
|
gsl_matrix_set_identity(result);
|
||||||
@ -158,8 +167,9 @@ void updateMatrices(DrawingContext *ctx)
|
|||||||
cartanMatrix(ctx->cartan, angle[0], angle[1], angle[2], ctx->parameter);
|
cartanMatrix(ctx->cartan, angle[0], angle[1], angle[2], ctx->parameter);
|
||||||
|
|
||||||
gsl_matrix *tmp = getTempMatrix(ctx->ws);
|
gsl_matrix *tmp = getTempMatrix(ctx->ws);
|
||||||
|
int nmodes = 5;
|
||||||
|
|
||||||
if(ctx->use_rotation_basis % 5 == 0) {
|
if(ctx->use_rotation_basis % nmodes == 0) {
|
||||||
gsl_matrix_set(tmp, 0, 0, 0.0);
|
gsl_matrix_set(tmp, 0, 0, 0.0);
|
||||||
gsl_matrix_set(tmp, 0, 1, sqrt(3.0)/2.0);
|
gsl_matrix_set(tmp, 0, 1, sqrt(3.0)/2.0);
|
||||||
gsl_matrix_set(tmp, 0, 2, -sqrt(3.0)/2.0);
|
gsl_matrix_set(tmp, 0, 2, -sqrt(3.0)/2.0);
|
||||||
@ -170,15 +180,25 @@ void updateMatrices(DrawingContext *ctx)
|
|||||||
gsl_matrix_set(tmp, 2, 1, 1.0);
|
gsl_matrix_set(tmp, 2, 1, 1.0);
|
||||||
gsl_matrix_set(tmp, 2, 2, 1.0);
|
gsl_matrix_set(tmp, 2, 2, 1.0);
|
||||||
gsl_matrix_memcpy(ctx->cob, tmp);
|
gsl_matrix_memcpy(ctx->cob, tmp);
|
||||||
} else if(ctx->use_rotation_basis % 5 == 1) {
|
} else if(ctx->use_rotation_basis % nmodes == 1) {
|
||||||
|
gsl_matrix_set(tmp, 0, 0, 1.0);
|
||||||
|
gsl_matrix_set(tmp, 0, 1, -1.0);
|
||||||
|
gsl_matrix_set(tmp, 0, 2, 0.0);
|
||||||
|
gsl_matrix_set(tmp, 1, 0, 1.0);
|
||||||
|
gsl_matrix_set(tmp, 1, 1, 1.0);
|
||||||
|
gsl_matrix_set(tmp, 1, 2, 0.0);
|
||||||
|
gsl_matrix_set(tmp, 2, 0, 0.0);
|
||||||
|
gsl_matrix_set(tmp, 2, 1, 0.0);
|
||||||
|
gsl_matrix_set(tmp, 2, 2, 1.0);
|
||||||
gsl_matrix_memcpy(ctx->cob, ctx->cartan); // is this a good choice of basis for any reason?
|
gsl_matrix_memcpy(ctx->cob, ctx->cartan); // is this a good choice of basis for any reason?
|
||||||
} else if(ctx->use_rotation_basis % 5 == 2) {
|
multiply_left(tmp, ctx->cob, ctx->ws);
|
||||||
|
} else if(ctx->use_rotation_basis % nmodes == 2) {
|
||||||
computeRotationMatrixFrame(ctx, tmp, "C");
|
computeRotationMatrixFrame(ctx, tmp, "C");
|
||||||
invert(tmp, ctx->cob, ctx->ws);
|
invert(tmp, ctx->cob, ctx->ws);
|
||||||
} else if(ctx->use_rotation_basis % 5 == 3) {
|
} else if(ctx->use_rotation_basis % nmodes == 3) {
|
||||||
computeBoxTransform(ctx, "acb", "cba", ctx->cob);
|
computeBoxTransform(ctx, "acb", "cba", ctx->cob);
|
||||||
// computeBoxTransform(ctx, "cab", "bca", ctx->cob);
|
// computeBoxTransform(ctx, "cab", "bca", ctx->cob);
|
||||||
// computeBoxTransform(ctx, "acb", "cba", ctx->cob);
|
// computeBoxTransform(ctx, "acb", "cba", ctx->cob);
|
||||||
} else {
|
} else {
|
||||||
cartanMatrix(tmp, M_PI/ctx->p[0], M_PI/ctx->p[1], M_PI/ctx->p[2], 1.0);
|
cartanMatrix(tmp, M_PI/ctx->p[0], M_PI/ctx->p[1], M_PI/ctx->p[2], 1.0);
|
||||||
diagonalize_symmetric_form(tmp, ctx->cob, ctx->ws);
|
diagonalize_symmetric_form(tmp, ctx->cob, ctx->ws);
|
||||||
@ -238,7 +258,7 @@ int processEvent(GraphicsInfo *info, XEvent *ev)
|
|||||||
unsigned long key;
|
unsigned long key;
|
||||||
char filename[100];
|
char filename[100];
|
||||||
|
|
||||||
// fprintf(stderr, "Event: %d\n", ev->type);
|
// fprintf(stderr, "Event: %d\n", ev->type);
|
||||||
|
|
||||||
switch(ev->type) {
|
switch(ev->type) {
|
||||||
case ButtonPress:
|
case ButtonPress:
|
||||||
@ -262,21 +282,33 @@ int processEvent(GraphicsInfo *info, XEvent *ev)
|
|||||||
|
|
||||||
switch(key) {
|
switch(key) {
|
||||||
case XK_Down:
|
case XK_Down:
|
||||||
|
if(ev->xkey.state & ShiftMask)
|
||||||
|
screen_context->parameter /= exp(0.00005);
|
||||||
|
else
|
||||||
screen_context->parameter /= exp(0.002);
|
screen_context->parameter /= exp(0.002);
|
||||||
updateMatrices(screen_context);
|
updateMatrices(screen_context);
|
||||||
computeLimitCurve(screen_context);
|
computeLimitCurve(screen_context);
|
||||||
break;
|
break;
|
||||||
case XK_Up:
|
case XK_Up:
|
||||||
|
if(ev->xkey.state & ShiftMask)
|
||||||
|
screen_context->parameter *= exp(0.00005);
|
||||||
|
else
|
||||||
screen_context->parameter *= exp(0.002);
|
screen_context->parameter *= exp(0.002);
|
||||||
updateMatrices(screen_context);
|
updateMatrices(screen_context);
|
||||||
computeLimitCurve(screen_context);
|
computeLimitCurve(screen_context);
|
||||||
break;
|
break;
|
||||||
case XK_Left:
|
case XK_Left:
|
||||||
|
if(ev->xkey.state & ShiftMask)
|
||||||
|
screen_context->parameter2 /= exp(0.00005);
|
||||||
|
else
|
||||||
screen_context->parameter2 /= exp(0.002);
|
screen_context->parameter2 /= exp(0.002);
|
||||||
updateMatrices(screen_context);
|
updateMatrices(screen_context);
|
||||||
computeLimitCurve(screen_context);
|
computeLimitCurve(screen_context);
|
||||||
break;
|
break;
|
||||||
case XK_Right:
|
case XK_Right:
|
||||||
|
if(ev->xkey.state & ShiftMask)
|
||||||
|
screen_context->parameter2 *= exp(0.00005);
|
||||||
|
else
|
||||||
screen_context->parameter2 *= exp(0.002);
|
screen_context->parameter2 *= exp(0.002);
|
||||||
updateMatrices(screen_context);
|
updateMatrices(screen_context);
|
||||||
computeLimitCurve(screen_context);
|
computeLimitCurve(screen_context);
|
||||||
@ -297,7 +329,7 @@ int processEvent(GraphicsInfo *info, XEvent *ev)
|
|||||||
computeLimitCurve(screen_context);
|
computeLimitCurve(screen_context);
|
||||||
break;
|
break;
|
||||||
case XK_Return:
|
case XK_Return:
|
||||||
// screen_context->parameter = 2.76375163;
|
// screen_context->parameter = 2.76375163;
|
||||||
screen_context->parameter = 5.29063366;
|
screen_context->parameter = 5.29063366;
|
||||||
updateMatrices(screen_context);
|
updateMatrices(screen_context);
|
||||||
computeLimitCurve(screen_context);
|
computeLimitCurve(screen_context);
|
||||||
@ -346,37 +378,18 @@ int processEvent(GraphicsInfo *info, XEvent *ev)
|
|||||||
print(screen_context);
|
print(screen_context);
|
||||||
break;
|
break;
|
||||||
case 'M':
|
case 'M':
|
||||||
/*
|
|
||||||
screen_context->limit_with_lines = 0;
|
screen_context->limit_with_lines = 0;
|
||||||
double parameter_start = screen_context->parameter;
|
double parameter_start = screen_context->parameter;
|
||||||
for(int i = 0; i <= 1300; i++) {
|
double parameter2_start = screen_context->parameter2;
|
||||||
if(i < 400)
|
for(int i = 0; i <= screen_context->movie_n_frames; i++) {
|
||||||
screen_context->parameter = exp(log(parameter_start)+0.002*i);
|
screen_context->parameter = SIGN(parameter_start)*exp(log(fabs(parameter_start)) +
|
||||||
else if(i < 500)
|
i*screen_context->movie_parameter_duration/screen_context->movie_n_frames);
|
||||||
screen_context->parameter = exp(log(parameter_start)+0.002*400);
|
screen_context->parameter2 = SIGN(parameter2_start)*exp(log(fabs(parameter2_start)) +
|
||||||
else
|
i*screen_context->movie_parameter2_duration/screen_context->movie_n_frames);
|
||||||
screen_context->parameter = exp(log(parameter_start)+0.002*(900-i));
|
|
||||||
updateMatrices(screen_context);
|
updateMatrices(screen_context);
|
||||||
computeLimitCurve(screen_context);
|
computeLimitCurve(screen_context);
|
||||||
draw(screen_context);
|
draw(screen_context);
|
||||||
sprintf(filename, "movie3/test%03d.png", i);
|
sprintf(filename, "output/%s%03d.png", screen_context->movie_filename, i);
|
||||||
cairo_surface_write_to_png(info->buffer_surface, filename);
|
|
||||||
printf("Finished drawing %s\n", filename);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
screen_context->limit_with_lines = 0;
|
|
||||||
double parameter_start = screen_context->parameter;
|
|
||||||
for(int i = 0; i <= 1300; i++) {
|
|
||||||
if(i < 400)
|
|
||||||
screen_context->parameter = exp(0.003*i);
|
|
||||||
else if(i < 500)
|
|
||||||
screen_context->parameter = exp(0.003*400);
|
|
||||||
else
|
|
||||||
screen_context->parameter = exp(0.003*(900-i));
|
|
||||||
updateMatrices(screen_context);
|
|
||||||
computeLimitCurve(screen_context);
|
|
||||||
draw(screen_context);
|
|
||||||
sprintf(filename, "movie5/test%03d.png", i);
|
|
||||||
cairo_surface_write_to_png(info->buffer_surface, filename);
|
cairo_surface_write_to_png(info->buffer_surface, filename);
|
||||||
printf("Finished drawing %s\n", filename);
|
printf("Finished drawing %s\n", filename);
|
||||||
}
|
}
|
||||||
@ -415,14 +428,14 @@ int main(int argc, char *argv[])
|
|||||||
if(!info)
|
if(!info)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
info->dim->matrix.xx = 274.573171;
|
info->dim->matrix.xx = 274.573171;
|
||||||
info->dim->matrix.xy = 0.000000;
|
info->dim->matrix.xy = 0.000000;
|
||||||
info->dim->matrix.x0 = 583.073462;
|
info->dim->matrix.x0 = 583.073462;
|
||||||
info->dim->matrix.yx = 0.000000;
|
info->dim->matrix.yx = 0.000000;
|
||||||
info->dim->matrix.yy = 274.573171;
|
info->dim->matrix.yy = 274.573171;
|
||||||
info->dim->matrix.y0 = 777.225293;
|
info->dim->matrix.y0 = 777.225293;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
info->dim->matrix.xx = 274.573171;
|
info->dim->matrix.xx = 274.573171;
|
||||||
info->dim->matrix.xy = 0.000000;
|
info->dim->matrix.xy = 0.000000;
|
||||||
|
4
main.h
4
main.h
@ -36,6 +36,10 @@ typedef struct {
|
|||||||
int p[3],k[3];
|
int p[3],k[3];
|
||||||
double parameter;
|
double parameter;
|
||||||
double parameter2;
|
double parameter2;
|
||||||
|
char *movie_filename;
|
||||||
|
double movie_parameter_duration;
|
||||||
|
double movie_parameter2_duration;
|
||||||
|
int movie_n_frames;
|
||||||
int n_group_elements;
|
int n_group_elements;
|
||||||
int n_group_elements_combinatorial;
|
int n_group_elements_combinatorial;
|
||||||
int show_boxes;
|
int show_boxes;
|
||||||
|
Loading…
Reference in New Issue
Block a user