@@ -5,7 +5,7 @@ Authors: Joseph Myers, Manuel Candales
5
5
-/
6
6
import analysis.special_functions.trigonometric
7
7
import algebra.quadratic_discriminant
8
- import analysis.normed_space.add_torsor
8
+ import analysis.normed_space.affine_isometry
9
9
import data.matrix.notation
10
10
import linear_algebra.affine_space.finite_dimensional
11
11
import tactic.fin_cases
@@ -864,6 +864,15 @@ begin
864
864
exact hp }
865
865
end
866
866
867
+ @[simp] lemma orthogonal_projection_mem_subspace_eq_self {s : affine_subspace ℝ P} [nonempty s]
868
+ [complete_space s.direction] (p : s) :
869
+ orthogonal_projection s p = p :=
870
+ begin
871
+ ext,
872
+ rw orthogonal_projection_eq_self_iff,
873
+ exact p.2
874
+ end
875
+
867
876
/-- Orthogonal projection is idempotent. -/
868
877
@[simp] lemma orthogonal_projection_orthogonal_projection (s : affine_subspace ℝ P) [nonempty s]
869
878
[complete_space s.direction] (p : P) :
@@ -911,6 +920,18 @@ lemma vsub_orthogonal_projection_mem_direction_orthogonal (s : affine_subspace
911
920
direction_mk' p s.directionᗮ ▸
912
921
vsub_mem_direction (self_mem_mk' _ _) (orthogonal_projection_mem_orthogonal s p)
913
922
923
+ /-- Subtracting the `orthogonal_projection` from `p` produces a result in the kernel of the linear
924
+ part of the orthogonal projection. -/
925
+ lemma orthogonal_projection_vsub_orthogonal_projection (s : affine_subspace ℝ P) [nonempty s]
926
+ [complete_space s.direction] (p : P) :
927
+ _root_.orthogonal_projection s.direction (p -ᵥ orthogonal_projection s p) = 0 :=
928
+ begin
929
+ apply orthogonal_projection_mem_subspace_orthogonal_complement_eq_zero,
930
+ intros c hc,
931
+ rw [← neg_vsub_eq_vsub_rev, inner_neg_right,
932
+ (orthogonal_projection_vsub_mem_direction_orthogonal s p c hc), neg_zero]
933
+ end
934
+
914
935
/-- Adding a vector to a point in the given subspace, then taking the
915
936
orthogonal projection, produces the original point if the vector was
916
937
in the orthogonal direction. -/
@@ -981,42 +1002,27 @@ and complete. The word "reflection" is sometimes understood to mean
981
1002
specifically reflection in a codimension-one subspace, and sometimes
982
1003
more generally to cover operations such as reflection in a point. The
983
1004
definition here, of reflection in an affine subspace, is a more
984
- general sense of the word that includes both those common cases. If
985
- the subspace is empty or not complete, `orthogonal_projection` is
986
- defined as the identity map, which results in `reflection` being the
987
- identity map in that case as well. -/
1005
+ general sense of the word that includes both those common cases. -/
988
1006
def reflection (s : affine_subspace ℝ P) [nonempty s] [complete_space s.direction] :
989
- P ≃ᵢ P :=
990
- { to_fun := λ p, (↑(orthogonal_projection s p) -ᵥ p) +ᵥ orthogonal_projection s p,
991
- inv_fun := λ p, (↑(orthogonal_projection s p) -ᵥ p) +ᵥ orthogonal_projection s p,
992
- left_inv := λ p, by simp [vsub_vadd_eq_vsub_sub, -orthogonal_projection_linear],
993
- right_inv := λ p, by simp [vsub_vadd_eq_vsub_sub, -orthogonal_projection_linear],
994
- isometry_to_fun := begin
995
- dsimp only,
996
- rw isometry_emetric_iff_metric,
997
- intros p₁ p₂,
998
- rw [←mul_self_inj_of_nonneg dist_nonneg dist_nonneg, dist_eq_norm_vsub V
999
- ((↑(orthogonal_projection s p₁) -ᵥ p₁) +ᵥ ↑(orthogonal_projection s p₁)),
1000
- dist_eq_norm_vsub V p₁, ←inner_self_eq_norm_sq, ←inner_self_eq_norm_sq],
1001
- calc
1002
- ⟪((orthogonal_projection s p₁ : P) -ᵥ p₁ +ᵥ (orthogonal_projection s p₁ : P) -ᵥ
1003
- ((orthogonal_projection s p₂ : P) -ᵥ p₂ +ᵥ orthogonal_projection s p₂)),
1004
- ((orthogonal_projection s p₁ : P) -ᵥ p₁ +ᵥ (orthogonal_projection s p₁ : P) -ᵥ
1005
- ((orthogonal_projection s p₂ : P) -ᵥ p₂ +ᵥ orthogonal_projection s p₂))⟫
1006
- = ⟪(_root_.orthogonal_projection s.direction (p₁ -ᵥ p₂)) +
1007
- _root_.orthogonal_projection s.direction (p₁ -ᵥ p₂) - (p₁ -ᵥ p₂),
1008
- _root_.orthogonal_projection s.direction (p₁ -ᵥ p₂) +
1009
- _root_.orthogonal_projection s.direction (p₁ -ᵥ p₂) - (p₁ -ᵥ p₂)⟫
1010
- : by { rw [vsub_vadd_eq_vsub_sub, vadd_vsub_assoc, add_comm, add_sub_assoc,
1011
- ←vsub_vadd_eq_vsub_sub, vsub_vadd_comm, vsub_vadd_eq_vsub_sub, ←add_sub_assoc, ←coe_vsub,
1012
- ←affine_map.linear_map_vsub], simp }
1013
- ... = -4 * inner (p₁ -ᵥ p₂ - (_root_.orthogonal_projection s.direction (p₁ -ᵥ p₂) : V))
1014
- (_root_.orthogonal_projection s.direction (p₁ -ᵥ p₂)) +
1015
- ⟪p₁ -ᵥ p₂, p₁ -ᵥ p₂⟫
1016
- : by { simp [inner_sub_left, inner_sub_right, inner_add_left, inner_add_right,
1017
- real_inner_comm (p₁ -ᵥ p₂)], ring }
1018
- ... = ⟪p₁ -ᵥ p₂, p₁ -ᵥ p₂⟫ : by simp,
1019
- end }
1007
+ P ≃ᵃⁱ[ℝ] P :=
1008
+ affine_isometry_equiv.mk'
1009
+ (λ p, (↑(orthogonal_projection s p) -ᵥ p) +ᵥ orthogonal_projection s p)
1010
+ (_root_.reflection s.direction)
1011
+ ↑(classical.arbitrary s)
1012
+ begin
1013
+ intros p,
1014
+ let v := p -ᵥ ↑(classical.arbitrary s),
1015
+ let a : V := _root_.orthogonal_projection s.direction v,
1016
+ let b : P := ↑(classical.arbitrary s),
1017
+ have key : a +ᵥ b -ᵥ (v +ᵥ b) +ᵥ (a +ᵥ b) = a + a - v +ᵥ (b -ᵥ b +ᵥ b),
1018
+ { rw [← add_vadd, vsub_vadd_eq_vsub_sub, vsub_vadd, vadd_vsub],
1019
+ congr' 1 ,
1020
+ abel },
1021
+ have : p = v +ᵥ ↑(classical.arbitrary s) := (vsub_vadd p ↑(classical.arbitrary s)).symm,
1022
+ simpa only [coe_vadd, reflection_apply, affine_map.map_vadd, orthogonal_projection_linear,
1023
+ orthogonal_projection_mem_subspace_eq_self, vadd_vsub, continuous_linear_map.coe_coe,
1024
+ continuous_linear_equiv.coe_coe, this ] using key,
1025
+ end
1020
1026
1021
1027
/-- The result of reflecting. -/
1022
1028
lemma reflection_apply (s : affine_subspace ℝ P) [nonempty s] [complete_space s.direction] (p : P) :
@@ -1028,16 +1034,25 @@ lemma eq_reflection_of_eq_subspace {s s' : affine_subspace ℝ P} [nonempty s]
1028
1034
(reflection s p : P) = (reflection s' p : P) :=
1029
1035
by unfreezingI { subst h }
1030
1036
1031
- /-- Reflection is its own inverse. -/
1032
- @[simp] lemma reflection_symm (s : affine_subspace ℝ P) [nonempty s] [complete_space s.direction] :
1033
- (reflection s).symm = reflection s :=
1034
- rfl
1035
-
1036
1037
/-- Reflecting twice in the same subspace. -/
1037
1038
@[simp] lemma reflection_reflection (s : affine_subspace ℝ P) [nonempty s]
1038
1039
[complete_space s.direction] (p : P) :
1039
1040
reflection s (reflection s p) = p :=
1040
- (reflection s).left_inv p
1041
+ begin
1042
+ have : ∀ a : s, ∀ b : V, (_root_.orthogonal_projection s.direction) b = 0
1043
+ → reflection s (reflection s (b +ᵥ a)) = b +ᵥ a,
1044
+ { intros a b h,
1045
+ have : (a:P) -ᵥ (b +ᵥ a) = - b,
1046
+ { rw [vsub_vadd_eq_vsub_sub, vsub_self, zero_sub] },
1047
+ simp [reflection, h, this ] },
1048
+ rw ← vsub_vadd p (orthogonal_projection s p),
1049
+ exact this (orthogonal_projection s p) _ (orthogonal_projection_vsub_orthogonal_projection s p),
1050
+ end
1051
+
1052
+ /-- Reflection is its own inverse. -/
1053
+ @[simp] lemma reflection_symm (s : affine_subspace ℝ P) [nonempty s] [complete_space s.direction] :
1054
+ (reflection s).symm = reflection s :=
1055
+ by { ext, rw ← (reflection s).injective.eq_iff, simp }
1041
1056
1042
1057
/-- Reflection is involutive. -/
1043
1058
lemma reflection_involutive (s : affine_subspace ℝ P) [nonempty s] [complete_space s.direction] :
@@ -1088,7 +1103,7 @@ lemma dist_reflection (s : affine_subspace ℝ P) [nonempty s] [complete_space s
1088
1103
dist p₁ (reflection s p₂) = dist (reflection s p₁) p₂ :=
1089
1104
begin
1090
1105
conv_lhs { rw ←reflection_reflection s p₁ },
1091
- exact (reflection s).dist_eq _ _
1106
+ exact (reflection s).dist_map _ _
1092
1107
end
1093
1108
1094
1109
/-- A point in the subspace is equidistant from another point and its
@@ -1098,7 +1113,7 @@ lemma dist_reflection_eq_of_mem (s : affine_subspace ℝ P) [nonempty s] [comple
1098
1113
dist p₁ (reflection s p₂) = dist p₁ p₂ :=
1099
1114
begin
1100
1115
rw ←reflection_eq_self_iff p₁ at hp₁,
1101
- convert (reflection s).dist_eq p₁ p₂,
1116
+ convert (reflection s).dist_map p₁ p₂,
1102
1117
rw hp₁
1103
1118
end
1104
1119
0 commit comments