77 lines
1.7 KiB
Plaintext
77 lines
1.7 KiB
Plaintext
import Mathlib.Data.Real.Basic
|
||
import Mathlib.Data.Real.Sqrt
|
||
|
||
import Common.Real.Trigonometry
|
||
|
||
/-! # Common.Geometry.Point
|
||
|
||
A representation of a point in the two-dimensional Cartesian plane.
|
||
-/
|
||
|
||
namespace Geometry
|
||
|
||
structure Point where
|
||
x : ℝ
|
||
y : ℝ
|
||
|
||
noncomputable instance : DecidableEq Point := by
|
||
intro p₁ p₂
|
||
have ⟨x₁, y₁⟩ := p₁
|
||
have ⟨x₂, y₂⟩ := p₂
|
||
if hp : x₁ = x₂ ∧ y₁ = y₂ then
|
||
rw [hp.left, hp.right]
|
||
exact isTrue rfl
|
||
else
|
||
rw [not_and_or] at hp
|
||
refine isFalse ?_
|
||
intro h
|
||
injection h with hx hy
|
||
apply Or.elim hp
|
||
· intro nx
|
||
exact absurd hx nx
|
||
· intro ny
|
||
exact absurd hy ny
|
||
|
||
namespace Point
|
||
|
||
/--
|
||
The function mapping a `Point` to a `2`-tuple of reals.
|
||
-/
|
||
def toTuple (p : Point) : ℝ × ℝ := (p.x, p.y)
|
||
|
||
/--
|
||
The function mapping a `2`-tuple of reals to a `Point`.
|
||
-/
|
||
def fromTuple (p : ℝ × ℝ) : Point := Point.mk p.1 p.2
|
||
|
||
/--
|
||
An isomorphism between a `Point` and a `2`-tuple.
|
||
-/
|
||
def isoTuple : Point ≃ ℝ × ℝ :=
|
||
{
|
||
toFun := toTuple,
|
||
invFun := fromTuple,
|
||
left_inv := by
|
||
unfold Function.LeftInverse fromTuple toTuple
|
||
simp,
|
||
right_inv := by
|
||
unfold Function.RightInverse Function.LeftInverse fromTuple toTuple
|
||
simp
|
||
}
|
||
|
||
/--
|
||
The length of the straight line segment connecting points `p` and `q`.
|
||
-/
|
||
noncomputable def dist (p q : Point) :=
|
||
Real.sqrt ((abs (q.x - p.x)) ^ 2 + (abs (q.y - p.y)) ^ 2)
|
||
|
||
/--
|
||
The undirected angle at `p₂` between the line segments to `p₁` and `p₃`. If
|
||
either of those points equals `p₂`, this is `π / 2`.
|
||
-/
|
||
noncomputable def angle (p₁ p₂ p₃ : Point) : ℝ :=
|
||
Real.euclideanAngle (toTuple p₁) (toTuple p₂) (toTuple p₃)
|
||
|
||
end Point
|
||
|
||
end Geometry |