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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

1691閲覧

Swift ER図を書きたいが、Sin線を使いたくない。

kevin.c.michael

総合スコア27

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

1クリップ

投稿2018/02/22 08:22

編集2018/02/22 08:25

こんにちは

swiftで下記のようなER図(ERD)を作ろうと考えています。
下図のERDは青ペンで囲った直線の部分が長いです。
そのため、赤ペンで囲ったカーブの部分は短いです。
これを作りたいです。

イメージ説明

UIBeizerpathを使ってテストしました。

初めはSinカーブを下記のコードで作って見ました。
すると下図のようになりました。
イメージ説明

swift

1//Sinカーブコード 2 3import UIKit 4 5class TestDraw: UIView { 6 let graphWidth: CGFloat = 1.0 7 let amplitude: CGFloat = 0.2 8 9 override func draw(_ rect: CGRect) { 10 let width = rect.width 11 let height = rect.height 12 13 let origin = CGPoint(x: width * (1 - graphWidth) / 2, y: height * 0.50) 14 15 let path = UIBezierPath() 16 path.move(to: origin) 17 18 for angle in stride(from: 5.0, through: 360.0, by: 5.0) { 19 let x = origin.x + CGFloat(angle/360.0) * width * graphWidth 20 let y = origin.y - CGFloat(sin(angle/180.0 * Double.pi)) * height * amplitude 21 path.addLine(to: CGPoint(x: x, y: y)) 22 } 23 24 UIColor.lightGray.setStroke() 25 path.lineWidth = 2.0 26 path.stroke() 27 } 28} 29 30

ん〜これだとどこの辺も必ず曲線を描いているので、少し違います。
また、カーブ部もとても大きいです。

そこで、第2の方法を考えました。

それは、カーブ部と直線部を分けて生成し、それぞれが繋がるように位置を調整する方法です。

カーブ部が2つ、直線部を1つ生成することになります。

この方法以外に解決方法はありませんでしょうか?

まだSwiftは経験が浅いので、もしかしたらもっと便利な関数があったりしないかな〜と思って質問しました。

「こんな考え方はどうだろー」などでも構いません!

何卒お願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

そんなに難しくありませんでした。

結果としてUIBezierPathを2回使うだけで実現できました。

1回目の下図の線が半分ずつ処理された構造になってます。

aPathYとbPathYに同じ数を掛ければ横幅を変えずにたての長さを調整できます。

swift

1class TestDraw: UIView { 2 override func draw(_ rect: CGRect) { 3 let aPathX = 50 4 let aPathY = 100 // * 2 5 let bPathX = 100 6 let bPathY = 200 // * 2 7 let xCurve = 20 8 let yCurve = 2 9 let path = UIBezierPath() 10 let apath = UIBezierPath() 11 path.move(to: CGPoint(x: 0, y: yCurve)) 12 apath.move(to: CGPoint(x: aPathX, y: aPathY)) 13 path.addCurve(to: CGPoint(x: aPathX, y: aPathY), controlPoint1: CGPoint(x: xCurve, y: yCurve), controlPoint2: CGPoint(x: xCurve, y: yCurve)) 14 apath.addCurve(to: CGPoint(x: bPathX, y: bPathY), controlPoint1: CGPoint(x: bPathX - xCurve, y: bPathY - yCurve), controlPoint2: CGPoint(x: bPathX - xCurve, y: bPathY - yCurve)) 15 path.lineWidth = 2.0 16 apath.lineWidth = 2.0 17 UIColor.lightGray.setStroke() 18 path.stroke() 19 apath.stroke() 20 } 21} 22

イメージ説明

投稿2018/02/22 12:36

編集2018/02/22 14:21
kevin.c.michael

総合スコア27

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

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

kevin.c.michael

2018/02/22 14:20

aPathYとbPathYに同じ数を掛ければ横幅を変えずにたての長さを調整できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問