2D Shapes
The Shape2D classes provide an easy way to calculate areas and perimeters of common 2D shapes (flat shapes).
Overview
All 2D shapes inherit from the Shape2D base class and provide two main methods:
area()- Calculate the area (space inside the shape)perimeter()- Calculate the perimeter (distance around the shape)
Include
#include <imeth/shape/2D.hpp>
Base Class
class Shape2D {
public:
virtual double area() const = 0;
virtual double perimeter() const = 0;
};
Available Shapes
Circle
A round shape with all points equally distant from the center.
Circle(double radius);
Methods:
area()- Returns πr²perimeter()- Returns 2πr (also called circumference)
Examples:
Circle circle(5.0);
std::cout << "Area: " << circle.area() << "\n"; // 78.54
std::cout << "Perimeter: " << circle.perimeter() << "\n"; // 31.42
// Pizza with 12 inch diameter (radius = 6)
Circle pizza(6);
std::cout << "Pizza area: " << pizza.area() << " sq in\n"; // 113.1 sq in
Formula:
- Area = π × r²
- Perimeter = 2 × π × r
Rectangle
A four-sided shape with opposite sides equal and all angles 90°.
Rectangle(double width, double height);
Methods:
area()- Returns width × heightperimeter()- Returns 2(width + height)
Examples:
Rectangle rect(10, 5);
std::cout << "Area: " << rect.area() << "\n"; // 50
std::cout << "Perimeter: " << rect.perimeter() << "\n"; // 30
// Phone screen: 6 inches by 3 inches
Rectangle screen(6, 3);
std::cout << "Screen area: " << screen.area() << " sq in\n"; // 18 sq in
Formula:
- Area = width × height
- Perimeter = 2 × (width + height)
Square
A special rectangle where all four sides are equal.
Square(double side);
Methods:
area()- Returns side²perimeter()- Returns 4 × side
Examples:
Square square(4);
std::cout << "Area: " << square.area() << "\n"; // 16
std::cout << "Perimeter: " << square.perimeter() << "\n"; // 16
// Chess board square (each square is 2 inches)
Square chessSquare(2);
std::cout << "Square area: " << chessSquare.area() << " sq in\n"; // 4 sq in
Formula:
- Area = side²
- Perimeter = 4 × side
Triangle
A three-sided shape. This implementation uses base and height (for right triangles or when height is known).
Triangle(double base, double height);
Methods:
area()- Returns ½ × base × heightperimeter()- Returns base + side1 + side2 (calculated)
Examples:
Triangle triangle(6, 4);
std::cout << "Area: " << triangle.area() << "\n"; // 12
std::cout << "Perimeter: " << triangle.perimeter() << "\n";
// Triangular warning sign
Triangle sign(10, 8.66);
std::cout << "Sign area: " << sign.area() << " sq in\n"; // 43.3 sq in
Formula:
- Area = ½ × base × height
Pentagon
A five-sided regular polygon (all sides and angles equal).
Pentagon(double side);
Methods:
area()- Returns ¼√(25 + 10√5) × side²perimeter()- Returns 5 × side
Examples:
Pentagon pentagon(5);
std::cout << "Area: " << pentagon.area() << "\n"; // 43.01
std::cout << "Perimeter: " << pentagon.perimeter() << "\n"; // 25
// The Pentagon building (simplified, each side ≈ 921 feet)
Pentagon building(921);
std::cout << "Perimeter: " << building.perimeter() << " feet\n"; // 4605 feet
Formula:
- Area ≈ 1.72048 × side²
- Perimeter = 5 × side
Hexagon
A six-sided regular polygon (like a honeycomb cell).
Hexagon(double side);
Methods:
area()- Returns (3√3/2) × side²perimeter()- Returns 6 × side
Examples:
Hexagon hexagon(4);
std::cout << "Area: " << hexagon.area() << "\n"; // 41.57
std::cout << "Perimeter: " << hexagon.perimeter() << "\n"; // 24
// Honeycomb cell (each side ≈ 2.5mm)
Hexagon honeycomb(2.5);
std::cout << "Cell area: " << honeycomb.area() << " sq mm\n"; // 16.24 sq mm
Formula:
- Area ≈ 2.598 × side²
- Perimeter = 6 × side
Fun fact: Hexagons are the most efficient shape for covering an area (that's why bees use them!)
Octagon
An eight-sided regular polygon (like a stop sign).
Octagon(double side);
Methods:
area()- Returns 2(1 + √2) × side²perimeter()- Returns 8 × side
Examples:
Octagon octagon(3);
std::cout << "Area: " << octagon.area() << "\n"; // 43.46
std::cout << "Perimeter: " << octagon.perimeter() << "\n"; // 24
// Stop sign (each side ≈ 12 inches)
Octagon stopSign(12);
std::cout << "Sign area: " << stopSign.area() << " sq in\n"; // 695.3 sq in
Formula:
- Area ≈ 4.828 × side²
- Perimeter = 8 × side
Polymorphism Example
Since all shapes inherit from Shape2D, you can use them polymorphically:
#include <vector>
#include <memory>
std::vector<std::unique_ptr<Shape2D>> shapes;
shapes.push_back(std::make_unique<Circle>(5));
shapes.push_back(std::make_unique<Square>(4));
shapes.push_back(std::make_unique<Hexagon>(3));
for (const auto& shape : shapes) {
std::cout << "Area: " << shape->area()
<< ", Perimeter: " << shape->perimeter() << "\n";
}
Comparison Example
Compare different shapes:
Circle circle(5);
Square square(5);
std::cout << "Circle area: " << circle.area() << "\n"; // 78.54
std::cout << "Square area: " << square.area() << "\n"; // 25
// Which has more area?
if (circle.area() > square.area()) {
std::cout << "Circle has more area!\n";
}
Real-World Applications
1. Calculate Paint Needed
Rectangle wall(10, 8); // 10 feet wide, 8 feet tall
double paintPerSquareFoot = 0.02; // gallons per sq ft
double paintNeeded = wall.area() * paintPerSquareFoot;
std::cout << "Paint needed: " << paintNeeded << " gallons\n";
2. Fencing a Garden
Rectangle garden(15, 20); // 15m × 20m
double fenceCostPerMeter = 25; // $25 per meter
double totalCost = garden.perimeter() * fenceCostPerMeter;
std::cout << "Fencing cost: $" << totalCost << "\n"; // $1750
3. Pizza Size Comparison
Circle smallPizza(6); // 6 inch radius
Circle largePizza(9); // 9 inch radius
double smallArea = smallPizza.area();
double largeArea = largePizza.area();
std::cout << "Small pizza: " << smallArea << " sq in\n";
std::cout << "Large pizza: " << largeArea << " sq in\n";
std::cout << "Large is " << (largeArea / smallArea) << "x bigger!\n";
4. Sports Field
Rectangle soccerField(100, 60); // 100m × 60m
std::cout << "Field area: " << soccerField.area() << " sq m\n"; // 6000
std::cout << "Running track: " << soccerField.perimeter() << " m\n"; // 320
Circle centerCircle(9.15); // Center circle radius
std::cout << "Center circle area: " << centerCircle.area() << " sq m\n";
Quick Reference Table
| Shape | Sides | Area Formula | Perimeter Formula |
|---|---|---|---|
| Circle | - | πr² | 2πr |
| Square | 4 | s² | 4s |
| Rectangle | 4 | w×h | 2(w+h) |
| Triangle | 3 | ½bh | a+b+c |
| Pentagon | 5 | ~1.72s² | 5s |
| Hexagon | 6 | ~2.598s² | 6s |
| Octagon | 8 | ~4.828s² | 8s |
Tips
- Use circles for round objects (pizza, wheels, clocks)
- Use rectangles for most everyday objects (rooms, screens, books)
- Use squares when all sides are equal
- Regular polygons (pentagon, hexagon, octagon) have all sides and angles equal
- The more sides a regular polygon has, the more it looks like a circle!
Common Units
- Area units: square meters (m²), square feet (ft²), square inches (in²)
- Perimeter units: meters (m), feet (ft), inches (in)