用c++实现一个三角形的类,包含三个顶点坐标(按照逆时针排序),每个边的边长(按照逆时针排序),三角形的面积,法向矢量;
时间: 2024-12-06 13:24:13 浏览: 18
在C++中,我们可以创建一个名为`Triangle`的类,它包括三个顶点的坐标(`Point`结构体)、三条边的长度以及相关的属性如面积和法向量。首先,我们需要定义一个简单的`Point`结构体表示二维空间中的一个点:
```cpp
#include <cmath>
// 定义点结构体
struct Point {
double x;
double y;
};
```
接着,我们创建`Triangle`类:
```cpp
class Triangle {
private:
// 顶点
Point vertices[3];
// 边长,按照逆时针排序
double side_lengths[3];
public:
// 构造函数接收三个顶点
Triangle(Point v1, Point v2, Point v3) :
vertices{v1, v2, v3}, side_lengths{distance(vertices[0], vertices[1]), distance(vertices[1], vertices[2]), distance(vertices[2], vertices[0])} {}
// 辅助函数计算两点之间的距离
static double distance(const Point &p1, const Point &p2) {
return std::sqrt(std::pow(p2.x - p1.x, 2) + std::pow(p2.y - p1.y, 2));
}
// 计算面积(海伦公式)
double area() const {
double s = (side_lengths[0] + side_lengths[1] + side_lengths[2]) / 2.0;
return sqrt(s * (s - side_lengths[0]) * (s - side_lengths[1]) * (s - side_lengths[2]));
}
// 计算法向量
Point normal() const {
double crossProduct = (vertices[1].y - vertices[0].y) * (vertices[2].x - vertices[0].x) - (vertices[2].y - vertices[0].y) * (vertices[1].x - vertices[0].x);
double normalX = (vertices[2].y - vertices[0].y);
double normalY = (vertices[0].x - vertices[1].x);
if (crossProduct > 0)
return {normalX, -normalY}; // 取逆时针方向
else
return {normalX, normalY}; // 取顺时针方向
}
};
// 使用示例
int main() {
Point a(0, 0), b(1, 0), c(0.5, std::sqrt(3)/2);
Triangle triangle(a, b, c);
std::cout << "Area: " << triangle.area() << "\n";
std::cout << "Normal Vector: (" << triangle.normal().x << ", " << triangle.normal().y << ")\n";
return 0;
}
```
在这个例子中,我们假设输入的顶点已经按逆时针顺序排列。`area()`和`normal()`方法用于计算三角形的面积和法向量。
阅读全文