伊藤  直子

伊藤 直子

1653467220

Swiftで自動三角法計算を行う方法

数学が好きな人はいません。それは事実です。では、それを私たちの生活から完全に排除するために何ができるでしょうか?いいえ、ロボットではありません。多分いつか私もそれらについて書くでしょう。知るか!しかし今のところ、関数と数式で解決する必要があります。

過去に電卓を離れる準備はできましたか?プロジェクトで三角法を簡単にする方法を見てみましょう。

原則

三角法にあまり詳しくない方のために、絶対的な自己中心のオタクのように、この他のチュートリアルから自分自身を引用させてください(実際には怠惰ですが):

基本的に、直角三角形では、少なくとも次の条件があれば、三角形の辺の長さを計算できます。
-1つの角度の角度(この場合、黄色で強調表示した角度)
とサイズ3つの側面のうちの1つ(この場合は青い点線)。
写真からわかるように、このロジックを中央のボタンの周りの見えない円に適用して、写真の数式でx値とy値を計算することにより、3つのボタン(緑)の位置を定義できます。

この理論は、円を含むすべてのアーキテクチャに役立ちます。たとえば、そのチュートリアルでは、円の中心を起点として画像内の緑色の点の位置を決定し、それらを3UIButton秒の位置の中心として使用できるようにする方法を説明していました。

三角法はそれを教えています:

  • sinθ=反対/斜辺
  • cosθ=隣接/斜辺
  • tanθ=反対側/隣接側

上の写真を見ると、「θ」は黄色の角度、「x」は隣接する辺、「y」は反対側になり、残りの辺、半径、斜辺になります。

角度の程度と3つの辺の少なくとも1つ(通常は斜辺)がすでにわかっていると仮定すると、式を逆にして残りの辺(通常はxとy)を見つけることができます。

数式を逆にするだけです。

y=sinθ*h

y=tanθ*x

x=cosθ*h

x =y/tanθ

h =x/cosθ

h =y/sinθ

そして、次の式を使用して、θをラジアン単位の度に置き換えます。

θ*π/180

ラジアンについて混乱していますか?私はここでそれについて何かを説明しました…そしてそれは私が約束する自己宣伝(しかし本当に省エネ)でそれです。

混乱しても心配しないでください。私が何をしているのかをある程度知っていることを証明するためにこれを説明する必要がありましたが、あなたはこれらすべてを理解する必要はありません。この関数はすべての計算を行うので、私が行ったようにこれらすべてを学ぶという苦痛を経験する必要はありません。後でありがとう。

見た目はよくなかったかもしれませんが、三角法を自動計算する関数が見つからなかったので、残念だと思いました。私はエネルギーを節約するもの(自分自身を引用するなど)が好きなので、それを書くことにしました!

完全なコードについては最後の部分にスキップしてください、しかしここに私の思考プロセスがあります:

セグメントと呼ばれる列挙を作成することから始めました。斜辺の場合はh、反対の場合はy、隣接する場合はxを値として使用します。

enum segment {case x
case y
case h}

次に、上記の式をSwift言語に翻訳しました。

y = tan(angle * .pi/180) * x
y = sin(angle * .pi/180) * h
x = cos(angle * .pi/180) * h
x = y / tan(angle * .pi/180)
h = x / cos(angle * .pi/180)
h = y / sin(angle * .pi/180)

関数に送信するパラメーターは次のとおりです。

  • segment、ここで、私が持っているセグメントがx、y、またはhのいずれであるかを定義します。
  • size、ここで、指定されたセグメントの長さを宣言します。
  • angle、これは私の角度の程度です。

関数はを返し[segment : CGFloat]ます。

switchステートメントを使用して、使用する数式を定義できます。

switch segment {
   case .x: (...)
   case .y: (...)
   case .h: (...)
}

これは完全なコードです:



enum segment {
    
    case x
    case y
    case h

}


class ViewController: UIViewController {

    // calculate trigonometry automatically using size of one segment and angle
    func calcTrig(segment: segment, size: CGFloat, angle: CGFloat) -> [segment : CGFloat] {
        
        switch segment {
            
            case .x:
                
                let x = size
                let y = tan(angle * .pi/180) * x
                let h = x / cos(angle * .pi/180)
                return [ .x : x, .y : y, .h : h ]
            
            case .y:
                
                let y = size
                let x = y / tan(angle * .pi/180)
                let h = y / sin(angle * .pi/180)
                return [ .x : x, .y : y, .h : h ]
            
            case .h:
            
                let h = size
                let x = cos(angle * .pi/180) * h
                let y = sin(angle * .pi/180) * h
                return [ .x : x, .y : y, .h : h ]
            
        }
        
    }
    

}

かなりきちんとしていますよね?それが機能するかどうか見てみましょう。

テスト

すべてをテストする必要があるので、この関数が実際に時間を節約する役割を果たし、コードを台無しにしないことを確認しましょう。

