Chapter 15
20 min read
Section 138 of 353

Lines and Planes in Space

Vectors and the Geometry of Space

Learning Objectives

By the end of this section, you will be able to:

  1. Write the vector, parametric, and symmetric equations of a line in three-dimensional space
  2. Derive the scalar and vector equations of a plane using normal vectors and points
  3. Determine whether a line and plane are parallel, intersecting, or if the line lies within the plane
  4. Calculate distances from points to lines and planes using vector projections
  5. Find angles between lines, between planes, and between a line and a plane
  6. Apply these concepts to real-world problems in physics, computer graphics, and machine learning

The Big Picture: Geometry Meets Algebra

"Lines and planes are the simplest geometric objects—and yet they form the foundation for understanding everything from neural network decision boundaries to airplane navigation."

In two dimensions, we described lines using equations like y=mx+by = mx + b. But in three dimensions, this familiar form breaks down. A single equation like y=2x+3y = 2x + 3 no longer defines a line—it defines an entire plane (with no restriction on zz).

To describe lines in 3D, we need a fundamentally different approach: we think of a line as a path traced by a moving point. This leads to parametric equations, where a single parameter tt generates every point on the line.

For planes, we use a different key insight: every plane can be uniquely determined by a point and a normal vector—a vector perpendicular to the plane. This connects directly to the dot product: every point on the plane satisfies nr=d\vec{n} \cdot \vec{r} = d.

Why This Matters

Understanding lines and planes in 3D is essential for:

  • Computer Graphics: Ray tracing, collision detection, 3D rendering
  • Robotics: Path planning, workspace analysis, obstacle avoidance
  • Machine Learning: Linear classifiers, support vector machines, decision boundaries
  • Physics: Light rays, electromagnetic waves, particle trajectories

Historical Context

The algebraic description of lines and planes evolved through centuries of mathematical development:

  • René Descartes (1637) invented coordinate geometry, connecting algebra to geometry for the first time
  • Leonhard Euler (1748) systematically developed equations for planes and their properties
  • William Rowan Hamilton (1843) introduced quaternions, leading to modern vector notation
  • Josiah Willard Gibbs (1880s) developed the modern vector algebra we use today, including dot and cross products

The parametric representation of curves was crucial for the development of calculus in multiple dimensions. Newton and Leibniz both used parametric descriptions when studying planetary orbits and other curves that couldn't be expressed as simple functions.


Lines in Three-Dimensional Space

