c++ 定义二维点point类包含点的坐标x和y再定义二维的三角形triangle类在三角形类中能对三角形类别进行判断。首先判断输入的三个点能否构成三角形然后判断是否为等腰三角形、等边三角形、直角三角形、等腰直角三角形。注意:要考虑计算机中实数计算的精度误差
以下是一个可能的实现:
#include <iostream>
#include <cmath>
class Point {
private:
    double x;
    double y;
public:
    Point(double x, double y) {
        this->x = x;
        this->y = y;
    }
    double getX() const {
        return x;
    }
    double getY() const {
        return y;
    }
};
class Triangle {
private:
    Point p1;
    Point p2;
    Point p3;
public:
    Triangle(Point p1, Point p2, Point p3) {
        this->p1 = p1;
        this->p2 = p2;
        this->p3 = p3;
    }
    bool isTriangle() const {
        // 使用向量叉积判断三点是否共线
        double crossProduct = (p2.getX() - p1.getX()) * (p3.getY() - p1.getY()) - (p2.getY() - p1.getY()) * (p3.getX() - p1.getX());
        return std::abs(crossProduct) > 1e-9; // 精度误差容忍度为 1e-9
    }
    bool isIsoscelesTriangle() const {
        // 判断是否为等腰三角形
        double side1 = getDistance(p1, p2);
        double side2 = getDistance(p2, p3);
        double side3 = getDistance(p3, p1);
        return std::abs(side1 - side2) < 1e-9 || std::abs(side2 - side3) < 1e-9 || std::abs(side3 - side1) < 1e-9;
    }
    bool isEquilateralTriangle() const {
        // 判断是否为等边三角形
        double side1 = getDistance(p1, p2);
        double side2 = getDistance(p2, p3);
        double side3 = getDistance(p3, p1);
        return std::abs(side1 - side2) < 1e-9 && std::abs(side2 - side3) < 1e-9;
    }
    bool isRightTriangle() const {
        // 判断是否为直角三角形
        double side1 = getDistance(p1, p2);
        double side2 = getDistance(p2, p3);
        double side3 = getDistance(p3, p1);
        double maxSide = std::max(std::max(side1, side2), side3);
        double otherSides = side1 + side2 + side3 - maxSide;
        return std::abs(maxSide * maxSide - (otherSides * otherSides)) < 1e-9;
    }
    bool isIsoscelesRightTriangle() const {
        // 判断是否为等腰直角三角形
        return isRightTriangle() && isIsoscelesTriangle();
    }
private:
    double getDistance(Point p1, Point p2) const {
        double deltaX = p2.getX() - p1.getX();
        double deltaY = p2.getY() - p1.getY();
        return std::sqrt(deltaX * deltaX + deltaY * deltaY);
    }
};
int main() {
    Point p1(0, 0);
    Point p2(1, 0);
    Point p3(0, 1);
    Triangle triangle(p1, p2, p3);
    if (triangle.isTriangle()) {
        std::cout << "Can form a triangle." << std::endl;
        if (triangle.isIsoscelesTriangle()) {
            std::cout << "Is an isosceles triangle." << std::endl;
        }
        if (triangle.isEquilateralTriangle()) {
            std::cout << "Is an equilateral triangle." << std::endl;
        }
        if (triangle.isRightTriangle()) {
            std::cout << "Is a right triangle." << std::endl;
        }
        if (triangle.isIsoscelesRightTriangle()) {
            std::cout << "Is an isosceles right triangle." << std::endl;
        }
    } else {
        std::cout << "Cannot form a triangle." << std::endl;
    }
    return 0;
}
这段代码首先定义了一个Point类来表示二维坐标点,包含x和y两个私有成员变量及对应的公有成员函数。
接下来定义了一个Triangle类来表示三角形,包含三个Point对象作为私有成员变量,以及一些用于判断三角形类别的公有成员函数。
isTriangle函数使用向量叉积的方法来判断三个点是否共线,从而判断是否能够构成三角形。
isIsoscelesTriangle函数判断三边是否有任意两边长度相等,从而判断是否为等腰三角形。
isEquilateralTriangle函数判断三边是否都相等,从而判断是否为等边三角形。
isRightTriangle函数使用勾股定理判断是否为直角三角形。
isIsoscelesRightTriangle函数判断是否为等腰直角三角形,即同时满足等腰和直角的条件。
最后,在main函数中创建一个Triangle对象,并通过调用各个判断函数来判断其类别,并输出结果。
需要注意的是,由于计算机中实数计算存在精度误差,因此在比较浮点数是否相等时,需要设置一个精度误差容忍度(例如1e-9)来避免误判
原文地址: https://www.cveoy.top/t/topic/hQVa 著作权归作者所有。请勿转载和采集!