curved boxes
This commit is contained in:
parent
0cde265d1e
commit
f257364907
205
draw.c
205
draw.c
@ -218,6 +218,8 @@ void drawBoxLines(DrawingContext *ctx, const char *word1, const char *word2)
|
|||||||
drawPolygon(ctx, 0, 4, p[0][0], i[0], p[1][0], i[1]);
|
drawPolygon(ctx, 0, 4, p[0][0], i[0], p[1][0], i[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void drawBoxStd(DrawingContext *ctx, const char *word, char base)
|
void drawBoxStd(DrawingContext *ctx, const char *word, char base)
|
||||||
{
|
{
|
||||||
char word1[100];
|
char word1[100];
|
||||||
@ -384,8 +386,6 @@ void drawArc(DrawingContext *ctx, const char *word, vector_t start, vector_type_
|
|||||||
angle_end_delta = acos(-fabs(gsl_vector_get(vector_in_frame, 2))/radius/
|
angle_end_delta = acos(-fabs(gsl_vector_get(vector_in_frame, 2))/radius/
|
||||||
sqrt(gsl_vector_get(vector_in_frame, 0)*gsl_vector_get(vector_in_frame, 0) +
|
sqrt(gsl_vector_get(vector_in_frame, 0)*gsl_vector_get(vector_in_frame, 0) +
|
||||||
gsl_vector_get(vector_in_frame, 1)*gsl_vector_get(vector_in_frame, 1)));
|
gsl_vector_get(vector_in_frame, 1)*gsl_vector_get(vector_in_frame, 1)));
|
||||||
|
|
||||||
printf("angle_end_delta: %f\n", angle_end_delta);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int previous_inside = 0;
|
int previous_inside = 0;
|
||||||
@ -408,9 +408,6 @@ void drawArc(DrawingContext *ctx, const char *word, vector_t start, vector_type_
|
|||||||
if(i%2)
|
if(i%2)
|
||||||
FLIP(angle_start_final, angle_end_final);
|
FLIP(angle_start_final, angle_end_final);
|
||||||
|
|
||||||
printf("start: %f, end: %f, other: %f, third: %f\n", angle_start_final, angle_end_final, angle_end_other, angle_third);
|
|
||||||
printf("interval1: %d, interval2: %d, diff: %f %f %f\n", ANGLE_IN_INTERVAL(angle_start, angle_end_final, angle_end_other), ANGLE_IN_INTERVAL(angle_start_final, angle_end_final, angle_third), ANGLE_DIFF(angle_end_final, angle_start_final), ANGLE_DIFF(angle_end_other, angle_start_final), ANGLE_DIFF(angle_third, angle_start_final));
|
|
||||||
|
|
||||||
if(endtype == VT_LINE && ANGLE_IN_INTERVAL(angle_start_final, angle_end_final, angle_end_other))
|
if(endtype == VT_LINE && ANGLE_IN_INTERVAL(angle_start_final, angle_end_final, angle_end_other))
|
||||||
continue;
|
continue;
|
||||||
if(contain && !ANGLE_IN_INTERVAL(angle_start_final, angle_end_final, angle_third))
|
if(contain && !ANGLE_IN_INTERVAL(angle_start_final, angle_end_final, angle_third))
|
||||||
@ -421,9 +418,6 @@ void drawArc(DrawingContext *ctx, const char *word, vector_t start, vector_type_
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// printf("angle_start: %f, angle_end: %f, angle_third: %f\n", angle_start, angle_end, angle_third);
|
|
||||||
|
|
||||||
for(int k = 0; k <= iterations; k++) {
|
for(int k = 0; k <= iterations; k++) {
|
||||||
angle = angle_start_final + (double)k/(double)iterations * ANGLE_DIFF(angle_end_final, angle_start_final);
|
angle = angle_start_final + (double)k/(double)iterations * ANGLE_DIFF(angle_end_final, angle_start_final);
|
||||||
|
|
||||||
@ -490,25 +484,59 @@ void drawAttractors(DrawingContext *ctx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawCurvedBox(DrawingContext *ctx)
|
char *conjugate_word(const char *word, int modifier, const char *conj, char *buffer)
|
||||||
|
{
|
||||||
|
int wordlen = strlen(word);
|
||||||
|
int conjlen = strlen(conj);
|
||||||
|
|
||||||
|
for(int i = 0; i < conjlen; i++) {
|
||||||
|
buffer[i] = conj[i];
|
||||||
|
buffer[2*conjlen+wordlen-1-i] = conj[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < wordlen; i++) {
|
||||||
|
if(word[i] == ' ')
|
||||||
|
buffer[conjlen+i] = word[i];
|
||||||
|
else
|
||||||
|
buffer[conjlen+i] = (word[i]+modifier-'a')%3 + 'a';
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer[2*conjlen + wordlen] = 0;
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawCurvedBox(DrawingContext *ctx, int base, const char *conj)
|
||||||
{
|
{
|
||||||
vector_t p[6][3];
|
vector_t p[6][3];
|
||||||
vector_t l[2][3];
|
vector_t l[2][3];
|
||||||
|
char word[100];
|
||||||
|
int modifier = base - 'A';
|
||||||
|
|
||||||
fixedPoints(ctx, "abc", p[0]);
|
conjugate_word("abc", modifier, conj, word);
|
||||||
fixedPoints(ctx, "bca", p[1]);
|
fixedPoints(ctx, word, p[0]);
|
||||||
fixedPoints(ctx, "babcb", p[2]);
|
conjugate_word("bca", modifier, conj, word);
|
||||||
fixedPoints(ctx, "ababcba", p[3]);
|
fixedPoints(ctx, word, p[1]);
|
||||||
fixedPoints(ctx, "bacac abc cacab", p[4]);
|
conjugate_word("b abc b", modifier, conj, word);
|
||||||
fixedPoints(ctx, "abacac abc cacaba", p[5]);
|
fixedPoints(ctx, word, p[2]);
|
||||||
|
conjugate_word("ab abc ba", modifier, conj, word);
|
||||||
|
fixedPoints(ctx, word, p[3]);
|
||||||
|
conjugate_word("baca cab acab", modifier, conj, word);
|
||||||
|
fixedPoints(ctx, word, p[4]);
|
||||||
|
conjugate_word("abaca cab acaba", modifier, conj, word);
|
||||||
|
fixedPoints(ctx, word, p[5]);
|
||||||
|
|
||||||
LOOP(j) l[0][j] = cross(p[0][(3-j)%3], p[0][(4-j)%3]);
|
LOOP(j) l[0][j] = cross(p[0][(3-j)%3], p[0][(4-j)%3]);
|
||||||
LOOP(j) l[1][j] = cross(p[1][(3-j)%3], p[1][(4-j)%3]);
|
LOOP(j) l[1][j] = cross(p[1][(3-j)%3], p[1][(4-j)%3]);
|
||||||
|
|
||||||
drawArc(ctx, "ab", p[0][0], VT_POINT, p[2][0], VT_POINT, p[1][0], 0);
|
conjugate_word("ab", modifier, conj, word);
|
||||||
drawArc(ctx, "bcab", p[2][0], VT_POINT, l[1][0], VT_LINE, p[4][0], 1);
|
drawArc(ctx, word, p[0][0], VT_POINT, p[2][0], VT_POINT, p[1][0], 0);
|
||||||
drawArc(ctx, "ab", p[1][0], VT_POINT, p[3][0], VT_POINT, p[0][0], 0);
|
conjugate_word("bcab", modifier, conj, word);
|
||||||
drawArc(ctx, "abcaba", p[3][0], VT_POINT, l[0][0], VT_LINE, p[5][0], 1);
|
drawArc(ctx, word, p[2][0], VT_POINT, l[1][0], VT_LINE, p[4][0], 1);
|
||||||
|
conjugate_word("ab", modifier, conj, word);
|
||||||
|
drawArc(ctx, word, p[1][0], VT_POINT, p[3][0], VT_POINT, p[0][0], 0);
|
||||||
|
conjugate_word("abcaba", modifier, conj, word);
|
||||||
|
drawArc(ctx, word, p[3][0], VT_POINT, l[0][0], VT_LINE, p[5][0], 1);
|
||||||
|
|
||||||
drawCovector(ctx, l[0][0]);
|
drawCovector(ctx, l[0][0]);
|
||||||
drawCovector(ctx, l[1][0]);
|
drawCovector(ctx, l[1][0]);
|
||||||
@ -520,8 +548,9 @@ void drawBoxes(DrawingContext *ctx)
|
|||||||
gsl_matrix *rot = getTempMatrix(ctx->ws);
|
gsl_matrix *rot = getTempMatrix(ctx->ws);
|
||||||
gsl_matrix **gen = getTempMatrices(ctx->ws, 3);
|
gsl_matrix **gen = getTempMatrices(ctx->ws, 3);
|
||||||
cairo_t *C = ctx->cairo;
|
cairo_t *C = ctx->cairo;
|
||||||
|
cairo_save(C);
|
||||||
|
|
||||||
vector_t p[6][3];
|
vector_t p[22][3];
|
||||||
vector_t l[6][3];
|
vector_t l[6][3];
|
||||||
vector_t alpha[6];
|
vector_t alpha[6];
|
||||||
|
|
||||||
@ -534,9 +563,140 @@ void drawBoxes(DrawingContext *ctx)
|
|||||||
for(int i = 0; i < 6; i++) LOOP(j) l[i][j] = cross(p[i][(3-j)%3], p[i][(4-j)%3]);
|
for(int i = 0; i < 6; i++) LOOP(j) l[i][j] = cross(p[i][(3-j)%3], p[i][(4-j)%3]);
|
||||||
LOOP(i) LOOP(j) alpha[i].x[j] = gsl_matrix_get(ctx->cartan, i, j);
|
LOOP(i) LOOP(j) alpha[i].x[j] = gsl_matrix_get(ctx->cartan, i, j);
|
||||||
|
|
||||||
|
cairo_set_source_rgb(C, 1.0, 0, 0);
|
||||||
|
// drawCurvedBox(ctx, 'A', "");
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
fixedPoints(ctx, "b abc b", p[3]);
|
||||||
|
|
||||||
|
fixedPoints(ctx, "ab abc ba", p[4]);
|
||||||
|
fixedPoints(ctx, "ab a cab a ba", p[5]);
|
||||||
|
fixedPoints(ctx, "ab ca cab ac ba", p[6]);
|
||||||
|
|
||||||
|
fixedPoints(ctx, "abab abc baba", p[7]);
|
||||||
|
fixedPoints(ctx, "abab a cab a baba", p[8]);
|
||||||
|
fixedPoints(ctx, "abab ca cab ac baba", p[9]);
|
||||||
|
|
||||||
|
fixedPoints(ctx, "ababab abc bababa", p[10]);
|
||||||
|
fixedPoints(ctx, "ababab a cab a bababa", p[11]);
|
||||||
|
fixedPoints(ctx, "ababab ca cab ac bababa", p[12]);
|
||||||
|
|
||||||
|
fixedPoints(ctx, "abababab abc babababa", p[13]);
|
||||||
|
fixedPoints(ctx, "abababab a cab a babababa", p[14]);
|
||||||
|
fixedPoints(ctx, "abababab ca cab ac babababa", p[15]);
|
||||||
|
|
||||||
|
fixedPoints(ctx, "ababababab abc bababababa", p[16]);
|
||||||
|
fixedPoints(ctx, "ababababab a cab a bababababa", p[17]);
|
||||||
|
fixedPoints(ctx, "ababababab ca cab ac bababababa", p[18]);
|
||||||
|
|
||||||
|
fixedPoints(ctx, "abababababab abc babababababa", p[19]);
|
||||||
|
fixedPoints(ctx, "abababababab a cab a babababababa", p[20]);
|
||||||
|
fixedPoints(ctx, "abababababab ca cab ac babababababa", p[21]);
|
||||||
|
|
||||||
cairo_set_source_rgb(C, 0.5, 0.5, 0.5);
|
cairo_set_source_rgb(C, 0.5, 0.5, 0.5);
|
||||||
|
|
||||||
drawCurvedBox(ctx);
|
drawArc(ctx, "ab", p[0][0], VT_POINT, cross(p[1][0], p[1][1]), VT_LINE, p[3][0], 1);
|
||||||
|
drawArc(ctx, "ab", p[1][0], VT_POINT, cross(p[0][0], p[0][1]), VT_LINE, p[4][0], 1);
|
||||||
|
|
||||||
|
drawCovector(ctx, l[0][0]);
|
||||||
|
drawCovector(ctx, l[1][0]);
|
||||||
|
|
||||||
|
cairo_set_source_rgb(C, 1.0, 0, 0);
|
||||||
|
|
||||||
|
drawArc(ctx, "abcaba", p[0][0], VT_POINT, cross(p[4][0],p[4][1]), VT_LINE, p[5][0], 1);
|
||||||
|
drawArc(ctx, "abcaba", p[4][0], VT_POINT, cross(p[0][0],p[0][1]), VT_LINE, p[6][0], 1);
|
||||||
|
|
||||||
|
drawArc(ctx, "ababcababa", p[4][0], VT_POINT, cross(p[7][0],p[7][1]), VT_LINE, p[8][0], 1);
|
||||||
|
drawArc(ctx, "ababcababa", p[7][0], VT_POINT, cross(p[4][0],p[4][1]), VT_LINE, p[9][0], 1);
|
||||||
|
|
||||||
|
drawArc(ctx, "abababcabababa", p[7 ][0], VT_POINT, cross(p[10][0],p[10][1]), VT_LINE, p[11][0], 1);
|
||||||
|
drawArc(ctx, "abababcabababa", p[10][0], VT_POINT, cross(p[7 ][0],p[7 ][1]), VT_LINE, p[12][0], 1);
|
||||||
|
|
||||||
|
drawArc(ctx, "ababababcababababa", p[10][0], VT_POINT, cross(p[13][0],p[13][1]), VT_LINE, p[14][0], 1);
|
||||||
|
drawArc(ctx, "ababababcababababa", p[13][0], VT_POINT, cross(p[10][0],p[10][1]), VT_LINE, p[15][0], 1);
|
||||||
|
|
||||||
|
drawArc(ctx, "abababababcabababababa", p[13][0], VT_POINT, cross(p[16][0],p[16][1]), VT_LINE, p[17][0], 1);
|
||||||
|
drawArc(ctx, "abababababcabababababa", p[16][0], VT_POINT, cross(p[13][0],p[13][1]), VT_LINE, p[18][0], 1);
|
||||||
|
|
||||||
|
drawArc(ctx, "ababababababcababababababa", p[16][0], VT_POINT, cross(p[19][0],p[19][1]), VT_LINE, p[20][0], 1);
|
||||||
|
drawArc(ctx, "ababababababcababababababa", p[19][0], VT_POINT, cross(p[16][0],p[16][1]), VT_LINE, p[21][0], 1);
|
||||||
|
|
||||||
|
// drawCovector(ctx, cross(p[4][0],p[4][1]));
|
||||||
|
// drawCovector(ctx, cross(p[7][0],p[7][1]));
|
||||||
|
// drawCovector(ctx, cross(p[10][0],p[10][1]));
|
||||||
|
// drawCovector(ctx, cross(p[13][0],p[13][1]));
|
||||||
|
// drawCovector(ctx, cross(p[16][0],p[16][1]));
|
||||||
|
// drawCovector(ctx, cross(p[19][0],p[19][1]));
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
cairo_set_source_rgb(C, 0, 0, 1.0);
|
||||||
|
cairo_set_line_width(C, 1.5/ctx->dim->scalefactor);
|
||||||
|
drawCurvedBox(ctx, 'C', "ab");
|
||||||
|
drawCurvedBox(ctx, 'C', "abab");
|
||||||
|
drawCurvedBox(ctx, 'C', "ababab");
|
||||||
|
drawCurvedBox(ctx, 'C', "abababab");
|
||||||
|
// drawCurvedBox(ctx, 'C', "babababa");
|
||||||
|
// drawCurvedBox(ctx, 'C', "bababa");
|
||||||
|
|
||||||
|
cairo_set_source_rgb(C, 1.0, 0, 0);
|
||||||
|
// drawCurvedBox(ctx, 'C', "b");
|
||||||
|
// drawCurvedBox(ctx, 'C', "bab");
|
||||||
|
// drawCurvedBox(ctx, 'C', "babab");
|
||||||
|
// drawCurvedBox(ctx, 'C', "bababab");
|
||||||
|
// drawCurvedBox(ctx, 'C', "ba");
|
||||||
|
// drawCurvedBox(ctx, 'C', "");
|
||||||
|
|
||||||
|
/*
|
||||||
|
cairo_set_source_rgb(C, 1.0, 0, 0);
|
||||||
|
fixedPoints(ctx, "ababa abc ababa", p[3]);
|
||||||
|
drawCovector(ctx, cross(p[3][0],p[3][1]));
|
||||||
|
fixedPoints(ctx, "abababa abc abababa", p[3]);
|
||||||
|
drawCovector(ctx, cross(p[3][0],p[3][1]));
|
||||||
|
fixedPoints(ctx, "ababababa abc ababababa", p[3]);
|
||||||
|
drawCovector(ctx, cross(p[3][0],p[3][1]));
|
||||||
|
fixedPoints(ctx, "bababab abc bababab", p[3]);
|
||||||
|
drawCovector(ctx, cross(p[3][0],p[3][1]));
|
||||||
|
fixedPoints(ctx, "babab abc babab", p[3]);
|
||||||
|
drawCovector(ctx, cross(p[3][0],p[3][1]));
|
||||||
|
fixedPoints(ctx, "bab abc bab", p[3]);
|
||||||
|
drawCovector(ctx, cross(p[3][0],p[3][1]));
|
||||||
|
fixedPoints(ctx, "b abc b", p[3]);
|
||||||
|
drawCovector(ctx, cross(p[3][0],p[3][1]));
|
||||||
|
fixedPoints(ctx, "a abc a", p[3]);
|
||||||
|
drawCovector(ctx, cross(p[3][0],p[3][1]));
|
||||||
|
fixedPoints(ctx, "aba abc aba", p[3]);
|
||||||
|
drawCovector(ctx, cross(p[3][0],p[3][1]));
|
||||||
|
*/
|
||||||
|
|
||||||
|
// drawCovector(ctx, cross(p[7][0],p[7][1]));
|
||||||
|
// drawCovector(ctx, cross(p[10][0],p[10][1]));
|
||||||
|
// drawCovector(ctx, cross(p[13][0],p[13][1]));
|
||||||
|
// drawCovector(ctx, cross(p[16][0],p[16][1]));
|
||||||
|
// drawCovector(ctx, cross(p[19][0],p[19][1]));
|
||||||
|
|
||||||
|
cairo_set_line_width(C, 2.0/ctx->dim->scalefactor);
|
||||||
|
cairo_set_source_rgb(C, 0, 0, 0);
|
||||||
|
drawCurvedBox(ctx, 'A', "");
|
||||||
|
// drawRotationOrbit(ctx, "ab", p[1][0]);
|
||||||
|
|
||||||
|
cairo_set_source_rgb(C, 1.0, 0, 0);
|
||||||
|
// drawCurvedBox(ctx, 'B', "abca");
|
||||||
|
// drawCurvedBox(ctx, 'A', "abcabc");
|
||||||
|
// drawRotationOrbit(ctx, "ab", p[1][0]);
|
||||||
|
// drawCurvedBox(ctx, 'C', "");
|
||||||
|
|
||||||
|
// drawCurvedBox(ctx, 'C', "b");
|
||||||
|
// drawCurvedBox(ctx, 'C', "bab");
|
||||||
|
// drawCurvedBox(ctx, 'C', "babab");
|
||||||
|
// drawCurvedBox(ctx, 'C', "bababab");
|
||||||
|
|
||||||
|
// drawCurvedBox(ctx, 'C', "ababababab");
|
||||||
|
// drawCurvedBox(ctx, 'C', "abababababab");
|
||||||
|
// drawCurvedBox(ctx, 'C', "ababababababab");
|
||||||
|
// drawCurvedBox(ctx, 'C', "abababababababab");
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
drawRotationOrbit(ctx, "ca", p[0][0]);
|
drawRotationOrbit(ctx, "ca", p[0][0]);
|
||||||
@ -590,6 +750,7 @@ void drawBoxes(DrawingContext *ctx)
|
|||||||
alpha[3] = apply_transpose(gen[1], alpha[0]);
|
alpha[3] = apply_transpose(gen[1], alpha[0]);
|
||||||
drawCovector(ctx, alpha[3]);
|
drawCovector(ctx, alpha[3]);
|
||||||
*/
|
*/
|
||||||
|
cairo_restore(C);
|
||||||
releaseTempMatrices(ctx->ws, 4);
|
releaseTempMatrices(ctx->ws, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -795,7 +956,7 @@ void drawLimitCurve(DrawingContext *ctx)
|
|||||||
|
|
||||||
cairo_save(C);
|
cairo_save(C);
|
||||||
|
|
||||||
cairo_set_source_rgb(C, 0, 0, 0);
|
cairo_set_source_rgb(C, 0.5, 0.5, 0.5);
|
||||||
|
|
||||||
if(ctx->limit_with_lines) {
|
if(ctx->limit_with_lines) {
|
||||||
int previous_inside = 0;
|
int previous_inside = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user