计算三角形三个内角

针对知乎上一个问题把圆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));
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容