Skip to content

Instantly share code, notes, and snippets.

@baku89
Created May 9, 2021 05:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save baku89/45e4047e2c657d5c51c8cfb0a3f3de66 to your computer and use it in GitHub Desktop.
Save baku89/45e4047e2c657d5c51c8cfb0a3f3de66 to your computer and use it in GitHub Desktop.
tdsw_hou04
vector2 calc_angle_range(vector c; vector p0; vector p1) {
vector2 p = set(p0.x, p0.y) - set(c.x, c.y);
vector2 q = set(p1.x, p1.y) - set(c.x, c.y);
float start = atan(p.y, p.x);vector2 calc_angle_range(vector c; vector p0; vector p1) {
vector2 p = set(p0.x, p0.y) - set(c.x, c.y);
vector2 q = set(p1.x, p1.y) - set(c.x, c.y);
float start = atan(p.y, p.x);
matrix2 rot = ident();
rotate(rot, -start);
vector q_ = q * rot;
float end = start + atan(q_.y, q_.x);
return set(degrees(start), degrees(end));
}
vector A = point(1, "P", 0);
vector B = point(1, "P", 1);
vector C = point(1, "P", 2);
float a = distance(B, C);
float b = distance(C, A);
float c = distance(A, B);
float a2 = a * a;
float b2 = b * b;
float c2 = c * c;
float aw = a2 * (b2 + c2 - a2);
float bw = b2 * (c2 + a2 - b2);
float cw = c2 * (a2 + b2 - c2);
vector center = (A * aw + B * bw + C * cw) / (aw + bw + cw);
float radius = distance(center, A);
int pt = addpoint(0, center);
setpointattrib(0, "pscale", pt, radius);
vector pts[];
if (a < c && b < c) {
push(pts, B);
push(pts, C);
push(pts, A);
} else if (a < b && c < b) {
push(pts, A);
push(pts, B);
push(pts, C);
} else {
push(pts, C);
push(pts, A);
push(pts, B);
}
v@center = center;
u@arc0 = calc_angle_range(center, pts[0], pts[1]);
u@arc1 = calc_angle_range(center, pts[1], pts[2]);
@radius = radius;
matrix2 rot = ident();
rotate(rot, -start);
vector q_ = q * rot;
float end = start + atan(q_.y, q_.x);
return set(degrees(start), degrees(end));
}
vector A = point(1, "P", 0);
vector B = point(1, "P", 1);
vector C = point(1, "P", 2);
float a = distance(B, C);
float b = distance(C, A);
float c = distance(A, B);
float a2 = a * a;
float b2 = b * b;
float c2 = c * c;
float aw = a2 * (b2 + c2 - a2);
float bw = b2 * (c2 + a2 - b2);
float cw = c2 * (a2 + b2 - c2);
vector center = (A * aw + B * bw + C * cw) / (aw + bw + cw);
float radius = distance(center, A);
int pt = addpoint(0, center);
setpointattrib(0, "pscale", pt, radius);
vector pts[];
if (a < c && b < c) {
push(pts, B);
push(pts, C);
push(pts, A);
} else if (a < b && c < b) {
push(pts, A);
push(pts, B);
push(pts, C);
} else {
push(pts, C);
push(pts, A);
push(pts, B);
}
v@center = center;
u@arc0 = calc_angle_range(center, pts[0], pts[1]);
u@arc1 = calc_angle_range(center, pts[1], pts[2]);
@radius = radius;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment