質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

143閲覧

再帰関数のTreeのY座標の指定方法

harumi

総合スコア407

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/01/15 10:52

### 問題点
UISliderを使って再帰関数のTreeを作ってみたいと思ったのですが、Y座標の指定方法がうまく設定できず綺麗な木にすることができません、

###コード
drawTreeというメソッドを再帰関数にして指定回数分回してUISliderの位置を変更するようにしています。

Swift

1class ViewController: UIViewController { 2 3 var rotate = CGAffineTransform() 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 drawTree(branchSize: CGPoint(x: 100, y:20), 8 root:CGPoint(x: 0, y: self.view.frame.height/2), 9 repeatNum: 7, angle: 0) 10 } 11 12 func drawTree(branchSize:CGPoint,root: CGPoint, repeatNum: Int, angle: CGFloat){ 13 rotate = CGAffineTransform(rotationAngle: angle * CGFloat.pi/180) 14 15 let branch = UISlider(frame: CGRect(x:root.x, y:root.y, width:branchSize.x,height:branchSize.y)) 16 branch.transform = rotate 17 self.view.addSubview(branch) 18 if repeatNum > 1 { 19 let nextX = branchSize.x * 0.8 20 drawTree(branchSize: CGPoint(x: nextX, y: branchSize.y), 21 root: CGPoint(x: branch.layer.position.x + branch.frame.width/2,y: branch.layer.position.y + branch.frame.height/2), 22 repeatNum: repeatNum - 1, angle: angle+10) 23// drawTree(branchSize: CGPoint(x: nextX, y: branchSize.y), 24// root: CGPoint(x: branch.layer.position.x + branch.frame.width/2,y: branch.layer.position.y + branch.frame.height/2 - angle), 25// repeatNum: repeatNum - 1, angle: (angle+10) * -1) 26 } 27 } 28}

コードどうりに2つ目の関数呼び出しをコメントアウトした状態で実行するとこのように表示されます。
この枝をうまく反対側にも反転させていきたいと考えています。
イメージ説明


コメントアウトを解除して、1つ目の呼び出しのRootのYにangleを足したところ画像のようになってしまいY座標の位置がずれて綺麗な木を作ることができませんでした。
どのようにY座標を指定すれば良いのでしょうか?
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/01/16 01:38

再帰については理解されていますか? Switchの表示数については疑問を抱いていないのでしょうか?
harumi

2019/01/16 03:30

表示数は間違っていないと思っていたのですが間違っていますでしょうか?
fuzzball

2019/01/16 03:47

反対側に表示させるだけなら単純に二倍になるのかなと思ったのですが、二枚目の画像では数が膨大になっていますよね。他の条件などを変えているのでしょうか?
harumi

2019/01/16 10:36

drawTreeメソッドの中で2回drawTreeメソッドを読んでいるので枝が移動するごとに2倍メソッドが再帰で呼ばれて増えていると思っていました。間違っていたらすみません ソースコードはコメントアウトを外したのともともと呼び出していたメソッドの引数rootのyにangleを足しました。
fuzzball

2019/01/17 00:09

あぁ、理解しました。再帰関数の中で二回呼んでいるとは思っていませんでした。 ちゃんとコード見てなかったのですみません。 ただ、「反対側に表示させる」ということであれば、外部から再帰関数を二回呼ぶのではないでしょうか? 現在のように大量のSwitchが表示されるのが正しいのだとしたら、それは「反対側に表示させる」だけではないと思います。
guest

回答1

0

いきなりUISliderでやろうとしている事に無理を感じます。

まずはカスタムUIViewのfunc draw(_ rect: CGRect)関数内でCoreGraphicsを使った木の描画をやってみてはいかがでしょう。

投稿2019/01/16 01:34

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

harumi

2019/01/16 10:36

ありがとうございます試してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問