首先,定义点:
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)
}
}
才疏学浅,如有错误,恳请指正!