次のサイズの三角形があると仮定します。

  • x:10
  • y:10
  • h:14.14
  • 角度:45°

それをテストする必要があります:

  • 実行した場合calcTrig(segment: .x, size: 10, angle: 45)、または
  • 実行した場合calcTrig(segment: .y, size: 10, angle: 45)、または
  • 実行するとcalcTrig(segment: .h, size: 14.14, angle: 45)

結果はになります[.x: 10, .y: 10, .h: 14.14...]

9.99計算では、の代わりに同様の結果が得られる10か、14.14小数点以下2桁より長くなる可能性があるためround(CGFloat)、結果が少なくとも予想される数値と非常に類似していることをテストするために使用する必要があります。

これに似た単体テストを作成し、すべてのテストを実行します。



import XCTest
@testable import LightGame


var sut: ViewController!


class lightGameTests: XCTestCase {

    
    override func setUpWithError() throws {
        
        try super.setUpWithError()
        sut = ViewController()
        
    }

    
    override func tearDownWithError() throws {
        
        sut = nil
        try super.tearDownWithError()
    
    }

    
    func testAdjacent() throws {
        
        // 1 -
        let segments = sut.calcTrig(segment: .x, size: 10, angle: 45)
        
        // 2 -
        let y = round(segments[.y]!)
        let h = round(segments[.h]!)
        
        // 3 -
        XCTAssert(y==10)
        XCTAssert(h==14)
        
    }
    
    func testOpposite() throws {
        
        // 1 -
        let segments = sut.calcTrig(segment: .y, size: 10, angle: 45)
        
        // 2 -
        let x = round(segments[.x]!)
        let h = round(segments[.h]!)
        
        // 3 -
        XCTAssert(x==10)
        XCTAssert(h==14)
        
    }
    
    func testHypothenuse() throws {
        
        // 1 -
        let segments = sut.calcTrig(segment: .h, size: 14.14, angle: 45)
        
        // 2 -
        let x = round(segments[.x]!)
        let y = round(segments[.y]!)
        
        // 3 -
        XCTAssert(x==10)
        XCTAssert(y==10)
        
    }

}



テストが成功したら、おめでとうございます!あなたはあなたの将来の自己を多くの頭痛の種をうまく救いました。称賛!

ソース:https ://betterprogramming.pub/how-to-make-automatic-trigonometry-calculations-on-swift-e8a49f68879c

#swift 

What is GEEK

Buddha Community

Swiftで自動三角法計算を行う方法
伊藤  直子

伊藤 直子

1653467220

Swiftで自動三角法計算を行う方法

数学が好きな人はいません。それは事実です。では、それを私たちの生活から完全に排除するために何ができるでしょうか?いいえ、ロボットではありません。多分いつか私もそれらについて書くでしょう。知るか!しかし今のところ、関数と数式で解決する必要があります。

過去に電卓を離れる準備はできましたか?プロジェクトで三角法を簡単にする方法を見てみましょう。

原則

三角法にあまり詳しくない方のために、絶対的な自己中心のオタクのように、この他のチュートリアルから自分自身を引用させてください(実際には怠惰ですが):

基本的に、直角三角形では、少なくとも次の条件があれば、三角形の辺の長さを計算できます。
-1つの角度の角度(この場合、黄色で強調表示した角度)
とサイズ3つの側面のうちの1つ(この場合は青い点線)。
写真からわかるように、このロジックを中央のボタンの周りの見えない円に適用して、写真の数式でx値とy値を計算することにより、3つのボタン(緑)の位置を定義できます。

この理論は、円を含むすべてのアーキテクチャに役立ちます。たとえば、そのチュートリアルでは、円の中心を起点として画像内の緑色の点の位置を決定し、それらを3UIButton秒の位置の中心として使用できるようにする方法を説明していました。

三角法はそれを教えています:

  • sinθ=反対/斜辺
  • cosθ=隣接/斜辺
  • tanθ=反対側/隣接側

上の写真を見ると、「θ」は黄色の角度、「x」は隣接する辺、「y」は反対側になり、残りの辺、半径、斜辺になります。

角度の程度と3つの辺の少なくとも1つ(通常は斜辺)がすでにわかっていると仮定すると、式を逆にして残りの辺(通常はxとy)を見つけることができます。

数式を逆にするだけです。

y=sinθ*h

y=tanθ*x

x=cosθ*h

x =y/tanθ

h =x/cosθ

h =y/sinθ

そして、次の式を使用して、θをラジアン単位の度に置き換えます。

θ*π/180

ラジアンについて混乱していますか?私はここでそれについて何かを説明しました…そしてそれは私が約束する自己宣伝(しかし本当に省エネ)でそれです。

混乱しても心配しないでください。私が何をしているのかをある程度知っていることを証明するためにこれを説明する必要がありましたが、あなたはこれらすべてを理解する必要はありません。この関数はすべての計算を行うので、私が行ったようにこれらすべてを学ぶという苦痛を経験する必要はありません。後でありがとう。

