bookshelf/Common/Real/Geometry/Rectangle.lean

147 lines
3.5 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import Common.Real.Geometry.Basic
/-! # Common.Real.Geometry.Rectangle
A characterization of a rectangle. This follows the definition as outlined in
[^1]. Note that a `Point` and a `LineSegment` are both considered rectangles,
with one or both dimensions equal to `0` respectively.
[^1]: Apostol, Tom M. Calculus, Vol. 1: One-Variable Calculus, with an
Introduction to Linear Algebra. 2nd ed. Vol. 1. 2 vols. Wiley, 1991.
-/
namespace Real
/--
A `Rectangle` is characterized by three distinct points and the angle formed
between line segments originating from the "bottom left" point.
-/
structure Rectangle where
top_left : ℝ²
bottom_left : ℝ²
bottom_right : ℝ²
forms_right_angle : ∠ top_left bottom_left bottom_right = π / 2
namespace Rectangle
/--
The top-right corner of the rectangle, oriented with respect to the other
vertices.
-/
def topRight (r : Rectangle) : ℝ² :=
( r.top_left.fst + r.bottom_right.fst - r.bottom_left.fst
, r.top_left.snd + r.bottom_right.snd - r.bottom_left.snd
)
/--
A `Rectangle` is the locus of points bounded by its edges.
-/
def toSet (r : Rectangle) : Set ℝ² :=
sorry
/--
A `Rectangle`'s top side is equal in length to its bottom side.
-/
theorem dist_top_eq_dist_bottom (r : Rectangle)
: dist r.top_left r.topRight = dist r.bottom_left r.bottom_right := by
unfold topRight dist
repeat rw [add_comm, sub_right_comm, add_sub_cancel']
/--
A `Rectangle`'s left side is equal in length to its right side.
-/
theorem dist_left_eq_dist_right (r : Rectangle)
: dist r.top_left r.bottom_left = dist r.topRight r.bottom_right := by
unfold topRight dist
repeat rw [
sub_sub_eq_add_sub,
add_comm,
sub_add_eq_sub_sub,
sub_right_comm,
add_sub_cancel'
]
/--
Computes the width of a `Rectangle`.
-/
noncomputable def width (r : Rectangle) : :=
dist r.bottom_left r.bottom_right
/--
Computes the height of a `Rectangle`.
-/
noncomputable def height (r : Rectangle) : :=
dist r.bottom_left r.top_left
end Rectangle
/--
A `Point` is a `Rectangle` in which all points coincide.
-/
abbrev Point := Subtype (fun r : Rectangle =>
r.top_left = r.bottom_left ∧ r.bottom_left = r.bottom_right)
namespace Point
/--
A `Point` is the set consisting of just itself.
-/
def toSet (p : Point) : Set ℝ² := p.val.toSet
/--
The width of a `Point` is `0`.
-/
theorem width_eq_zero (p : Point) : p.val.width = 0 := by
unfold Rectangle.width
rw [p.property.right]
unfold dist
simp
/--
The height of a `Point` is `0`.
-/
theorem height_eq_zero (p : Point) : p.val.height = 0 := by
unfold Rectangle.height
rw [p.property.left]
unfold dist
simp
end Point
/--
A `LineSegment` is a `Rectangle` in which two of the three points coincide.
-/
abbrev LineSegment := Subtype (fun r : Rectangle =>
(r.top_left = r.bottom_left ∧ r.bottom_left ≠ r.bottom_right)
(r.top_left ≠ r.bottom_left ∧ r.bottom_left = r.bottom_right))
namespace LineSegment
/--
A `LineSegment` `s` is the set of points corresponding to the shortest line
segment joining the two distinct points of `s`.
-/
def toSet (s : LineSegment) : Set ℝ² := s.val.toSet
/--
Either the width or height of a `LineSegment` is zero.
-/
theorem width_or_height_eq_zero (s : LineSegment)
: s.val.width = 0 s.val.height = 0 := by
apply Or.elim s.property
· intro h
refine Or.inr ?_
unfold Rectangle.height
rw [h.left]
unfold dist
simp
· intro h
refine Or.inl ?_
unfold Rectangle.width
rw [h.right]
unfold dist
simp
end LineSegment
end Real