ほぼ数学の問題のようになってますが、回答をお願いします。
私の書いたコードでは、タップした座標点、角度、原点との距離などを計算して画像内の薄い紫色の直線上にUIBezierPathを描画していくものを書いたつもりだったのですが、自分の計算式が間違えているようなので、どうすれば画像のような理想的な位置に直線を描くことができるのか教えてください。
画像内で出ている変数等は全てコードに書きました。
swift
1 2func drawing(){ 3 4 let a_x:Double! = Double(currentLocation.x) //パンドラッグ中に取得できるタップ位置X(pan changed) 5 let a_y:Double! = Double(currentLocation.y) //パンドラッグ中に取得できるタップ位置Y(pan changed) 6 let p_x:Double! = Double(previousLocation.x) //パン開始時に取得できるタップ位置X(pan began) 7 let p_y:Double! = Double(previousLocation.y) //パン開始時に取得できるタップ位置Y(pan began) 8 let o_x:Double! = Double(objectLocation.x) //図形の中心位置X 9 let o_y:Double! = Double(objectLocation.y) //図形の中心位置Y 10 var x_r:Double! = 0 //パン開始時の図形とタップ位置の距離 11 var y_r:Double! = 0 //ドラッグ時の図形とタップ位置の距離 12 let o_θ:Double! = Double(object_Rotate) //角度 13 var x_x:Double! = 0 //path.move関数の位置X 14 var x_y:Double! = 0 //path.move関数の位置Y 15 var y_x:Double! = 0 //path.addLine関数の位置X 16 var y_y:Double! = 0 //path.addLine関数の位置Y 17 18 x_r = sqrt(pow((p_x - o_x), 2.0) + pow((p_y - o_y), 2.0)) //パン開始時の図形とタップ位置との距離を算出 19 x_y = sin(o_θ) * x_r //三角関数を用いた描画位置Y 20 x_x = cos(o_θ) * x_r //三角関数を用いた描画位置X 21 22 y_r = sqrt(pow((a_x - o_x), 2.0) + pow((a_y - o_y), 2.0)) //ドラッグ時の図形とタップ位置との距離を算出 23 y_y = sin(o_θ) * y_r 24 y_x = cos(o_θ) * y_r 25 26 let path: UIBezierPath = UIBezierPath() 27 28 path.move(to: CGPoint.init(x: x_x + o_x, y: x_y + o_y)) //描画 29 path.addLine(to: CGPoint.init(x: y_x + o_x, y: y_y + o_y)) //描画 30 let layer = CAShapeLayer() 31 32 layer.strokeColor = UIColor.orange.cgColor 33 layer.fillColor = UIColor.clear.cgColor 34 35 layer.addSublayer(layer) 36 37 setNeedsDisplay() 38}
-2018 5 /7 16:39 追記-
現状描画自体は正常に動作しています。
計算が違うようなのですが、現在どういう動作をしているのかを載せていませんでした。
具体的には下記画像のような状態です。
画像内では2パターン動作をテストしています。(青と赤)
どちらも角度だけは変えていません。
しかし、初期タップ位置と原点との距離に応じて、描画される線と原点との距離が比例して離れてしまいます。
(また、画像内の角度については弧度法(π)での値に直しています。degreeと書いてありますが、radianです。)
回答2件
あなたの回答
tips
プレビュー