97 lines
2.3 KiB
JavaScript

/**
* 圆形计算
* @param {number} radius 半径
* @returns {Object} 计算结果
*/
function circle(radius) {
if (radius < 0) {
throw new Error("半径不能为负数");
}
return {
area: Math.PI * radius * radius, // 面积
perimeter: 2 * Math.PI * radius, // 周长
diameter: 2 * radius, // 直径
};
}
/**
* 矩形计算
* @param {number} width 宽度
* @param {number} height 高度
* @returns {Object} 计算结果
*/
function rectangle(width, height) {
if (width < 0 || height < 0) {
throw new Error("长度不能为负数");
}
return {
area: width * height, // 面积
perimeter: 2 * (width + height), // 周长
diagonal: Math.sqrt(width * width + height * height), // 对角线长度
};
}
/**
* 三角形计算
* @param {number} a 边长a
* @param {number} b 边长b
* @param {number} c 边长c
* @returns {Object} 计算结果
*/
function triangle(a, b, c) {
if (a < 0 || b < 0 || c < 0) {
throw new Error("边长不能为负数");
}
// 检查三角形是否合法(任意两边之和大于第三边)
if (a + b <= c || b + c <= a || a + c <= b) {
throw new Error("不能构成三角形");
}
// 半周长
const s = (a + b + c) / 2;
// 使用海伦公式计算面积
const area = Math.sqrt(s * (s - a) * (s - b) * (s - c));
// 计算三个角的角度(弧度)
const angleA = Math.acos((b * b + c * c - a * a) / (2 * b * c));
const angleB = Math.acos((a * a + c * c - b * b) / (2 * a * c));
const angleC = Math.acos((a * a + b * b - c * c) / (2 * a * b));
// 判断三角形类型
const angles = [angleA, angleB, angleC].map(
(angle) => (angle * 180) / Math.PI
);
let type;
if (angles.some((angle) => Math.abs(angle - 90) < 0.000001)) {
type = "直角三角形";
} else if (angles.some((angle) => angle > 90)) {
type = "钝角三角形";
} else {
type = "锐角三角形";
}
return {
area, // 面积
perimeter: a + b + c, // 周长
angles: {
// 三个角的度数
A: angles[0],
B: angles[1],
C: angles[2],
},
type, // 三角形类型
inradius: area / s, // 内切圆半径
circumradius: (a * b * c) / (4 * area), // 外接圆半径
};
}
module.exports = {
circle,
rectangle,
triangle,
};