A line in 3D space is uniquely determined by two pieces of information:

  1. A point on the line (let's call it P0=(x0,y0,z0)P_0 = (x_0, y_0, z_0))
  2. A direction vector d=a,b,c\vec{d} = \langle a, b, c \rangle indicating which way the line goes

Vector Equation of a Line

Starting from point P0P_0 and traveling in direction d\vec{d}, we can reach any point on the line by adding a scalar multiple of d\vec{d}:

Vector Equation of a Line

r(t)=r0+td\vec{r}(t) = \vec{r}_0 + t\vec{d}

or equivalently: r(t)=x0,y0,z0+ta,b,c\vec{r}(t) = \langle x_0, y_0, z_0 \rangle + t\langle a, b, c \rangle

Here, tt is a parameter that can take any real value:

  • When t=0t = 0, we're at P0P_0
  • When t>0t > 0, we've moved in the direction of d\vec{d}
  • When t<0t < 0, we've moved opposite to d\vec{d}

Intuition: The Parameter t as Time

Think of tt as time. At t=0t = 0, a particle is at P0P_0. As time passes, it moves along the line at constant velocity d\vec{d}. Each value of tt gives a unique position.

Parametric Equations

Breaking the vector equation into components, we get the parametric equations:

Parametric Equations

x=x0+atx = x_0 + at
y=y0+bty = y_0 + bt
z=z0+ctz = z_0 + ct

Example: Find parametric equations for the line through (2,1,3)(2, -1, 3) with direction 4,2,1\langle 4, 2, -1 \rangle.

Solution:

x=2+4tx = 2 + 4t
y=1+2ty = -1 + 2t
z=3tz = 3 - t

At t=0t = 0: (2,1,3)(2, -1, 3). At t=1t = 1: (6,1,2)(6, 1, 2).

Symmetric Equations

If we solve each parametric equation for tt and set them equal, we get the symmetric equations:

Symmetric Equations

xx0a=yy0b=zz0c\frac{x - x_0}{a} = \frac{y - y_0}{b} = \frac{z - z_0}{c}

(Valid when a,b,c0a, b, c \neq 0)

When a Direction Component is Zero

If one of a,b,ca, b, c is zero, we can't divide by it. Instead, we write the corresponding coordinate as a constant.

Example: If the line has direction 2,0,3\langle 2, 0, 3 \rangle through (1,5,2)(1, 5, -2), the symmetric form is:

x12=z+23,y=5\frac{x - 1}{2} = \frac{z + 2}{3}, \quad y = 5

Interactive Line Explorer

Use this interactive visualization to explore lines in 3D space. Adjust the starting point and direction vector to see how the parametric equation generates points along the line:

Interactive 3D Line Explorer

Point P₀ (x₀, y₀, z₀)

x₀:1.0
y₀:1.0
z₀:1.0

Direction d⃗ (a, b, c)

a:2.0
b:1.0
c:3.0

Parameter t

t:0.00

Parametric Equations

x = 1.0 + 2.0t
y = 1.0 + 1.0t
z = 1.0 + 3.0t
At t = 0.00:
(1.00, 1.00, 1.00)
Instructions: Drag to rotate, scroll to zoom, right-click to pan. The orange sphere is P₀, yellow arrow shows direction d⃗, cyan line is the full line, and the pink point shows the position at parameter t.

Planes in Three-Dimensional Space

A plane in 3D is determined by a point and a normal vector. The normal vector n=a,b,c\vec{n} = \langle a, b, c \rangle is perpendicular to every vector lying in the plane.

Scalar Equation of a Plane

For any point P=(x,y,z)P = (x, y, z) on the plane, the vector from P0P_0 to PP must be perpendicular to n\vec{n}. This gives:

Scalar Equation of a Plane

ax+by+cz=dax + by + cz = d

where d=ax0+by0+cz0=nr0d = ax_0 + by_0 + cz_0 = \vec{n} \cdot \vec{r}_0

Derivation: If nP0P\vec{n} \perp \overrightarrow{P_0P}, then:

nP0P=0\vec{n} \cdot \overrightarrow{P_0P} = 0
a,b,cxx0,yy0,zz0=0\langle a, b, c \rangle \cdot \langle x - x_0, y - y_0, z - z_0 \rangle = 0
a(xx0)+b(yy0)+c(zz0)=0a(x - x_0) + b(y - y_0) + c(z - z_0) = 0
ax+by+cz=ax0+by0+cz0=dax + by + cz = ax_0 + by_0 + cz_0 = d

Reading the Normal from the Equation

Given a plane equation ax+by+cz=dax + by + cz = d, the normal vector is simply n=a,b,c\vec{n} = \langle a, b, c \rangle—the coefficients of x,y,zx, y, z!

Vector Equation of a Plane

We can also express the plane equation in compact vector form:

Vector Equation of a Plane

n(rr0)=0\vec{n} \cdot (\vec{r} - \vec{r}_0) = 0

or equivalently: nr=nr0\vec{n} \cdot \vec{r} = \vec{n} \cdot \vec{r}_0

Example: Find the equation of the plane through (1,2,3)(1, 2, 3) with normal n=2,1,4\vec{n} = \langle 2, -1, 4 \rangle.

Solution:

d=2(1)+(1)(2)+4(3)=22+12=12d = 2(1) + (-1)(2) + 4(3) = 2 - 2 + 12 = 12
Plane equation: 2xy+4z=122x - y + 4z = 12

Interactive Plane Explorer

Explore how the normal vector and constant d affect the position and orientation of a plane:

Interactive 3D Plane Explorer

Normal Vector n⃗ (a, b, c)

a:1.0
b:1.0
c:1.0

Constant d

d:3.0

Display Options

Opacity:

Plane Equation

1.0x + 1.0y + 1.0z = 3.0
Point closest to origin: (1.00, 1.00, 1.00)
Distance from origin: 1.73
Instructions: Drag to rotate, scroll to zoom. The blue surface is the plane, and the yellow arrow shows the normal vector n⃗ pointing perpendicular to the plane.

Line-Plane Relationships

A line and a plane in 3D can relate in exactly three ways:

RelationshipGeometric MeaningAlgebraic Condition
IntersectingLine crosses plane at exactly one pointn⃗ · d⃗ ≠ 0
ParallelLine never touches planen⃗ · d⃗ = 0 and line point not on plane
ContainedEntire line lies in planen⃗ · d⃗ = 0 and line point on plane

Finding the Intersection Point

To find where a line intersects a plane:

  1. Write the line in parametric form: x=x0+at,  y=y0+bt,  z=z0+ctx = x_0 + at, \; y = y_0 + bt, \; z = z_0 + ct
  2. Substitute into the plane equation: ax+by+cz=da \cdot x + b \cdot y + c \cdot z = d
  3. Solve for tt
  4. Plug tt back to get the intersection point

Formula for t: Given line r(t)=P0+td\vec{r}(t) = P_0 + t\vec{d} and plane nr=D\vec{n} \cdot \vec{r} = D:

t=DnP0ndt = \frac{D - \vec{n} \cdot P_0}{\vec{n} \cdot \vec{d}}

Example: Find where the line through (1,0,0)(1, 0, 0) with direction 1,1,1\langle 1, 1, 1 \rangle intersects the plane x+2y+z=6x + 2y + z = 6.

Solution:

Line: x=1+t,  y=t,  z=tx = 1 + t, \; y = t, \; z = t
Substitute: (1+t)+2(t)+(t)=6(1 + t) + 2(t) + (t) = 6
1+4t=6    t=541 + 4t = 6 \implies t = \frac{5}{4}
Intersection: (94,54,54)\left(\frac{9}{4}, \frac{5}{4}, \frac{5}{4}\right)

Interactive Intersection Explorer

Experiment with different line and plane configurations to see how they intersect (or don't):

Line-Plane Intersection Explorer

Line Point P₀

x:0.0
y:0.0
z:0.0

Line Direction d⃗

a:1.0
b:1.0
c:1.0

Plane Normal n⃗

a:0.0
b:1.0
c:0.0

Plane Constant d

d:2.0

Result

✓ Line intersects plane
Point: (2.00, 2.00, 2.00)
Parameter t = 2.000
Cyan line: parametric line r⃗(t) = P₀ + t·d⃗ • Blue/Orange plane: n⃗ · r⃗ = d • Red sphere: intersection point • Yellow arrow: plane normal

Distance Formulas

Distance from a Point to a Plane

The distance from point (x1,y1,z1)(x_1, y_1, z_1) to plane ax+by+cz=dax + by + cz = d is:

Point-to-Plane Distance

D=ax1+by1+cz1da2+b2+c2D = \frac{|ax_1 + by_1 + cz_1 - d|}{\sqrt{a^2 + b^2 + c^2}}

Geometric interpretation: This formula computes the length of the projection of any vector from the plane to the point onto the unit normal. The numerator is the scalar projection; the denominator normalizes the normal vector.

Example: Distance from (3,1,2)(3, -1, 2) to plane 2x2y+z=52x - 2y + z = 5:

D=2(3)2(1)+1(2)54+4+1D = \frac{|2(3) - 2(-1) + 1(2) - 5|}{\sqrt{4 + 4 + 1}}
=6+2+253=53= \frac{|6 + 2 + 2 - 5|}{3} = \frac{5}{3}

Distance from a Point to a Line

For point PP and line through QQ with direction d\vec{d}:

Point-to-Line Distance

D=QP×ddD = \frac{|\overrightarrow{QP} \times \vec{d}|}{|\vec{d}|}

Geometric interpretation: The cross product QP×d\overrightarrow{QP} \times \vec{d} has magnitude equal to the area of the parallelogram formed by these vectors. Dividing by the base length d|\vec{d}| gives the height, which is the perpendicular distance.


Angles Between Lines and Planes

The relationships between angles and dot/cross products make computing angles straightforward:

ObjectsAngle Formula
Two lines (directions d₁, d₂)cos θ = |d⃗₁ · d⃗₂| / (|d⃗₁| |d⃗₂|)
Two planes (normals n₁, n₂)cos θ = |n⃗₁ · n⃗₂| / (|n⃗₁| |n⃗₂|)
Line and plane (d, n)sin θ = |d⃗ · n⃗| / (|d⃗| |n⃗|)

Why Absolute Values?

We use absolute values because we want the acute angle between lines or planes. The dot product could be negative depending on vector orientations, but the angle should be between 0° and 90°.

Special cases:

  • Perpendicular lines: d1d2=0\vec{d}_1 \cdot \vec{d}_2 = 0
  • Parallel lines: d1×d2=0\vec{d}_1 \times \vec{d}_2 = \vec{0}
  • Perpendicular planes: n1n2=0\vec{n}_1 \cdot \vec{n}_2 = 0
  • Parallel planes: n1×n2=0\vec{n}_1 \times \vec{n}_2 = \vec{0}

Real-World Applications

Computer Graphics: Ray Tracing

In ray tracing, we model light as rays (lines) and compute their intersections with surfaces. For polygonal surfaces (triangles, quads), this means:

  1. Find the plane containing the polygon
  2. Compute the ray-plane intersection
  3. Check if the intersection point lies within the polygon bounds

Application: Rendering a 3D scene

For each pixel in the image, cast a ray from the camera through that pixel. Find the nearest object the ray intersects. The line-plane intersection formula runs billions of times in a single rendered frame!

Robotics: Collision Detection

Robot arms move through 3D space along planned trajectories. To avoid collisions:

  • Model the arm segments as cylinders or line segments
  • Model obstacles as planes, boxes, or other primitives
  • Compute distances between arm and obstacles
  • Adjust trajectory if distance falls below safety threshold

Aviation: Flight Path Planning

Aircraft must maintain safe separations. Their flight paths are modeled as lines in 3D space (latitude, longitude, altitude). Finding the closest approach distance between two flight paths uses the line-to-line distance formula:

For lines L1:P1+td1L_1: P_1 + t\vec{d}_1 and L2:P2+sd2L_2: P_2 + s\vec{d}_2, the distance is:

D=(P1P2)(d1×d2)d1×d2D = \frac{|(\overrightarrow{P_1P_2}) \cdot (\vec{d}_1 \times \vec{d}_2)|}{|\vec{d}_1 \times \vec{d}_2|}

Machine Learning Connection

Lines and planes appear throughout machine learning, often as decision boundaries:

Linear Classifiers

In a linear classifier, we separate data points using a hyperplane (a plane in higher dimensions). The decision rule is:

y^=sign(wx+b)\hat{y} = \text{sign}(\vec{w} \cdot \vec{x} + b)

This is exactly the plane equation nr=d\vec{n} \cdot \vec{r} = d! The weight vector w\vec{w} is the normal to the decision boundary, and bb is the offset.

Support Vector Machines (SVM)

SVMs find the hyperplane that maximizes the margin—the distance to the nearest training points. The margin is exactly the point-to-plane distance formula:

margin=2w\text{margin} = \frac{2}{|\vec{w}|}

Neural Network Visualization

Each neuron in a neural network computes σ(wx+b)\sigma(\vec{w} \cdot \vec{x} + b). Before the activation function σ\sigma, this is a hyperplane in input space. The activation "bends" the hyperplane into a more complex decision surface.

Geometric Intuition for Deep Learning

Understanding lines and planes helps you visualize what neural networks are doing: each layer transforms the data, and linear layers create hyperplane cuts through the feature space. ReLU activations fold these hyperplanes. Deep networks compose many such transformations.


Python Implementation

Parametric Lines in 3D

Working with Lines in 3D
🐍lines_3d.py
3Parametric Line Function

The parametric equation r(t) = P₀ + t·d gives any point on the line by varying the parameter t. When t=0 we get P₀, positive t moves along d, negative t moves opposite to d.

17NumPy Array Conversion

Converting to NumPy arrays enables vectorized operations. This is crucial for efficiently computing many points at once.

21Broadcasting for Multiple t Values

np.outer(t, direction) computes the outer product, allowing us to calculate all line points simultaneously. This is much faster than a loop.

34 lines without explanation
1import numpy as np
2
3def parametric_line(P0, direction, t):
4    """
5    Compute point on line at parameter t.
6
7    Line: r(t) = P0 + t * direction
8
9    Args:
10        P0: Starting point [x0, y0, z0]
11        direction: Direction vector [a, b, c]
12        t: Parameter value (scalar or array)
13
14    Returns:
15        Point(s) on the line
16    """
17    P0 = np.array(P0)
18    direction = np.array(direction)
19    t = np.atleast_1d(t)
20
21    # Broadcast multiplication for multiple t values
22    points = P0 + np.outer(t, direction)
23    return points.squeeze()
24
25# Example: Line through (1, 2, 3) with direction <2, 1, -1>
26P0 = [1, 2, 3]
27d = [2, 1, -1]
28
29print("Points on line r(t) = (1,2,3) + t<2,1,-1>:")
30for t in [-1, 0, 1, 2]:
31    point = parametric_line(P0, d, t)
32    print(f"  t={t:2d}: {point}")
33
34# Generate many points for plotting
35t_values = np.linspace(-2, 2, 50)
36line_points = parametric_line(P0, d, t_values)
37print(f"\nGenerated {len(line_points)} points for visualization")

Planes from Points and Normals

Working with Planes in 3D
🐍planes_3d.py
17Plane Membership Test

A point (x,y,z) lies on the plane ax + by + cz = d if and only if substituting gives exactly d. The difference tells us how far off the point is.

28Vectors in the Plane

Any two non-parallel vectors lying in the plane can be found by subtracting point coordinates. These span the plane.

32Cross Product for Normal

The cross product of two vectors in a plane gives a vector perpendicular to both—this is the plane&apos;s normal vector! This is one of the most important applications of the cross product.

42 lines without explanation
1import numpy as np
2
3def plane_equation(normal, d, point):
4    """
5    Check if a point satisfies the plane equation.
6
7    Plane: n · r = d, or ax + by + cz = d
8
9    Args:
10        normal: Normal vector [a, b, c]
11        d: Plane constant
12        point: Point to check [x, y, z]
13
14    Returns:
15        True if point is on plane, difference otherwise
16    """
17    n = np.array(normal)
18    p = np.array(point)
19    result = np.dot(n, p)
20    return result - d  # Should be 0 if on plane
21
22def plane_from_three_points(P1, P2, P3):
23    """
24    Find plane equation from three non-collinear points.
25
26    Method: Normal = (P2-P1) × (P3-P1)
27    """
28    P1, P2, P3 = np.array(P1), np.array(P2), np.array(P3)
29
30    # Two vectors in the plane
31    v1 = P2 - P1
32    v2 = P3 - P1
33
34    # Normal via cross product
35    normal = np.cross(v1, v2)
36
37    # d = n · P1 (any of the three points works)
38    d = np.dot(normal, P1)
39
40    return normal, d
41
42# Example: Plane through (1,0,0), (0,1,0), (0,0,1)
43n, d = plane_from_three_points([1,0,0], [0,1,0], [0,0,1])
44print(f"Plane: {n[0]}x + {n[1]}y + {n[2]}z = {d}")
45print(f"This is the plane x + y + z = 1")

Line-Plane Intersection

Finding Intersections
🐍intersection.py
9Derivation of Parameter t

Substituting the line equation into the plane equation and solving for t. This is the key insight: reducing a 3D geometry problem to a 1D parameter search.

20Parallel Line Check

When n·d = 0, the line direction is perpendicular to the normal, meaning the line is parallel to the plane. No single intersection exists.

24Line in Plane Check

If the line is parallel AND a point on it satisfies the plane equation, the entire line lies within the plane (infinitely many intersections).

42 lines without explanation
1import numpy as np
2
3def line_plane_intersection(line_point, line_dir, plane_normal, plane_d):
4    """
5    Find intersection of line and plane.
6
7    Line: r(t) = P + t*d
8    Plane: n · r = D
9
10    Substituting: n · (P + t*d) = D
11    Solving: t = (D - n·P) / (n·d)
12
13    Returns:
14        (intersection_point, t) or None if parallel
15    """
16    P = np.array(line_point)
17    d = np.array(line_dir)
18    n = np.array(plane_normal)
19
20    n_dot_d = np.dot(n, d)
21
22    # Check if line is parallel to plane
23    if np.abs(n_dot_d) < 1e-10:
24        # Check if line lies in plane
25        if np.abs(np.dot(n, P) - plane_d) < 1e-10:
26            return "Line lies in plane", None
27        return "Parallel, no intersection", None
28
29    # Find parameter t
30    t = (plane_d - np.dot(n, P)) / n_dot_d
31
32    # Compute intersection point
33    intersection = P + t * d
34
35    return intersection, t
36
37# Example: Line through origin along <1,1,1>, plane x+y+z=3
38result, t = line_plane_intersection(
39    line_point=[0, 0, 0],
40    line_dir=[1, 1, 1],
41    plane_normal=[1, 1, 1],
42    plane_d=3
43)
44print(f"Intersection at {result} (t = {t})")
45# Point (1, 1, 1) where x+y+z = 3 ✓

Distance Calculations

Distance Formulas in Python
🐍distances.py
7Point-Plane Distance Formula

This elegant formula works because the numerator measures how far the point is from satisfying the plane equation, and dividing by |n| normalizes the result.

31Cross Product for Distance

The cross product |QP × d| gives the area of a parallelogram. Dividing by the base |d| gives the height—which is exactly the perpendicular distance from P to the line!

47 lines without explanation
1import numpy as np
2
3def point_to_plane_distance(point, plane_normal, plane_d):
4    """
5    Compute distance from point to plane.
6
7    Formula: dist = |n·P - d| / |n|
8
9    This comes from projecting the vector from any plane point
10    to P onto the unit normal.
11    """
12    P = np.array(point)
13    n = np.array(plane_normal)
14
15    numerator = np.abs(np.dot(n, P) - plane_d)
16    denominator = np.linalg.norm(n)
17
18    return numerator / denominator
19
20def point_to_line_distance(point, line_point, line_dir):
21    """
22    Compute distance from point to line.
23
24    Method: Use cross product to find perpendicular distance.
25    dist = |PQ × d| / |d|
26
27    where Q is any point on the line.
28    """
29    P = np.array(point)
30    Q = np.array(line_point)
31    d = np.array(line_dir)
32
33    # Vector from line point to our point
34    QP = P - Q
35
36    # Cross product gives parallelogram area
37    cross = np.cross(QP, d)
38
39    # Distance = area / base length
40    return np.linalg.norm(cross) / np.linalg.norm(d)
41
42# Examples
43print("Distance from (0,0,0) to plane x+y+z=3:")
44dist1 = point_to_plane_distance([0,0,0], [1,1,1], 3)
45print(f"  {dist1:.4f} = 3/√3 = √3 ≈ 1.732")
46
47print("\nDistance from (1,0,0) to line through origin along z-axis:")
48dist2 = point_to_line_distance([1,0,0], [0,0,0], [0,0,1])
49print(f"  {dist2:.4f} = 1 (perpendicular distance)")

Test Your Understanding

Lines and Planes Quiz

Question 1 of 8

What is the direction vector of the line x = 2 + 3t, y = -1 + t, z = 4 - 2t?


Summary

Lines in 3D Space

FormEquation
Vectorr⃗(t) = r⃗₀ + td⃗
Parametricx = x₀ + at, y = y₀ + bt, z = z₀ + ct
Symmetric(x-x₀)/a = (y-y₀)/b = (z-z₀)/c

Planes in 3D Space

FormEquation
Scalarax + by + cz = d
Vectorn⃗ · (r⃗ - r⃗₀) = 0
Normal from equationn⃗ = ⟨a, b, c⟩

Key Formulas

QuantityFormula
Line-plane intersection tt = (d - n⃗·P₀) / (n⃗·d⃗)
Point-to-plane distance|ax₁ + by₁ + cz₁ - d| / √(a²+b²+c²)
Point-to-line distance|QP⃗ × d⃗| / |d⃗|
Angle between planescos θ = |n⃗₁·n⃗₂| / (|n⃗₁||n⃗₂|)

Key Takeaways

  1. Lines in 3D require two pieces of information: a point and a direction vector
  2. Planes are defined by a normal vector that points perpendicular to the plane
  3. The dot product determines when lines are parallel to planes (nd=0\vec{n} \cdot \vec{d} = 0)
  4. The cross product is essential for computing distances and finding normals
  5. These concepts directly apply to machine learning(decision boundaries) and computer graphics (ray tracing)
The Bridge to Higher Dimensions:
"In n dimensions, a hyperplane has equation w⃗·x⃗ = b. Everything you've learned about 3D planes generalizes directly!"
Coming Next: In the next section, we'll explore Quadric Surfaces—the 3D generalizations of conic sections like ellipses, hyperbolas, and parabolas. These surfaces include spheres, cylinders, cones, and more exotic shapes like hyperboloids.
Loading comments...