-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhyperbolic.cpp
More file actions
66 lines (52 loc) · 1.51 KB
/
Copy pathhyperbolic.cpp
File metadata and controls
66 lines (52 loc) · 1.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
Copyright 2023 by Christophe Favergeon.
All rights reserved.
https://www.favergeon.info/arts/2023/02/11/hyperbolic.html
*/
#include <stdio.h>
#include "hyperbolic.h"
#include <cmath>
vec3 hcross(const vec3 &u, const vec3 &v)
{
return (vec3{v.z * u.y - v.y * u.z,
-v.z * u.x + v.x * u.z,
-(v.y * u.x - v.x * u.y)});
}
double hdot(const vec3 &u, const vec3 &v)
{
return (u.x * v.x + u.y * v.y - u.z * v.z);
}
void get_angles(int p, int q, int r, double &alpha, double &beta, double &gamma)
{
alpha = M_PI / p;
beta = M_PI / q;
gamma = M_PI / r;
}
vec3 operator-(const vec3 &v)
{
return (vec3{-v.x, -v.y, -v.z});
}
void compute_triangle(int p, int q, int r, vec3 &n1, vec3 &n2, vec3 &n3)
{
double alpha, beta, gamma;
if (1.0 / p + 1.0 / q + 1.0 / r >= 1.0)
{
fprintf(stderr, "Error: not a hyperbolic triangle\n");
// default to (4,4,4)
p = 4;
q = 4;
r = 4;
}
get_angles(p, q, r, alpha, beta, gamma);
double a = acosh((cos(gamma) * cos(beta) + cos(alpha))/(sin(gamma) * sin(beta)));
double b = acosh((cos(gamma) * cos(alpha) + cos(beta))/(sin(gamma) * sin(alpha)));
double c = acosh((cos(alpha) * cos(beta) + cos(gamma))/(sin(alpha) * sin(beta)));
vec3 p0{0.0,0.0,1.0};
vec3 p1{0.0,sinh(a),cosh(a)};
double u=cosh(c) / tanh(a) - cosh(b) / sinh(a);
double v=cosh(c);
vec3 p2{sqrt(v*v-u*u-1),u,v};
n1 = -hcross(p0, p1);
n2 = -hcross(p1, p2);
n3 = -hcross(p2, p0);
}