Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 × height
  • perimeter() - 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 × height
  • perimeter() - 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

ShapeSidesArea FormulaPerimeter Formula
Circle-πr²2πr
Square44s
Rectangle4w×h2(w+h)
Triangle3½bha+b+c
Pentagon5~1.72s²5s
Hexagon6~2.598s²6s
Octagon8~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)