見た目はよくなかったかもしれませんが、三角法を自動計算する関数が見つからなかったので、残念だと思いました。私はエネルギーを節約するもの(自分自身を引用するなど)が好きなので、それを書くことにしました!

完全なコードについては最後の部分にスキップしてください、しかしここに私の思考プロセスがあります:

セグメントと呼ばれる列挙を作成することから始めました。斜辺の場合はh、反対の場合はy、隣接する場合はxを値として使用します。

enum segment {case x
case y
case h}

次に、上記の式をSwift言語に翻訳しました。

y = tan(angle * .pi/180) * x
y = sin(angle * .pi/180) * h
x = cos(angle * .pi/180) * h
x = y / tan(angle * .pi/180)
h = x / cos(angle * .pi/180)
h = y / sin(angle * .pi/180)

関数に送信するパラメーターは次のとおりです。

  • segment、ここで、私が持っているセグメントがx、y、またはhのいずれであるかを定義します。
  • size、ここで、指定されたセグメントの長さを宣言します。
  • angle、これは私の角度の程度です。

関数はを返し[segment : CGFloat]ます。

switchステートメントを使用して、使用する数式を定義できます。

switch segment {
   case .x: (...)
   case .y: (...)
   case .h: (...)
}

これは完全なコードです:



enum segment {
    
    case x
    case y
    case h

}


class ViewController: UIViewController {

    // calculate trigonometry automatically using size of one segment and angle
    func calcTrig(segment: segment, size: CGFloat, angle: CGFloat) -> [segment : CGFloat] {
        
        switch segment {
            
            case .x:
                
                let x = size
                let y = tan(angle * .pi/180) * x
                let h = x / cos(angle * .pi/180)
                return [ .x : x, .y : y, .h : h ]
            
            case .y:
                
                let y = size
                let x = y / tan(angle * .pi/180)
                let h = y / sin(angle * .pi/180)
                return [ .x : x, .y : y, .h : h ]
            
            case .h:
            
                let h = size
                let x = cos(angle * .pi/180) * h
                let y = sin(angle * .pi/180) * h
                return [ .x : x, .y : y, .h : h ]
            
        }
        
    }
    

}

かなりきちんとしていますよね?それが機能するかどうか見てみましょう。

テスト

すべてをテストする必要があるので、この関数が実際に時間を節約する役割を果たし、コードを台無しにしないことを確認しましょう。

次のサイズの三角形があると仮定します。

  • x:10
  • y:10
  • h:14.14
  • 角度:45°

それをテストする必要があります:

  • 実行した場合calcTrig(segment: .x, size: 10, angle: 45)、または
  • 実行した場合calcTrig(segment: .y, size: 10, angle: 45)、または
  • 実行するとcalcTrig(segment: .h, size: 14.14, angle: 45)

結果はになります[.x: 10, .y: 10, .h: 14.14...]

9.99計算では、の代わりに同様の結果が得られる10か、14.14小数点以下2桁より長くなる可能性があるためround(CGFloat)、結果が少なくとも予想される数値と非常に類似していることをテストするために使用する必要があります。

これに似た単体テストを作成し、すべてのテストを実行します。



import XCTest
@testable import LightGame


var sut: ViewController!


class lightGameTests: XCTestCase {

    
    override func setUpWithError() throws {
        
        try super.setUpWithError()
        sut = ViewController()
        
    }

    
    override func tearDownWithError() throws {
        
        sut = nil
        try super.tearDownWithError()
    
    }

    
    func testAdjacent() throws {
        
        // 1 -
        let segments = sut.calcTrig(segment: .x, size: 10, angle: 45)
        
        // 2 -
        let y = round(segments[.y]!)
        let h = round(segments[.h]!)
        
        // 3 -
        XCTAssert(y==10)
        XCTAssert(h==14)
        
    }
    
    func testOpposite() throws {
        
        // 1 -
        let segments = sut.calcTrig(segment: .y, size: 10, angle: 45)
        
        // 2 -
        let x = round(segments[.x]!)
        let h = round(segments[.h]!)
        
        // 3 -
        XCTAssert(x==10)
        XCTAssert(h==14)
        
    }
    
    func testHypothenuse() throws {
        
        // 1 -
        let segments = sut.calcTrig(segment: .h, size: 14.14, angle: 45)
        
        // 2 -
        let x = round(segments[.x]!)
        let y = round(segments[.y]!)
        
        // 3 -
        XCTAssert(x==10)
        XCTAssert(y==10)
        
    }

}



テストが成功したら、おめでとうございます!あなたはあなたの将来の自己を多くの頭痛の種をうまく救いました。称賛!

ソース:https ://betterprogramming.pub/how-to-make-automatic-trigonometry-calculations-on-swift-e8a49f68879c

#swift