针对知乎上一个问题把圆18等分,取三个点组成三角形,有多少个三角形有两个角差30度?
略带好奇地计算了一下。
function calc_triangular_inner_angles(x1, y1, x2, y2, x3, y3) {
let a = Math.sqrt(Math.pow(x3 - x2, 2) + Math.pow(y3 - y2, 2));
let b = Math.sqrt(Math.pow(x3 - x1, 2) + Math.pow(y3 - y1, 2));
let c = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
let a2 = a * a;
let b2 = b * b;
let c2 = c * c;
let cos_a = (b2 + c2 - a2) / (2 * b * c);
let cos_b = (a2 + c2 - b2) / (2 * a * c);
let cos_c = (a2 + b2 - c2) / (2 * a * b);
let angle_a = Math.acos(cos_a);
let angle_b = Math.acos(cos_b);
let angle_c = Math.acos(cos_c);
angle_a = angle_a / Math.PI * 180
angle_b = angle_b / Math.PI * 180
angle_c = angle_c / Math.PI * 180
return [angle_a, angle_b, angle_c].sort();
}
String.prototype.format = function(){
var args = arguments;
return this.replace(/\{(\d+)\}/gm, function(ms, p1){return typeof(args[p1]) == 'undefined' ? ms : args[p1]});
}
//start
r = 10;
angle_30 = 30;
tolerance = 0.000001;
cnt = 0
for (let i = 0; i <= 15; i++) {
for (let j = i + 1; j <= 16; j++) {
for (let k = j + 1; k <= 17; k++) {
let angle_i = (Math.PI * i) / 9;
let angle_j = (Math.PI * j) / 9;
let angle_k = (Math.PI * k) / 9;
let x1 = Math.cos(angle_i) * r;
let y1 = Math.sin(angle_i) * r;
let x2 = Math.cos(angle_j) * r;
let y2 = Math.sin(angle_j) * r;
let x3 = Math.cos(angle_k) * r;
let y3 = Math.sin(angle_k) * r;
arr = calc_triangular_inner_angles(x1, y1, x2, y2, x3, y3);
if (
Math.abs(Math.abs(arr[1] - arr[0]) - angle_30) < tolerance ||
Math.abs(Math.abs(arr[2] - arr[1]) - angle_30) < tolerance ||
Math.abs(Math.abs(arr[2] - arr[0]) - angle_30) < tolerance
) {
console.log("*******");
console.log("i={0},j={1},k={2},angles=[{3},{4},{5}]".format(i, j, k, arr[0], arr[1], arr[2]))
cnt++;
}
}
}
}
console.log("cnt = {0}".format(cnt));