JavaScript 三角形常用数学方法封装

首先,定义点:

function Point(x, y) {
    this.x = x;
    this.y = y;
    this.length = function () {
        return Math.sqrt(x * x + y * y);
    }
}

:基于上方点的格式,若已知三角形三点之坐标,定义三角形:

function Triangle(point_1, point_2, point_3) {
    this.point_1 = point_1;
    this.point_2 = point_2;
    this.point_3 = point_3;

    this.edges = function () {
        let edge_1_2 = {};
        let edge_2_3 = {};
        let edge_1_3 = {};
        //三条边的长度
        edge_1_2.length = distance(point_1, point_2);
        edge_2_3.length = distance(point_2, point_3);
        edge_1_3.length = distance(point_1, point_3);
        //三条边的方程 y = k * x + b
        edge_1_2.euqation = line_connecting_two_points(point_1, point_2);
        edge_2_3.euqation = line_connecting_two_points(point_2, point_3);
        edge_1_3.euqation = line_connecting_two_points(point_1, point_3);
        //两点间距离方程
        function distance(p1, p2) {
            return Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
        }
        //两点联立直线方程
        function line_connecting_two_points(p1, p2) {
            let x1 = p1.x;
            let y1 = p1.y;
            let x2 = p2.x;
            let y2 = p2.y;
            let k = (y1 - y2) / (x1 - x2);
            return {
                k: k,
                b: y1 - x1 * k
            }
        }
        return {
            edge_1_2: edge_1_2,
            edge_2_3: edge_2_3,
            edge_1_3: edge_1_3,
            edge_1: edge_2_3,
            edge_2: edge_1_3,
            edge_3: edge_1_2
        }
    }
    //三个角的角度
    this.angles = function () {
        let edges = this.edges();
        let edge_1 = edges.edge_1.length;
        let edge_2 = edges.edge_2.length;
        let edge_3 = edges.edge_3.length;
        let edge_1_square = edge_1 * edge_1;
        let edge_2_square = edge_2 * edge_2;
        let edge_3_square = edge_3 * edge_3;

        let cos_angle_1 = (edge_2_square + edge_2_square - edge_1_square) / 2 / edge_2 / edge_3;
        let cos_angle_2 = (edge_1_square + edge_3_square - edge_2_square) / 2 / edge_1 / edge_3;
        let cos_angle_3 = (edge_1_square + edge_2_square - edge_3_square) / 2 / edge_1 / edge_2;
        let angle_1_radian = Math.acos(cos_angle_1);
        let angle_2_radian = Math.acos(cos_angle_2);
        let angle_3_radian = Math.acos(cos_angle_3);
        let angle_1_degree = angle_1_radian / Math.PI * 180;
        let angle_2_degree = angle_2_radian / Math.PI * 180;
        let angle_3_degree = angle_3_radian / Math.PI * 180;

        return {
            angle_1: angle_1_degree,
            angle_2: angle_2_degree,
            angle_3: angle_3_degree
        }

    }
    //三角形面积
    this.area = function () {
        let x1 = point_1.x;
        let y1 = point_1.y;
        let x2 = point_2.x;
        let y2 = point_2.y;
        let x3 = point_3.x;
        let y3 = point_3.y;
        return (x1 * (y2 - y3) + x2 * (y3 - y1 - y2) + x3 * y1) / 2;
    }
    //三角形周长
    this.perimeter = function () {
        let edges = this.edges();
        return edges.edge_1_2.length() + edges.edge_2_3.length() + edges.edge_1_3.length();
    }
    //三角形的重心
    this.barycenter = function () {
        return {
            x: (point_1.x + point_2.x + point_3.x) / 3,
            y: (point_1.y + point_2.y + point_3.y) / 3,
        }
    }
    //三角形的外接圆
    this.circumscribed_circle = function () {
        let x1 = point_1.x;
        let y1 = point_1.y;
        let x2 = point_2.x;
        let y2 = point_2.y;
        let x3 = point_3.x;
        let y3 = point_3.y;
        let A1 = 2 * (x2 - x1);
        let B1 = 2 * (y2 - y1);
        let C1 = x2 * x2 + y2 * y2 - x1 * x1 - y1 * y1;
        let A2 = 2 * (x3 - x2);
        let B2 = 2 * (y3 - y2);
        let C2 = x3 * x3 + y3 * y3 - x2 * x2 - y2 * y2;
        let x = (C1 * B2 - C2 * B1) / (A1 * B2 - A2 * B1);
        let y = (A1 * C2 - A2 * C1) / (A1 * B2 - A2 * B1);
        let edges = this.edges();
        let radius = edges.edge_1_2.length * edges.edge_2_3.length * edges.edge_1_3.length / 4 / this.area();
        return {
            x: x,
            y: y,
            radius: radius
        }
    }
    //三角形的外心
    this.circumcenter = function () {
        let circumscribed_circle = this.circumscribed_circle();
        return {
            x: circumscribed_circle.x,
            y: circumscribed_circle.y
        }
    }
    //三角形的内切圆
    this.inscribed_circle = function () {
        let x1 = point_1.x;
        let y1 = point_1.y;
        let x2 = point_2.x;
        let y2 = point_2.y;
        let x3 = point_3.x;
        let y3 = point_3.y;
        let area = this.area();
        let edges = this.edges();
        let perimeter = this.perimeter();
        let x = (edges.edge_1_2 * x3 + edge_2_3 * x1 + edge_1_3 * x2) / perimeter;
        let y = (edges.edge_1_2 * y3 + edge_2_3 * y1 + edge_1_3 * y2) / perimeter;
        let radius = 2 * area / perimeter;
        return {
            x: x,
            y: y,
            radius: radius
        }
    }
}

顺便拆分出一些常用的函数:

三角形的面积公式:

根据坐标直接得面积,比海伦公式更快

function area_of_triangle(point_1, point_2, point_3) {
    let x1 = point_1.x;
    let y1 = point_1.y;
    let x2 = point_2.x;
    let y2 = point_2.y;
    let x3 = point_3.x;
    let y3 = point_3.y;
    return (x1 * (y2 - y3) + x2 * (y3 - y1 - y2) + x3 * y1) / 2;
}

经过两点的直线方程:

function line_connecting_two_points(p1, p2) {
    let x1 = p1.x;
    let y1 = p1.y;
    let x2 = p2.x;
    let y2 = p2.y;
    let k = (y1 - y2) / (x1 - x2);
    return {
        k: k,
        b: y1 - x1 * k
    }
}

两直线联立求交点:

function intersection_of_two_lines(l1, l2) {
    return {
        x: (l2.b - l1.b) / (l1.k - l2.k),
        y: (l1.k * l2.b - l2.k * l1.b) / (l1.k - l2.k)
    }
}

才疏学浅,如有错误,恳请指正!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值