用纯虚函数计算某点是否在图形上,并用纯虚函数计算周长和面积
时间: 2024-05-12 08:13:50 浏览: 11
以下是一个使用纯虚函数的示例代码,其中定义了一个抽象的图形类 Shape,它包含三个纯虚函数:
- `bool contains(double x, double y)`:判断点(x, y)是否在图形上。
- `double perimeter()`:计算图形的周长。
- `double area()`:计算图形的面积。
具体的图形类如圆形、矩形、三角形等都可以从 Shape 类派生出来,实现自己的 contains、perimeter 和 area 函数。
```c++
#include <cmath>
class Shape {
public:
virtual bool contains(double x, double y) = 0;
virtual double perimeter() = 0;
virtual double area() = 0;
};
class Circle : public Shape {
public:
Circle(double cx, double cy, double r) : m_cx(cx), m_cy(cy), m_r(r) {}
bool contains(double x, double y) override {
return std::hypot(m_cx - x, m_cy - y) <= m_r;
}
double perimeter() override {
return 2 * M_PI * m_r;
}
double area() override {
return M_PI * m_r * m_r;
}
private:
double m_cx, m_cy, m_r;
};
class Rectangle : public Shape {
public:
Rectangle(double x1, double y1, double x2, double y2) : m_x1(x1), m_y1(y1), m_x2(x2), m_y2(y2) {}
bool contains(double x, double y) override {
return x >= m_x1 && x <= m_x2 && y >= m_y1 && y <= m_y2;
}
double perimeter() override {
return 2 * (m_x2 - m_x1 + m_y2 - m_y1);
}
double area() override {
return (m_x2 - m_x1) * (m_y2 - m_y1);
}
private:
double m_x1, m_y1, m_x2, m_y2;
};
class Triangle : public Shape {
public:
Triangle(double x1, double y1, double x2, double y2, double x3, double y3)
: m_x1(x1), m_y1(y1), m_x2(x2), m_y2(y2), m_x3(x3), m_y3(y3) {}
bool contains(double x, double y) override {
double A = area();
double A1 = Triangle(x, y, m_x2, m_y2, m_x3, m_y3).area();
double A2 = Triangle(x, y, m_x1, m_y1, m_x3, m_y3).area();
double A3 = Triangle(x, y, m_x1, m_y1, m_x2, m_y2).area();
return A == A1 + A2 + A3;
}
double perimeter() override {
double a = std::hypot(m_x2 - m_x1, m_y2 - m_y1);
double b = std::hypot(m_x3 - m_x2, m_y3 - m_y2);
double c = std::hypot(m_x1 - m_x3, m_y1 - m_y3);
return a + b + c;
}
double area() override {
double a = std::hypot(m_x2 - m_x1, m_y2 - m_y1);
double b = std::hypot(m_x3 - m_x2, m_y3 - m_y2);
double c = std::hypot(m_x1 - m_x3, m_y1 - m_y3);
double s = (a + b + c) / 2;
return std::sqrt(s * (s - a) * (s - b) * (s - c));
}
private:
double m_x1, m_y1, m_x2, m_y2, m_x3, m_y3;
double area() {
return std::abs((m_x1 - m_x3) * (m_y2 - m_y3) - (m_x2 - m_x3) * (m_y1 - m_y3)) / 2;
}
};
```
这样,我们就可以创建各种不同的图形对象,然后调用其 contains、perimeter 和 area 函数进行计算了。例如:
```c++
int main() {
Shape* shapes[] = {
new Circle(0, 0, 1),
new Rectangle(-1, -1, 1, 1),
new Triangle(0, 0, 1, 0, 0, 1)
};
for (auto shape : shapes) {
std::cout << "Perimeter: " << shape->perimeter() << std::endl;
std::cout << "Area: " << shape->area() << std::endl;
std::cout << "Contains (0, 0): " << std::boolalpha << shape->contains(0, 0) << std::endl;
std::cout << "Contains (2, 2): " << std::boolalpha << shape->contains(2, 2) << std::endl;
delete shape;
}
return 0;
}
```