measure asymmetric distance
This commit is contained in:
parent
35932782e9
commit
ca8799702d
463
draw.c
463
draw.c
@ -22,6 +22,13 @@ vector_t cross(vector_t a, vector_t b)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double scal(vector_t a, vector_t b)
|
||||||
|
{
|
||||||
|
double result = 0.0;
|
||||||
|
LOOP(i) result += a.x[i]*b.x[i];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
vector_t apply(gsl_matrix *m, vector_t x)
|
vector_t apply(gsl_matrix *m, vector_t x)
|
||||||
{
|
{
|
||||||
vector_t out;
|
vector_t out;
|
||||||
@ -42,6 +49,21 @@ vector_t apply_transpose(gsl_matrix *m, vector_t x)
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector_t apply_inverse(gsl_matrix *m, vector_t in)
|
||||||
|
{
|
||||||
|
vector_t out;
|
||||||
|
double cofactor;
|
||||||
|
|
||||||
|
LOOP(i) out.x[i] = 0.0;
|
||||||
|
LOOP(i) LOOP(j) {
|
||||||
|
cofactor = gsl_matrix_get(m, (i+1)%3, (j+1)%3) * gsl_matrix_get(m, (i+2)%3, (j+2)%3)
|
||||||
|
- gsl_matrix_get(m, (i+1)%3, (j+2)%3) * gsl_matrix_get(m, (i+2)%3, (j+1)%3);
|
||||||
|
out.x[i] += cofactor * in.x[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
int fixedPoints(DrawingContext *ctx, const char *word, vector_t *out)
|
int fixedPoints(DrawingContext *ctx, const char *word, vector_t *out)
|
||||||
{
|
{
|
||||||
gsl_matrix *tmp = getTempMatrix(ctx->ws);
|
gsl_matrix *tmp = getTempMatrix(ctx->ws);
|
||||||
@ -886,10 +908,31 @@ void drawBoxes(DrawingContext *ctx)
|
|||||||
releaseTempMatrices(ctx->ws, 5);
|
releaseTempMatrices(ctx->ws, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getMinMaxHalfCrossRatio(double *limit_curve, int n, vector_t v1, vector_t v2, int max, int *min_index, double* min_cr)
|
||||||
|
{
|
||||||
|
vector_t fp[3];
|
||||||
|
vector_t tangent;
|
||||||
|
double cr;
|
||||||
|
*min_cr = max ? 0 : INFINITY;
|
||||||
|
for(int i = 0; i < n; i++) {
|
||||||
|
LOOP(j) LOOP(k) fp[j].x[k] = limit_curve[12*i+3+3*j+k];
|
||||||
|
tangent = cross(fp[0],fp[1]);
|
||||||
|
|
||||||
|
cr = fabs(scal(v1, tangent) / scal(v2, tangent));
|
||||||
|
if(!max && cr < *min_cr || max && cr > *min_cr) {
|
||||||
|
*min_cr = cr;
|
||||||
|
*min_index = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void drawBoxes2(DrawingContext *ctx)
|
void drawBoxes2(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);
|
||||||
|
gsl_vector *marking_globalbasis = getTempVector(ctx->ws);
|
||||||
|
gsl_vector *marking_drawbasis = getTempVector(ctx->ws);
|
||||||
cairo_t *C = ctx->cairo;
|
cairo_t *C = ctx->cairo;
|
||||||
cairo_save(C);
|
cairo_save(C);
|
||||||
initializeTriangleGenerators(gen, ctx->cartan);
|
initializeTriangleGenerators(gen, ctx->cartan);
|
||||||
@ -900,369 +943,95 @@ void drawBoxes2(DrawingContext *ctx)
|
|||||||
fixedPoints(ctx, "bca", p[1]);
|
fixedPoints(ctx, "bca", p[1]);
|
||||||
fixedPoints(ctx, "cab", p[2]);
|
fixedPoints(ctx, "cab", p[2]);
|
||||||
|
|
||||||
cairo_set_line_width(C, 2.5/ctx->dim->scalefactor);
|
cairo_set_line_width(C, 1/ctx->dim->scalefactor);
|
||||||
|
|
||||||
/*
|
|
||||||
cairo_set_source_rgb(C, 0, 1, 1);
|
|
||||||
fixedPoints(ctx, "abc", p[0]);
|
|
||||||
drawRotationOrbit(ctx, "bc", p[0][0]); // (r^{-1}a)^2 C / cbr
|
|
||||||
fixedPoints(ctx, "bca", p[0]);
|
|
||||||
drawRotationOrbit(ctx, "abca", p[0][0]); // (r^{-1}a)^2 C / cbr
|
|
||||||
|
|
||||||
cairo_set_source_rgb(C, 1, 1, 0);
|
|
||||||
fixedPoints(ctx, "abc", p[0]);
|
|
||||||
drawRotationOrbit(ctx, "cbcabc", p[0][0]); // (r^{-1}a)^4 C / cbac r-
|
|
||||||
fixedPoints(ctx, "bca", p[0]);
|
|
||||||
drawRotationOrbit(ctx, "acbcabca", p[0][0]); // (r^{-1}a)^4 C / cbac r-
|
|
||||||
|
|
||||||
cairo_set_source_rgb(C, 1, 0, 1);
|
|
||||||
fixedPoints(ctx, "abc", p[0]);
|
|
||||||
drawRotationOrbit(ctx, "cbacabcabc", p[0][0]); // (r^{-1}a)^6 C / cbacba
|
|
||||||
fixedPoints(ctx, "bca", p[0]);
|
|
||||||
drawRotationOrbit(ctx, "acbacabcabca", p[0][0]); // (r^{-1}a)^6 C / cbacba
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
cairo_set_source_rgb(C, 1, 0, 0);
|
|
||||||
fixedPoints(ctx, "bca", p[3]);
|
|
||||||
drawRotationOrbit(ctx, "bcabcb", p[3][0]); // cb c a bc
|
|
||||||
fixedPoints(ctx, "abc", p[3]);
|
|
||||||
drawRotationOrbit(ctx, "abcabcba", p[3][0]); // cb c a bc
|
|
||||||
|
|
||||||
cairo_set_source_rgb(C, 0, 1, 0);
|
|
||||||
fixedPoints(ctx, "ababcba", p[3]);
|
|
||||||
drawRotationOrbit(ctx, "ababcababa", p[3][0]); // cb c a bc
|
|
||||||
fixedPoints(ctx, "abc", p[3]);
|
|
||||||
drawRotationOrbit(ctx, "abcabcabacba", p[3][0]); // cb c a bc
|
|
||||||
*/
|
|
||||||
|
|
||||||
// drawRotationOrbit(ctx, "bc", p[3][0]);
|
|
||||||
|
|
||||||
cairo_set_source_rgb(C, 0, 0, 0);
|
cairo_set_source_rgb(C, 0, 0, 0);
|
||||||
drawCurvedBox(ctx, 'A', "", 2);
|
|
||||||
|
|
||||||
cairo_set_source_rgb(C, 0, 0, 1);
|
vector_t att_line[3];
|
||||||
// drawCurvedBox(ctx, 'C', "ab", 2);
|
vector_t rep_line[3];
|
||||||
|
|
||||||
// drawCurvedBox(ctx, 'C', "ab", 2);
|
LOOP(i) att_line[i] = cross(p[i][0], p[i][1]);
|
||||||
// drawCurvedBox(ctx, 'B', "bca", 2);
|
LOOP(i) rep_line[i] = cross(p[i][2], p[i][1]);
|
||||||
// drawCurvedBox(ctx, 'B', "ba", 2);
|
|
||||||
// drawCurvedBox(ctx, 'B', "bca", 2);
|
|
||||||
// drawCurvedBox(ctx, 'B', "abca", 2);
|
|
||||||
// drawCurvedBox(ctx, 'C', "abab", 2);
|
|
||||||
// drawCurvedBox(ctx, 'C', "ababab", 2);
|
|
||||||
|
|
||||||
if(ctx->mode >= 3 && ctx->mode != 4) {
|
vector_t vertex[3];
|
||||||
cairo_set_source_rgb(C, 0, 0, 0);
|
LOOP(i) vertex[i] = cross(
|
||||||
drawCurvedBox(ctx, 'B', "", 2);
|
cross(p[(i+1)%3][0],p[(i+1)%3][2]),
|
||||||
drawCurvedBox(ctx, 'C', "", 2);
|
cross(p[(i+2)%3][0],p[(i+2)%3][2]));
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->mode == 4 || ctx->mode == 5) {
|
LOOP(i) drawVector(ctx, vertex[i]);
|
||||||
cairo_set_source_rgb(C, 0, 0.8, 0.5);
|
// LOOP(i) drawCovector(ctx, att_line[i]);
|
||||||
drawCurvedBox(ctx, 'A', "", 2);
|
|
||||||
drawCurvedBox(ctx, 'A', "bc", 2);
|
|
||||||
drawCurvedBox(ctx, 'A', "bcbc", 2);
|
|
||||||
drawCurvedBox(ctx, 'A', "bcbcbc", 2);
|
|
||||||
drawCurvedBox(ctx, 'A', "bcbcbcbc", 2);
|
|
||||||
drawCurvedBox(ctx, 'A', "bcbcbcbcbc", 2);
|
|
||||||
drawCurvedBox(ctx, 'A', "bcbcbcbcbcbc", 2);
|
|
||||||
// drawCurvedBox(ctx, 'A', "b", 2);
|
|
||||||
// drawCurvedBox(ctx, 'A', "bcb", 2);
|
|
||||||
// drawCurvedBox(ctx, 'A', "bcbcb", 2);
|
|
||||||
// drawCurvedBox(ctx, 'A', "bcbcbcb", 2);
|
|
||||||
// drawCurvedBox(ctx, 'A', "bcbcbcbcb", 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->mode == 6) {
|
double half_cross_ratio[3];
|
||||||
cairo_set_source_rgb(C, 0, 0.8, 0.5);
|
LOOP(i) half_cross_ratio[i] = scal(vertex[(i+1)%3],att_line[i])/scal(vertex[(i+2)%3],att_line[i]);
|
||||||
drawCurvedBox(ctx, 'C', "abababab", 2);
|
double triple_ratio = half_cross_ratio[0]*half_cross_ratio[1]*half_cross_ratio[2];
|
||||||
drawCurvedBox(ctx, 'C', "ababababab", 2);
|
LOOP(i) half_cross_ratio[i] = scal(vertex[(i+1)%3],rep_line[i])/scal(vertex[(i+2)%3],rep_line[i]);
|
||||||
}
|
double triple_ratio2 = half_cross_ratio[0]*half_cross_ratio[1]*half_cross_ratio[2];
|
||||||
|
|
||||||
if(ctx->mode >= 6) {
|
|
||||||
cairo_set_source_rgb(C, 0, 0.8, 0.5);
|
|
||||||
drawCurvedBox(ctx, 'C', "ab", 2);
|
|
||||||
drawCurvedBox(ctx, 'C', "abab", 2);
|
|
||||||
drawCurvedBox(ctx, 'C', "ababab", 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->mode >= 8) {
|
|
||||||
cairo_set_source_rgb(C, 0, 0.8, 0.5);
|
|
||||||
drawCurvedBox(ctx, 'C', "b", 2);
|
|
||||||
drawCurvedBox(ctx, 'C', "bab", 2);
|
|
||||||
drawCurvedBox(ctx, 'C', "babab", 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->mode >= 9) {
|
|
||||||
cairo_set_source_rgb(C, 0.8, 0, 0.5);
|
|
||||||
drawCurvedBox(ctx, 'B', "abca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "abcaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "abcacaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "aba", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "abaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "abacaca", 2);
|
|
||||||
|
|
||||||
drawCurvedBox(ctx, 'B', "ababca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "ababcaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "ababcacaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "ababa", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "ababaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "ababacaca", 2);
|
|
||||||
|
|
||||||
drawCurvedBox(ctx, 'B', "abababca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "abababcaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "abababcacaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "abababa", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "abababaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "abababacaca", 2);
|
|
||||||
|
|
||||||
drawCurvedBox(ctx, 'B', "bca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "bcaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "bcacaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "ba", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "baca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "bacaca", 2);
|
|
||||||
|
|
||||||
drawCurvedBox(ctx, 'B', "babca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "babcaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "babcacaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "baba", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "babaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "babacaca", 2);
|
|
||||||
|
|
||||||
drawCurvedBox(ctx, 'B', "bababca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "bababcaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "bababcacaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "bababa", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "bababaca", 2);
|
|
||||||
drawCurvedBox(ctx, 'B', "bababacaca", 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// drawCurvedBox(ctx, 'B', "abab", 2);
|
|
||||||
// drawCurvedBox(ctx, 'B', "ababab", 2);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// drawCurvedBox(ctx, 'C', "b", 1);
|
vector_t marking, marking2, marking3;
|
||||||
|
gsl_vector_set(marking_drawbasis, 0, ctx->marking.x);
|
||||||
|
gsl_vector_set(marking_drawbasis, 1, ctx->marking.y);
|
||||||
|
gsl_vector_set(marking_drawbasis, 2, 1);
|
||||||
|
solve(ctx->cob, marking_drawbasis, marking_globalbasis, ctx->ws);
|
||||||
|
LOOP(i) marking.x[i] = gsl_vector_get(marking_globalbasis, i);
|
||||||
|
|
||||||
// drawCurvedBox(ctx, 'C', "ababab");
|
gsl_vector_set(marking_drawbasis, 0, ctx->marking2.x);
|
||||||
// drawCurvedBox(ctx, 'C', "abababab");
|
gsl_vector_set(marking_drawbasis, 1, ctx->marking2.y);
|
||||||
// drawCurvedBox(ctx, 'C', "b");
|
gsl_vector_set(marking_drawbasis, 2, 1);
|
||||||
// drawCurvedBox(ctx, 'C', "bab");
|
solve(ctx->cob, marking_drawbasis, marking_globalbasis, ctx->ws);
|
||||||
// drawCurvedBox(ctx, 'C', "babab");
|
LOOP(i) marking2.x[i] = gsl_vector_get(marking_globalbasis, i);
|
||||||
|
|
||||||
// drawCurvedBox(ctx, 'C', "abababab");
|
gsl_vector_set(marking_drawbasis, 0, ctx->marking3.x);
|
||||||
// drawCurvedBox(ctx, 'C', "ababababab");
|
gsl_vector_set(marking_drawbasis, 1, ctx->marking3.y);
|
||||||
// drawCurvedBox(ctx, 'C', "abababababab");
|
gsl_vector_set(marking_drawbasis, 2, 1);
|
||||||
|
solve(ctx->cob, marking_drawbasis, marking_globalbasis, ctx->ws);
|
||||||
|
LOOP(i) marking3.x[i] = gsl_vector_get(marking_globalbasis, i);
|
||||||
cairo_set_source_rgb(C, 0, 0, 1);
|
|
||||||
// drawCurvedBox(ctx, 'B', "abca", 1);
|
|
||||||
// drawCurvedBox(ctx, 'B', "aba", 1);
|
|
||||||
// drawCurvedBox(ctx, 'B', "bca", 1);
|
|
||||||
// drawCurvedBox(ctx, 'B', "ba", 1);
|
|
||||||
// drawCurvedBox(ctx, 'B', "abaca");
|
|
||||||
// drawCurvedBox(ctx, 'B', "abcaca");
|
|
||||||
// drawCurvedBox(ctx, 'B', "abaca");
|
|
||||||
// drawCurvedBox(ctx, 'B', "aba");
|
|
||||||
// drawCurvedBox(ctx, 'B', "ababca");
|
|
||||||
// drawCurvedBox(ctx, 'B', "ababa");
|
|
||||||
// drawCurvedBox(ctx, 'B', "abababca");
|
|
||||||
// drawCurvedBox(ctx, 'B', "abababa");
|
|
||||||
// drawCurvedBox(ctx, 'B', "bca");
|
|
||||||
// drawCurvedBox(ctx, 'B', "ba");
|
|
||||||
// drawCurvedBox(ctx, 'B', "babca");
|
|
||||||
// drawCurvedBox(ctx, 'B', "baba");
|
|
||||||
// drawCurvedBox(ctx, 'B', "bababca");
|
|
||||||
// drawCurvedBox(ctx, 'B', "bababa");
|
|
||||||
|
|
||||||
cairo_set_source_rgb(C, 1, 0, 1);
|
|
||||||
// drawCurvedBox(ctx, 'A', "abcac");
|
|
||||||
// drawCurvedBox(ctx, 'A', "bcac");
|
|
||||||
// drawCurvedBox(ctx, 'A', "abcacbc");
|
|
||||||
// drawCurvedBox(ctx, 'A', "abcac");
|
|
||||||
// drawCurvedBox(ctx, 'A', "abcacbc");
|
|
||||||
|
|
||||||
// drawCurvedBox(ctx, 'A', "ababc");
|
|
||||||
// drawCurvedBox(ctx, 'A', "ababcbc");
|
|
||||||
/* drawCurvedBox(ctx, 'A', "abcac");
|
|
||||||
drawCurvedBox(ctx, 'A', "ababc");
|
|
||||||
drawCurvedBox(ctx, 'A', "abac");
|
|
||||||
|
|
||||||
drawCurvedBox(ctx, 'A', "ababcabc");
|
|
||||||
drawCurvedBox(ctx, 'A', "ababcac");
|
|
||||||
drawCurvedBox(ctx, 'A', "abababc");
|
|
||||||
drawCurvedBox(ctx, 'A', "ababac");
|
|
||||||
|
|
||||||
drawCurvedBox(ctx, 'A', "abababcabc");
|
|
||||||
drawCurvedBox(ctx, 'A', "abababcac");
|
|
||||||
drawCurvedBox(ctx, 'A', "ababababc");
|
|
||||||
drawCurvedBox(ctx, 'A', "abababac");
|
|
||||||
|
|
||||||
drawCurvedBox(ctx, 'A', "bcabc");
|
|
||||||
drawCurvedBox(ctx, 'A', "bcac");
|
|
||||||
drawCurvedBox(ctx, 'A', "babc");
|
|
||||||
drawCurvedBox(ctx, 'A', "bac");
|
|
||||||
|
|
||||||
drawCurvedBox(ctx, 'A', "babcabc");
|
|
||||||
drawCurvedBox(ctx, 'A', "babcac");
|
|
||||||
drawCurvedBox(ctx, 'A', "bababc");
|
|
||||||
drawCurvedBox(ctx, 'A', "babac");
|
|
||||||
|
|
||||||
drawCurvedBox(ctx, 'A', "bababcabc");
|
|
||||||
drawCurvedBox(ctx, 'A', "bababcac");
|
|
||||||
drawCurvedBox(ctx, 'A', "babababc");
|
|
||||||
drawCurvedBox(ctx, 'A', "bababac");
|
|
||||||
*/
|
|
||||||
|
|
||||||
// drawCurvedBox(ctx, 'A', "ababc");
|
|
||||||
|
|
||||||
cairo_set_source_rgb(C, 1, 0.5, 0);
|
|
||||||
// drawCurvedBox(ctx, 'C', "abcabcab");
|
|
||||||
|
|
||||||
|
|
||||||
// drawCurvedBox(ctx, 'B', "bca");
|
|
||||||
// drawCurvedBox(ctx, 'B', "abcacaca");
|
|
||||||
// drawCurvedBox(ctx, 'B', "abaca");
|
|
||||||
// drawCurvedBox(ctx, 'B', "aba");
|
|
||||||
// drawCurvedBox(ctx, 'B', "aba");
|
|
||||||
// drawCurvedBox(ctx, 'B', "abcaca");
|
|
||||||
// drawCurvedBox(ctx, 'B', "aba");
|
|
||||||
// drawCurvedBox(ctx, 'B', "abaca");
|
|
||||||
|
|
||||||
cairo_set_source_rgb(C, 0, 0, 1);
|
|
||||||
// drawCurvedBox(ctx, 'A', "abcabc");
|
|
||||||
// drawCurvedBox(ctx, 'A', "abcabcbc");
|
|
||||||
// drawCurvedBox(ctx, 'A', "abcacbc");
|
|
||||||
// drawCurvedBox(ctx, 'A', "abcac");
|
|
||||||
|
|
||||||
// drawCurvedBox(ctx, 'A', "bcabc");
|
|
||||||
// drawCurvedBox(ctx, 'A', "bcabcbc");
|
|
||||||
// drawCurvedBox(ctx, 'A', "bcacbc");
|
|
||||||
// drawCurvedBox(ctx, 'A', "bcac");
|
|
||||||
|
|
||||||
// drawCurvedBox(ctx, 'A', "abcac");
|
|
||||||
// drawCurvedBox(ctx, 'A', "abcac");
|
|
||||||
// drawCurvedBox(ctx, 'A', "abcacbc");
|
|
||||||
|
|
||||||
// drawCurvedBox(ctx, 'B', "abacaca");
|
|
||||||
// drawCurvedBox(ctx, 'B', "abacacaca");
|
|
||||||
|
|
||||||
|
|
||||||
cairo_set_source_rgb(C, 0, 1, 1);
|
|
||||||
fixedPoints(ctx, "ababcba", p[0]);
|
|
||||||
// drawRotationOrbit(ctx, "abcaba", p[0][0]);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
int p = 9;
|
vector_t line_drawbasis = apply_inverse(ctx->cob, cross(marking, vertex[0]));
|
||||||
|
double last, current;
|
||||||
vector_t fp[3][3],neutral_line[3],reflection_line[p],star[2*p],outer[2];
|
int boundary_points[2] = {0,0};
|
||||||
vector_t rotation_line = {0,0,1};
|
int current_boundary_point = 0;
|
||||||
|
last =
|
||||||
cairo_set_line_width(C, 1.5/ctx->dim->scalefactor);
|
ctx->limit_curve[12*(ctx->n_group_elements-1) ]*line_drawbasis.x[0] +
|
||||||
cairo_set_source_rgb(C, 1, 0, 0);
|
ctx->limit_curve[12*(ctx->n_group_elements-1)+1]*line_drawbasis.x[1] +
|
||||||
|
line_drawbasis.x[2];
|
||||||
multiply(gen[0], gen[1], rot);
|
|
||||||
|
|
||||||
fixedPoints(ctx, "abc", fp[0]);
|
|
||||||
fixedPoints(ctx, "bca", fp[1]);
|
|
||||||
fixedPoints(ctx, "cab", fp[2]);
|
|
||||||
|
|
||||||
LOOP(i) neutral_line[i] = cross(fp[i][0], fp[i][2]);
|
|
||||||
LOOP(j) reflection_line[0].x[j] = gsl_matrix_get(ctx->cartan, 0, j);
|
|
||||||
star[0] = cross(neutral_line[0],reflection_line[0]);
|
|
||||||
star[p] = cross(neutral_line[2],reflection_line[0]);
|
|
||||||
|
|
||||||
for(int j = 1; j < p; j++) {
|
|
||||||
reflection_line[j] = apply_transpose(rot, reflection_line[j-1]);
|
|
||||||
star[j] = apply(rot, star[j-1]);
|
|
||||||
star[j+p] = apply(rot, star[j+p-1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
outer[0] = cross(neutral_line[0],reflection_line[5]);
|
|
||||||
outer[1] = cross(neutral_line[2],reflection_line[5]);
|
|
||||||
|
|
||||||
for(int j = 0; j < 8; j++) {
|
|
||||||
drawVector(ctx, star[j]);
|
|
||||||
drawVector(ctx, star[p+j]);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int j = 0; j < 7; j++) {
|
|
||||||
// if(j == 3)
|
|
||||||
// continue;
|
|
||||||
drawSegment(ctx, star[j%p], star[(j+1)%p+p]);
|
|
||||||
drawSegment(ctx, star[(j+1)%p+p], star[(j+1)%p]);
|
|
||||||
drawSegment(ctx, star[(j+1)%p], star[j%p+p]);
|
|
||||||
drawSegment(ctx, star[j%p+p], star[j%p]);
|
|
||||||
}
|
|
||||||
|
|
||||||
cairo_set_source_rgb(C, 0, 0, 1);
|
|
||||||
drawVector(ctx,outer[0]);
|
|
||||||
drawVector(ctx,outer[1]);
|
|
||||||
|
|
||||||
// drawCovector(ctx, neutral_line[0]);
|
|
||||||
// drawCovector(ctx, neutral_line[2]);
|
|
||||||
|
|
||||||
drawSegment(ctx, star[0], star[p]);
|
|
||||||
drawSegment(ctx, star[p], outer[1]);
|
|
||||||
drawSegment(ctx, outer[1], outer[0]);
|
|
||||||
drawSegment(ctx, outer[0], star[0]);
|
|
||||||
|
|
||||||
cairo_set_source_rgb(C, 0, 0, 0);
|
|
||||||
drawCovector(ctx, rotation_line);
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// for(int j = 0; j < 5; j++)
|
|
||||||
// drawCovector(ctx, reflection_line[j]);
|
|
||||||
|
|
||||||
// intersect attracting line with neutral line of the other element
|
double value[6];
|
||||||
// for(int j = 0; j < 2; j++)
|
int boundary_point[6];
|
||||||
// i[j] = cross(cross(p[j%2][0],p[j%2][1]),cross(p[(j+1)%2][0],p[(j+1)%2][2]));
|
getMinMaxHalfCrossRatio(ctx->limit_curve, ctx->n_group_elements,
|
||||||
|
marking, marking2, 1, &boundary_point[0], &value[0]);
|
||||||
|
getMinMaxHalfCrossRatio(ctx->limit_curve, ctx->n_group_elements,
|
||||||
|
marking2, marking3, 1, &boundary_point[1], &value[1]);
|
||||||
|
getMinMaxHalfCrossRatio(ctx->limit_curve, ctx->n_group_elements,
|
||||||
|
marking3, marking, 1, &boundary_point[2], &value[2]);
|
||||||
|
getMinMaxHalfCrossRatio(ctx->limit_curve, ctx->n_group_elements,
|
||||||
|
marking, marking2, 0, &boundary_point[0], &value[3]);
|
||||||
|
getMinMaxHalfCrossRatio(ctx->limit_curve, ctx->n_group_elements,
|
||||||
|
marking2, marking3, 0, &boundary_point[1], &value[4]);
|
||||||
|
getMinMaxHalfCrossRatio(ctx->limit_curve, ctx->n_group_elements,
|
||||||
|
marking3, marking, 0, &boundary_point[2], &value[5]);
|
||||||
|
|
||||||
// drawPolygon(ctx, 1, 4, p[0][0], i[0], p[1][0], i[1]);
|
/* vector_t fp[3], tangent;
|
||||||
|
LOOP(j) LOOP(k) fp[j].x[k] = ctx->limit_curve[12*boundary_point[0]+3+3*j+k];
|
||||||
|
tangent = cross(fp[0],fp[1]);
|
||||||
|
drawCovector(ctx, tangent);*/
|
||||||
|
|
||||||
// abc, ababcba, abababcbaba, ..., cab
|
snprintf(ctx->extra_text, 1000, "tr1 = %f, tr2 2 = %f, aa = %f",
|
||||||
// bca, acaba, abacababa, ..., babcb
|
log(value[0])+log(value[1])+log(value[2]),
|
||||||
/*
|
-log(value[3])-log(value[4])-log(value[5]),
|
||||||
vector_t v[4][3];
|
log(value[0])+log(value[1])+log(value[2])+log(value[3])+log(value[4])+log(value[5]));
|
||||||
vector_t i[4];
|
|
||||||
|
|
||||||
fixedPoints(ctx, "abc", v[0]);
|
drawCovector(ctx, cross(marking, marking2));
|
||||||
fixedPoints(ctx, "bca", v[1]);
|
drawCovector(ctx, cross(marking2, marking3));
|
||||||
fixedPoints(ctx, "cab", v[2]);
|
drawCovector(ctx, cross(marking3, marking));
|
||||||
fixedPoints(ctx, "acaba", v[3]);
|
|
||||||
i[0] = cross(cross(v[0][1],v[0][2]),cross(v[2][0],v[2][2]));
|
|
||||||
i[1] = cross(cross(v[1][1],v[1][2]),cross(v[3][0],v[3][2]));
|
|
||||||
i[2] = cross(cross(v[2][0],v[2][2]),cross(v[3][0],v[3][2]));
|
|
||||||
i[3] = cross(cross(v[0][0],v[0][2]),cross(v[1][0],v[1][2]));
|
|
||||||
|
|
||||||
// cairo_set_source_rgb(C, 0, 0, 1);
|
|
||||||
// drawPolygon(ctx, 1, 6, v[2][2], v[1][1], v[0][1], v[3][2], v[3][1], v[2][1]);
|
|
||||||
// drawPolygon(ctx, 1, 6, v[1][2], i[1], i[2], i[0], v[0][2], i[3]);
|
|
||||||
|
|
||||||
cairo_set_line_width(C, 1.5/ctx->dim->scalefactor);
|
|
||||||
cairo_set_source_rgb(C, 1, 0, 0);
|
|
||||||
// drawBox(ctx, "bca", "abc");
|
|
||||||
|
|
||||||
drawCurvedBox(ctx, 'A', "");
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
cairo_set_source_rgb(C, 1, 0.5, 0);
|
|
||||||
drawBox(ctx, "ab abc ba", "ab cab ba");
|
|
||||||
drawBox(ctx, "abab abc baba", "abab cab baba");
|
|
||||||
drawBox(ctx, "ababab abc bababa", "ababab cab bababa");
|
|
||||||
drawBox(ctx, "abababab abc babababa", "abababab cab babababa");
|
|
||||||
// drawBox(ctx, "ababababab abc bababababa", "ababababab cab bababababa");
|
|
||||||
drawBox(ctx, "b abc b", "b cab b");
|
|
||||||
drawBox(ctx, "bab abc bab", "bab cab bab");
|
|
||||||
drawBox(ctx, "babab abc babab", "babab cab babab");
|
|
||||||
drawBox(ctx, "bababab abc bababab", "bababab cab bababab");
|
|
||||||
// drawBox(ctx, "babababab abc babababab", "babababab cab babababab");
|
|
||||||
*/
|
|
||||||
|
|
||||||
cairo_restore(C);
|
cairo_restore(C);
|
||||||
releaseTempMatrices(ctx->ws, 4);
|
releaseTempMatrices(ctx->ws, 4);
|
||||||
|
releaseTempVectors(ctx->ws, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawRotatedReflectors(DrawingContext *ctx)
|
void drawRotatedReflectors(DrawingContext *ctx)
|
||||||
@ -1400,8 +1169,8 @@ void drawLimitCurve(DrawingContext *ctx)
|
|||||||
|
|
||||||
for(int i = 0; i < ctx->limit_curve_count; i++) {
|
for(int i = 0; i < ctx->limit_curve_count; i++) {
|
||||||
point_t p;
|
point_t p;
|
||||||
p.x = ctx->limit_curve[3*i];
|
p.x = ctx->limit_curve[12*i];
|
||||||
p.y = ctx->limit_curve[3*i+1];
|
p.y = ctx->limit_curve[12*i+1];
|
||||||
|
|
||||||
if(isInsideBB(ctx, p)) {
|
if(isInsideBB(ctx, p)) {
|
||||||
if(!previous_inside)
|
if(!previous_inside)
|
||||||
@ -1418,8 +1187,8 @@ void drawLimitCurve(DrawingContext *ctx)
|
|||||||
} else {
|
} else {
|
||||||
for(int i = 0; i < ctx->limit_curve_count; i++) {
|
for(int i = 0; i < ctx->limit_curve_count; i++) {
|
||||||
point_t p;
|
point_t p;
|
||||||
p.x = ctx->limit_curve[3*i];
|
p.x = ctx->limit_curve[12*i];
|
||||||
p.y = ctx->limit_curve[3*i+1];
|
p.y = ctx->limit_curve[12*i+1];
|
||||||
|
|
||||||
if(isInsideBB(ctx, p)) {
|
if(isInsideBB(ctx, p)) {
|
||||||
cairo_arc(C, p.x, p.y, 2.0/ctx->dim->scalefactor, 0, 2*M_PI);
|
cairo_arc(C, p.x, p.y, 2.0/ctx->dim->scalefactor, 0, 2*M_PI);
|
||||||
@ -1525,8 +1294,8 @@ void drawText(DrawingContext *ctx)
|
|||||||
{
|
{
|
||||||
cairo_move_to(ctx->cairo, 15, 30);
|
cairo_move_to(ctx->cairo, 15, 30);
|
||||||
cairo_set_source_rgb(ctx->cairo, 0, 0, 0);
|
cairo_set_source_rgb(ctx->cairo, 0, 0, 0);
|
||||||
char buf[100];
|
char buf[1000];
|
||||||
sprintf(buf, "t = exp(%.8f) = %.8f, marking = (%.5f, %.5f)", log(ctx->parameter), ctx->parameter, ctx->marking.x, ctx->marking.y);
|
snprintf(buf, 1000, "t = exp(%.8f) = %.8f, %s", log(ctx->parameter), ctx->parameter, ctx->extra_text);
|
||||||
cairo_show_text(ctx->cairo, buf);
|
cairo_show_text(ctx->cairo, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1573,6 +1342,8 @@ void draw(DrawingContext *ctx)
|
|||||||
{
|
{
|
||||||
cairo_set_source_rgb(C, 0, 0, 1);
|
cairo_set_source_rgb(C, 0, 0, 1);
|
||||||
drawPoint(ctx, ctx->marking);
|
drawPoint(ctx, ctx->marking);
|
||||||
|
drawPoint(ctx, ctx->marking2);
|
||||||
|
drawPoint(ctx, ctx->marking3);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ctx->show_coxeter_orbit)
|
if(ctx->show_coxeter_orbit)
|
||||||
|
11
limit_set.c
11
limit_set.c
@ -63,7 +63,7 @@ int computeLimitCurve(DrawingContext *ctx)
|
|||||||
|
|
||||||
for(int i = 0; i < ctx->n_group_elements; i++) {
|
for(int i = 0; i < ctx->n_group_elements; i++) {
|
||||||
multiply_many(ws, fixedpoints_pos, 3, cob_pos, elements[i], coxeter_fixedpoints_pos);
|
multiply_many(ws, fixedpoints_pos, 3, cob_pos, elements[i], coxeter_fixedpoints_pos);
|
||||||
ctx->limit_curve[3*i+2] = atan2(
|
ctx->limit_curve[12*i+2] = atan2(
|
||||||
gsl_matrix_get(fixedpoints_pos, 2, column)/gsl_matrix_get(fixedpoints_pos, 0, column),
|
gsl_matrix_get(fixedpoints_pos, 2, column)/gsl_matrix_get(fixedpoints_pos, 0, column),
|
||||||
gsl_matrix_get(fixedpoints_pos, 1, column)/gsl_matrix_get(fixedpoints_pos, 0, column));
|
gsl_matrix_get(fixedpoints_pos, 1, column)/gsl_matrix_get(fixedpoints_pos, 0, column));
|
||||||
}
|
}
|
||||||
@ -85,8 +85,8 @@ int computeLimitCurve(DrawingContext *ctx)
|
|||||||
for(int i = 0; i < ctx->n_group_elements; i++) {
|
for(int i = 0; i < ctx->n_group_elements; i++) {
|
||||||
multiply_many(ws, fixedpoints, 3, ctx->cob, elements[i], coxeter_fixedpoints);
|
multiply_many(ws, fixedpoints, 3, ctx->cob, elements[i], coxeter_fixedpoints);
|
||||||
|
|
||||||
x = ctx->limit_curve[3*i ] = gsl_matrix_get(fixedpoints, 0, column)/gsl_matrix_get(fixedpoints, 2, column);
|
x = ctx->limit_curve[12*i ] = gsl_matrix_get(fixedpoints, 0, column)/gsl_matrix_get(fixedpoints, 2, column);
|
||||||
y = ctx->limit_curve[3*i+1] = gsl_matrix_get(fixedpoints, 1, column)/gsl_matrix_get(fixedpoints, 2, column);
|
y = ctx->limit_curve[12*i+1] = gsl_matrix_get(fixedpoints, 1, column)/gsl_matrix_get(fixedpoints, 2, column);
|
||||||
|
|
||||||
if((x - ctx->marking.x)*(x - ctx->marking.x) + (y - ctx->marking.y)*(y - ctx->marking.y) < 25e-10)
|
if((x - ctx->marking.x)*(x - ctx->marking.x) + (y - ctx->marking.y)*(y - ctx->marking.y) < 25e-10)
|
||||||
{
|
{
|
||||||
@ -96,11 +96,14 @@ int computeLimitCurve(DrawingContext *ctx)
|
|||||||
fputc('\n',stdout);
|
fputc('\n',stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
multiply_many(ws, fixedpoints, 2, elements[i], coxeter_fixedpoints);
|
||||||
|
LOOP(j) LOOP(k) ctx->limit_curve[12*i+3+3*j+k] = gsl_matrix_get(fixedpoints, k, j);
|
||||||
|
|
||||||
// bca abc acb = abc
|
// bca abc acb = abc
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
qsort(ctx->limit_curve, ctx->n_group_elements, 3*sizeof(double), compareAngle);
|
qsort(ctx->limit_curve, ctx->n_group_elements, 12*sizeof(double), compareAngle);
|
||||||
|
|
||||||
ctx->limit_curve_count = ctx->n_group_elements;
|
ctx->limit_curve_count = ctx->n_group_elements;
|
||||||
|
|
||||||
|
28
main.c
28
main.c
@ -45,9 +45,15 @@ void setupContext(DrawingContext *ctx, int argc, char *argv[])
|
|||||||
ctx->show_marking = 1;
|
ctx->show_marking = 1;
|
||||||
ctx->marking.x = -0.73679;
|
ctx->marking.x = -0.73679;
|
||||||
ctx->marking.y = -0.01873;
|
ctx->marking.y = -0.01873;
|
||||||
|
ctx->marking2.x = -0.73679;
|
||||||
|
ctx->marking2.y = -0.11873;
|
||||||
|
ctx->marking3.x = -0.73679;
|
||||||
|
ctx->marking3.y = -0.21873;
|
||||||
ctx->show_coxeter_orbit = 0;
|
ctx->show_coxeter_orbit = 0;
|
||||||
|
ctx->extra_text = malloc(1000*sizeof(char));
|
||||||
|
memset(ctx->extra_text, 0, 1000*sizeof(char));
|
||||||
|
|
||||||
ctx->limit_curve = malloc(3*ctx->n_group_elements*sizeof(double));
|
ctx->limit_curve = malloc(12*ctx->n_group_elements*sizeof(double));
|
||||||
ctx->limit_curve_count = -1;
|
ctx->limit_curve_count = -1;
|
||||||
|
|
||||||
ctx->group = malloc(ctx->n_group_elements*sizeof(groupelement_t));
|
ctx->group = malloc(ctx->n_group_elements*sizeof(groupelement_t));
|
||||||
@ -63,6 +69,7 @@ void destroyContext(DrawingContext *ctx)
|
|||||||
{
|
{
|
||||||
free(ctx->limit_curve);
|
free(ctx->limit_curve);
|
||||||
free(ctx->group);
|
free(ctx->group);
|
||||||
|
free(ctx->extra_text);
|
||||||
|
|
||||||
gsl_matrix_free(ctx->cartan);
|
gsl_matrix_free(ctx->cartan);
|
||||||
gsl_matrix_free(ctx->cob);
|
gsl_matrix_free(ctx->cob);
|
||||||
@ -230,7 +237,7 @@ int processEvent(GraphicsInfo *info, XEvent *ev)
|
|||||||
case ButtonPress:
|
case ButtonPress:
|
||||||
state = ev->xbutton.state & (ShiftMask | LockMask | ControlMask);
|
state = ev->xbutton.state & (ShiftMask | LockMask | ControlMask);
|
||||||
|
|
||||||
if(ev->xbutton.button == 1 && state & ShiftMask) {
|
if(ev->xbutton.button == 1 && state & ShiftMask && state & ControlMask) {
|
||||||
screen_context->marking.x = (double)ev->xbutton.x;
|
screen_context->marking.x = (double)ev->xbutton.x;
|
||||||
screen_context->marking.y = (double)ev->xbutton.y;
|
screen_context->marking.y = (double)ev->xbutton.y;
|
||||||
printf("mouse button pressed: %f, %f\n", screen_context->marking.x, screen_context->marking.y);
|
printf("mouse button pressed: %f, %f\n", screen_context->marking.x, screen_context->marking.y);
|
||||||
@ -238,7 +245,24 @@ int processEvent(GraphicsInfo *info, XEvent *ev)
|
|||||||
cairo_device_to_user(screen_context->cairo, &screen_context->marking.x, &screen_context->marking.y);
|
cairo_device_to_user(screen_context->cairo, &screen_context->marking.x, &screen_context->marking.y);
|
||||||
printf("mouse button pressed transformed: %f, %f\n", screen_context->marking.x, screen_context->marking.y);
|
printf("mouse button pressed transformed: %f, %f\n", screen_context->marking.x, screen_context->marking.y);
|
||||||
return STATUS_REDRAW;
|
return STATUS_REDRAW;
|
||||||
|
} else if(ev->xbutton.button == 1 && state & ControlMask) {
|
||||||
|
screen_context->marking2.x = (double)ev->xbutton.x;
|
||||||
|
screen_context->marking2.y = (double)ev->xbutton.y;
|
||||||
|
printf("mouse button pressed: %f, %f\n", screen_context->marking2.x, screen_context->marking2.y);
|
||||||
|
cairo_set_matrix(screen_context->cairo, &screen_context->dim->matrix);
|
||||||
|
cairo_device_to_user(screen_context->cairo, &screen_context->marking2.x, &screen_context->marking2.y);
|
||||||
|
printf("mouse button pressed transformed: %f, %f\n", screen_context->marking2.x, screen_context->marking2.y);
|
||||||
|
return STATUS_REDRAW;
|
||||||
|
} else if(ev->xbutton.button == 1 && state & ShiftMask) {
|
||||||
|
screen_context->marking3.x = (double)ev->xbutton.x;
|
||||||
|
screen_context->marking3.y = (double)ev->xbutton.y;
|
||||||
|
printf("mouse button pressed: %f, %f\n", screen_context->marking3.x, screen_context->marking3.y);
|
||||||
|
cairo_set_matrix(screen_context->cairo, &screen_context->dim->matrix);
|
||||||
|
cairo_device_to_user(screen_context->cairo, &screen_context->marking3.x, &screen_context->marking3.y);
|
||||||
|
printf("mouse button pressed transformed: %f, %f\n", screen_context->marking3.x, screen_context->marking3.y);
|
||||||
|
return STATUS_REDRAW;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case KeyPress:
|
case KeyPress:
|
||||||
|
3
main.h
3
main.h
@ -44,9 +44,12 @@ typedef struct {
|
|||||||
int limit_with_lines;
|
int limit_with_lines;
|
||||||
int show_marking;
|
int show_marking;
|
||||||
point_t marking;
|
point_t marking;
|
||||||
|
point_t marking2;
|
||||||
|
point_t marking3;
|
||||||
int show_coxeter_orbit;
|
int show_coxeter_orbit;
|
||||||
int use_repelling;
|
int use_repelling;
|
||||||
gsl_matrix *cartan, *cob;
|
gsl_matrix *cartan, *cob;
|
||||||
|
char *extra_text;
|
||||||
|
|
||||||
// precomputed and constant
|
// precomputed and constant
|
||||||
groupelement_t *group;
|
groupelement_t *group;
|
||||||
|
Loading…
Reference in New Issue
Block a user