bookshelf/Common/Geometry/Rectangle/Skew.lean

176 lines
3.9 KiB
Plaintext
Raw Permalink 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.Geometry.Point
import Common.Geometry.Segment
import Common.Real.Trigonometry
/-! # Common.Geometry.Rectangle.Skew
A characterization of a skew rectangle.
-/
namespace Geometry.Rectangle
/--
A `Skew` rectangle is characterized by three points and the angle formed between
them.
A `Point` can alternatively be viewed as a `Skew` rectangle in which all three
points coincide. A `Segment` can alternatively be viewed as a `Skew` rectangle
in which two of the three points coincide. Note that, by definition of
`Point.angle`, such a situation does indeed yield an angle of `π / 2`.
-/
structure Skew where
tl : Point -- top left
bl : Point -- bottom left
br : Point -- bottom right
has_right_angle : Point.angle tl bl br = Real.pi / 2
namespace Skew
/--
The top-right corner of the `Skew` rectangle.
-/
def tr (r : Skew) : Point :=
⟨r.tl.x + r.br.x - r.bl.x, r.tl.y + r.br.y - r.bl.y⟩
/--
A `Skew` rectangle's top side is equal in length to its bottom side.
-/
theorem dist_top_eq_dist_bottom (r : Skew)
: Point.dist r.tl r.tr = Point.dist r.bl r.br := by
unfold tr Point.dist
simp only
repeat rw [add_comm, sub_right_comm, add_sub_cancel']
/--
A `Skew` rectangle's left side is equal in length to its right side.
-/
theorem dist_left_eq_dist_right (r : Skew)
: Point.dist r.tl r.bl = Point.dist r.tr r.br := by
unfold tr Point.dist
simp only
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 `Skew` rectangle.
-/
noncomputable def width (r : Skew) : :=
Point.dist r.bl r.br
/--
Computes the height of a `Skew` rectangle.
-/
noncomputable def height (r : Skew) : :=
Point.dist r.bl r.tl
/--
A mapping from a `Skew` rectangle to the set describing the region enclosed by
the rectangle.
-/
def toSet (r : Skew) : Set Point := sorry
/-! ## Point -/
/--
A `Point` is a `Skew` rectangle in which all points coincide.
-/
abbrev AsPoint := Subtype (fun r : Skew => r.tl = r.bl ∧ r.bl = r.br)
namespace AsPoint
/--
The function mapping a `Skew` rectangle with all points coinciding to a `Point`.
-/
def toPoint (p : AsPoint) : Point := p.val.tl
/--
The function mapping a `Point` to a `Skew` rectangle with all points coinciding.
-/
def fromPoint (p : Point) : AsPoint :=
have hp : Point.angle p p p = Real.pi / 2 := by
unfold Point.angle Real.euclideanAngle
simp
⟨Skew.mk p p p hp, by simp⟩
/--
An isomorphism between a `Skew` rectangle with all points coinciding and a
`Point`.
-/
def isoPoint : AsPoint ≃ Point :=
{
toFun := toPoint,
invFun := fromPoint,
left_inv := by
unfold Function.LeftInverse fromPoint toPoint
simp only
intro p
congr
· exact p.property.left
· rw [p.property.left]
exact p.property.right
right_inv := by
unfold Function.RightInverse Function.LeftInverse fromPoint toPoint
simp only
intro _
triv
}
/--
The width of an `AsPoint` is `0`.
-/
theorem width_eq_zero (p : AsPoint) : p.val.width = 0 := by
unfold Skew.width
rw [p.property.right]
unfold Point.dist
simp
/--
The height of an `AsPoint` is `0`.
-/
theorem height_eq_zero (p : AsPoint) : p.val.height = 0 := by
unfold Skew.height
rw [p.property.left]
unfold Point.dist
simp
end AsPoint
/-! ## Segment -/
/--
A `Segment` is a `Skew` rectangle in which two of three points coincide.
-/
abbrev AsSegment := Subtype (fun r : Skew =>
(r.tl = r.bl ∧ r.bl ≠ r.br) (r.tl ≠ r.bl ∧ r.bl = r.br))
namespace AsSegment
/--
Either the width or height of an `AsSegment` is zero.
-/
theorem width_or_height_eq_zero (s : AsSegment)
: s.val.width = 0 s.val.height = 0 := by
apply Or.elim s.property
· intro h
refine Or.inr ?_
unfold height
rw [h.left]
unfold Point.dist
simp
· intro h
refine Or.inl ?_
unfold width
rw [h.right]
unfold Point.dist
simp
end AsSegment
end Skew
end Geometry.Rectangle