//: [Previous](@previous) // Xcode で Editor メニュー > Show Render Markup でお読みください //import UIKit import Foundation /*: # 中学2年の数学 */ /*: ## 三角形と四角形 */ /*: ## 平行線と面積 */ /*: #### 平面図形の平行線 𝑝₁ = (𝑥₁, 𝑦₁) から 𝑝₂ = (𝑥₂, 𝑦₂) への線分と 𝑝₃ = (𝑥₃, 𝑦₃) から 𝑝₄ = (𝑥₄, 𝑦₄) への線分が平行であるかは、 𝑝₁, 𝑝₂ を通る直線と 𝑝₃, 𝑝₄ を通る直線が交わらないことを示せばよい 2点を通る直線は、既出 𝑎₁ = (𝑦₂ - 𝑦₁)/(𝑥₂ - 𝑥₁), 𝑏₁ = 𝑦₁ - 𝑥₁⋅(𝑦₂ - 𝑦₁)/(𝑥₂ - 𝑥₁) 𝑎₂ = (𝑦₄ - 𝑦₃)/(𝑥₄ - 𝑥₃), 𝑏₂ = 𝑦₃ - 𝑥₃⋅(𝑦₄ - 𝑦₃)/(𝑥₄ - 𝑥₃) 2直線の交点も、既出 𝑦 = 𝑎₁𝑥 + 𝑏₁, 𝑦 = 𝑎₂𝑥 + 𝑏₂ */ func 連立1次方程式の解(a: Double, b: Double, c: Double, d: Double) -> (x: Double, y: Double) { let x = (-b + d)/(a - c) return (x: x, y: a*x + b) } func 2点を通る1次関数の係数(x1: Double, y1: Double, x2: Double, y2: Double) -> (a: Double, b: Double) { return ( a: (y2 - y1)/(x2 - x1), b: y1 - x1*(y2 - y1)/(x2 - x1) ) // x = a のような傾き ∞ (無限大)の場合は (a: Double.infinity, b: Double.infinity) が返る } func 2線分が平行か(p1: (x: Double, y: Double), p2: (x: Double, y: Double), p3: (x: Double, y: Double), p4: (x: Double, y: Double)) -> Bool { let (a1, b1) = 2点を通る1次関数の係数(x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y) let (a2, b2) = 2点を通る1次関数の係数(x1: p3.x, y1: p3.y, x2: p4.x, y2: p4.y) let (x, y) = 連立1次方程式の解(a: a1, b: b1, c: a2, d: b2) return x.isInfinite || y.isInfinite } func 多角形の線分に平行が存在するか(座標列: [(x: Double, y: Double)]) -> Bool { for i in 1...座標列.count { let 線分1 = (p1: 座標列[i-1], p2: 座標列[i%座標列.count]) for j in i...座標列.count { let 線分2 = (p1: 座標列[j-1], p2: 座標列[j%座標列.count]) if 2線分が平行か(p1: 線分1.p1, p2: 線分1.p2, p3: 線分2.p1, p4: 線分2.p2) { return true } } } return false } /*: #### 平面図形の面積 平面図形において、任意の多角形の面積は以下のルーチンで求めることができる 多角形を三角形に分割して、それらの面積を次々と足し合わせている */ func 多角形の面積(座標列: [(x: Double, y: Double)]) -> Double { var 面積 = 0.0 if let 最初の座標 = 座標列.first, let 最後の座標 = 座標列.last { 面積 = 最後の座標.x * 最初の座標.y / 2 - 最初の座標.x * 最後の座標.y / 2 for i in 1..<座標列.count { 面積 += 座標列[i - 1].x * 座標列[i].y / 2 - 座標列[i].x * 座標列[i - 1].y / 2 } } return 面積 // 左回りの多角形で正の値、右回りの多角形で負の値を返す } for 形 in [ [ (x: 0.0, y: 0.0), (x: 1.0, y: 0.0), (x: 0.0, y: 1.0), ], // 三角形 [ (x: 0.0, y: 0.0), (x: 1.0, y: 0.0), (x: 1.0, y: 1.0), (x: 0.0, y: 1.0), ], // 四角形 [ (x: 0.0, y: 0.0), (x: 1.0, y: 0.0), (x: 0.0, y: 1.0), ].reversed(), // 三角形 [ (x: 0.0, y: 0.0), (x: 1.0, y: 0.0), (x: 1.0, y: 1.0), (x: 0.0, y: 1.0), ].reversed(), // 四角形 ] { print(形, "面積: \(多角形の面積(座標列: 形))") } /*: #### 正多角形の座標 𝑛角形の正多角形の座標𝑖は、高校数学で習う sin, cos を用いて、以下のように表せられる 𝑥 = sin(2𝜋𝑖/𝑛), 𝑦 = -cos(2𝜋𝑖/𝑛) */ for n in [ 3, 4, 5, 6, 7, 8, 9, 10, 100, 1000, // 𝑟²𝜋(𝑟=1)=3.141592653589793... に近づく ] { // 正多角形の面積 var 形 = [(x: Double, y: Double)]() for i in 0..