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

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

新規登録して質問してみよう
ただいま回答率
85.36%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

4回答

10808閲覧

描画した線を平行移動させたい

fender0131

総合スコア121

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

1グッド

2クリップ

投稿2016/03/25 02:51

編集2016/03/25 09:41

いつも大変お世話になっております。

描画した線を平行移動したいのですが、何かいい方法等御座いますでしょうか?

picturebox上にdrawlineを使用し、線を引きました。
線の長さは、始点(300,300)終点(700,500)を結んだものとなります。

平行移動の幅は、テキストボックスの値を持ってくるようにしたいと考えております。
この例では、ユーザーが100と打ち込んだものとします。

この際、平行移動した線の始点終点の座標を知りたいのですが、いい考えが思いつきませんでした。

お手数おかけして申し訳ございませんが、どなた様かご指導ご鞭撻の程よろしくお願い致します。

一応自分の考えも簡単に提示させて頂きます。

① 直線の長さ = √(700 - 300)^2 + (500 - 300)^2
② 始点から平行移動後の終点の長さ = √直線の長さ^2 + 100^2

②を元にsinΘ・cosΘ 等を使用し、平行移動後の座標を出してみました。

しかし、角度が変わったりすると、平行移動がおかしくなってしまい、直そうと思っても、プログラム自体が計算式だらけで、手が施せないようなものになってしまいました・・・

イメージ説明

イメージ説明

lib👍を押しています

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

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

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

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

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

yuba

2016/03/25 03:23

図には黄色い線が一本だけ引かれていますが、おかしいです。赤い線分と「100」という移動距離が与えられたら、移動後の線分の候補は二通りあるはずです。なぜ黄色い線分が一本しかないのか、もし決定的に動作させたいなら、元の線分の「どっち側か」をユーザーはどう指定すれば良いのか、まずそこからではありませんか。
fender0131

2016/03/25 04:00

質問に不備がありました。 申し訳ございません。 方向を選択する項目もあると考えて頂いて差し使いありません。 今回の場合は、線の上側に出すようにユーザーが選択したという過程です。
yuba

2016/03/25 04:20

もし赤線が垂直だった場合には、ユーザーはなんと指示することになるでしょうか? (上・下の選択肢では指示しきれないということです)
fender0131

2016/03/25 04:25

例えば、平行移動幅を入力後、pictureboxをクリックすることで、方向を教えてもらおうかと思っております。 (上の画像の例ですと、赤線の下側をクリック、もしくは上側をクリックで、平行線を引く方向を決めてもらう)
yuba

2016/03/25 04:50

なるほど。それならなんとかなると思います。やはり、使うのはベクトルです。
fender0131

2016/03/25 05:55

お答えありがとうございます。 大変申し訳ないのですが、ベクトルの計算方法がいまいちわからずにいます。 調べているものの、わからないので三平方の定理で計算してしまう私がいます・・・。 もしよろしければさわりだけでもいいので、ご指導ご鞭撻頂けないでしょうか?
yuba

2016/03/25 06:33

今夜にでも。
fender0131

2016/03/25 06:38

申し訳ないです。 お時間ある時で構いませんので、お力を貸して頂けると幸いです。
guest

回答4

0

こんにちは。

ベクトルが苦手ということですので、ちょっとアイデアを。
(図形を操作する時ベクトルは非常に便利ですので、ベクトルの考え方自体は避けて通らない方が良いと思います。)

線分ABとx軸生方向とのなす角をθとし、線分ACととx軸生方向とのなす角をθ'とし、点Aの座標を(Xa, Ya)、点Cの座標を(Xc, Yc)とし、線分ACの長さをdとすると、点Cの座標は下記式で計算できますね。

Xc = Xa + d sinθ'
Yc = Ya + d cosθ'

習った公式に下記があります。

sin(θ+90度)=cosθ
cos(θ+90度)=-sinθ

そして、θ'=θ+90度ですので、下記となります。

Xc = Xa + d cosθ
Yc = Ya - d sinθ

sinθとcosθの値は線分ABから四則演算と平方根で求めることが出来ますので、四則演算と平方根のみでXc, Ycを求めることができます。同様に点Dの座標も計算できます。
tanθを求めませんので、線分ABの長さが0でない限り0除算も発生しないはずです。

投稿2016/03/26 00:22

編集2016/03/26 00:31
Chironian

総合スコア23272

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

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

fender0131

2016/03/28 02:09

お返事遅くなり申し訳ございませんでした。 いつもお答えありがとうございます。 高校時代、ベクトル習っているはずなのですが、すっかり抜け落ちてしまっていますね(^^;) この方法で自分も始めに考えていました。 公式等添付して頂きありがとうございました。 大変助かりました。 参考にさせて頂きます。
guest

0

ベストアンサー

「どっち側」の話からつらつら書いていきます。クリックしたときに、その座標から「線のどっち側」をどう決定してどう表現するかです。

まず元の線分ABを、始点AとベクトルABの組み合わせと考えましょう。すると「どっち側」はこう表現できます。「Aから見て、クリックした点はAB方向の右側にあるか、左側にあるか」のことであると。
右か左か、簡単に求まるでしょうか? ——簡単です。ベクトルの外積を使います。

クリックした点をPとしましょう。AからみたPの方向と距離、つまりベクトルAPですね、これとABとの関係を求めるのに、外積AB×APをとります。
2次元ベクトルの外積ってのは数値で、

  • 求め方は、(x,y)×(u,v) = xv - uy です。
  • その値は、長さ同士の積にsinθをかけたものになります。

何が起こるかというと、PがAB方向の左側にあるなら正の数に、右側にあるなら負の数になるのです。はい左右判定完了。

次。この右側か左側かを利用して、Aの移動先を求めます。
左側に移動する場合を考えましょう。
ベクトルABを左に90度回転させてから長さを100に整えればAの移動先へのベクトルになります。

90度回転させる。回転行列ですね。TeX記法なしで行列書くのがいやなので結果だけ書いてしまうと、(x,y)を左に90度回転させたら(-y, x)になります。ちなみに右に90度回転させたら(y, -x)。

長さを100に整えるには。これは単純に、ABの長さdを√(x2+y2)で求めてから、xとyそれぞれに(100/d)をかけてあげるだけですね。

これでほら、Aから移動先へのベクトルが求まりました。Aの座標と足し合わせればA’の座標です。それにABを足し合わせればB'の座標です。

投稿2016/03/25 14:54

yuba

総合スコア5570

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

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

fender0131

2016/03/28 02:03

お返事遅くなり大変申し訳ございませんでした。 大変わかりやすいご説明ありがとうございます。 手順の流れが分かりやすく、プログラムを組む上で大変助かっております。 現在皆様のアドバイスを元にプログラム着手しております。
fender0131

2016/03/29 01:43

皆様のアドバイスのおかげで何とか形にすることができました。 手取り足取り教えて頂きありがとうございました。
guest

0

高度計算サイトを知っておりますでしょうか?
すごく便利です。とにかく役に立ちます。
ただし、使えるかどうかは、見る人次第。

平行移動ですね。 始点、終点が 両方?は、計算では出せないと思います。(無限にあるので)
平行移動のグラフです。始点終点はありません。
他に、垂直に平行移動、垂直という条件の定義が必要です。
または、オフセットといいます。

回答に程遠いですが、自分でも気づかぬ、情報の抜けの問題もあります。
これって出題者の引っ掛け問題かな

追記
二線の交差する点を検出これで点がわかります。

いやー難しいですね。あとちょっとだと思ったんですが、先に答えがわかるツールを見つけました。
検算用サイト

投稿2016/03/25 06:39

編集2016/03/25 09:32
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fender0131

2016/03/25 06:56

お答えありがとうございます。 何度かそのサイトにはお世話になっております。 添付ありがとうございます。 引っ掛けているつもりはないのですが、何かいい方法がないかと思い質問させて頂きました。
退会済みユーザー

退会済みユーザー

2016/03/25 06:58

平行移動のグラフのサイトを追記しました。おそらく b=の数を変更したのが平行移動です。問題は、始点と終点ですね。
fender0131

2016/03/25 07:05

平行移動のグラフのサイト大変参考になりました。 ありがとうございます。 始点終点なんですよね・・・
退会済みユーザー

退会済みユーザー

2016/03/25 07:13

二線の交差する点を検出のリンクを追記しました。 さーて、だんだん 迫ってきましたよ。
fender0131

2016/03/25 07:23

わざわざリンクまで張って頂いて申し訳ないです。 確かにこれで求めることができそうですね! ちょっと計算できるか確かめてみます!
退会済みユーザー

退会済みユーザー

2016/03/25 09:32

計算方法がわかないが、結果がわかるかもしれないサイトを見つけましたので、追記します。
fender0131

2016/03/25 10:08

ありがとうございます。 参考にさせて頂きます。
guest

0

イメージ説明

(ベクトルは太字で書きます。)

既知なのは
a=(300,300),b=(700,500),およびdの長さ(=100)、
知りたいのは
a'(=a+d),b'(=b+d)ですね。
a,bは既知なので、dを求めればいいことになります。
(これすら腑に落ちない場合は言ってください。)

まず、元の直線に垂直なベクトルc⊥を算出します。
これはc(=b-a)に垂直なベクトルです。
(2つ方向の候補がありますが目的にあっているものを選んでください)
cのx成分とy成分を入れ替えてどちらかの成分を−1倍するのが一番手軽ですね

dは、c⊥と同じ向きで、長さが100のものです。
従ってdは、c⊥c⊥の長さで割って、(=長さを1にして)100倍したものです:
d = 100 * c⊥/|c⊥|

dが求まったので、a',**b'**が求まります。


前提知識

点V (x,y) の位置ベクトルをv = (x,y)などと書きます。
原点をO (0,0)とすれば→OV = (x,y)などとも書きます。

v1 = (x1, y1)
v2 = (x2, y2)のとき
v1 + v2 = (x1+x2, y1+y2)です。

v = (x,y)の長さを|v|などと表し、
|v| = √(x^2 + y^2)です。

v=(x,y)を定数c倍したものは
c * v = (c * x , c * y)

投稿2016/03/25 03:07

編集2016/03/25 10:49
ozwk

総合スコア13551

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

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

fender0131

2016/03/25 05:54

お答えありがとうございます。 大変申し訳ないのですが、ベクトルの計算方法がいまいちわからずにいます。 調べているものの、わからないので三平方の定理で計算してしまう私がいます・・・。 もしよろしければさわりだけでもいいので、ご指導ご鞭撻頂けないでしょうか?
ozwk

2016/03/25 06:07

計算方法もなにも、ベクトル同士の加減算と、ベクトルの定数倍ぐらいしか使わないのですが・・・ 例えば具体的に回答のどのステップがわかりませんか?
fender0131

2016/03/25 06:30

お答えありがとうございます。 正直に申し上げますと、ベクトルが何なのかよく理解していないレベルなので、始めのステップからわかっておりません・・・ 元の直線に垂直な単位ベクトルを算出とありますが、これはどういうことでしょうか? ↑画像のことであっていますでしょうか?
ozwk

2016/03/25 06:37 編集

> ベクトルが何なのかよく理解していないレベル 高校向け数学の参考書を買うといいと思います。 > ↑画像のことであっていますでしょうか? あってます。
fender0131

2016/03/25 06:48

お答えありがとうございます。 あっていてよかったです。 ↑の画像を再度更新しました。 ということは、A(?,?)を基準とし、平行移動(?)すると赤線、 平行移動(? + 100)が黄線となるという考え方でしょうか? これらを求める公式等があるということでしょうか?
ozwk

2016/03/25 06:56

そういう認識でしたら 垂直な単位ベクトル云々の時点からあってないです。
fender0131

2016/03/25 07:01

そうなんですよね・・・ きづいてはいるのですが、この考えから抜けられないのですよね・・・
fender0131

2016/03/25 08:31

編集かけて頂きありがとうございます!! 参考にさせて頂いており、少し考えておりますので、少々お待ちいただいてもよろしいでしょうか? 再度質問してしまうと思いますが、よろしくお願い致します。
fender0131

2016/03/25 09:35 編集

質問宜しいでしょうか? 上の画像を更新しました。 ozwk様の画像を参考に編集してみました。 > dは、c⊥と同じ向きで、長さが100のものです。 その通りです。ここまで把握できました。 > 従ってdは、c⊥をc⊥の長さで割って、(=長さを1にして)100倍したものです: > d = 100 * c⊥/|c⊥| この式の意味合いが少しわかりませんでした。 |c⊥|というのは、自身で設定した長さという解釈でよろしいでしょうか? 見当違いな答えをしていたら申し訳ございません。 よろしくお願い致します。
ozwk

2016/03/25 09:36

別にc⊥でもhでもFooでもなんでもよかったのですが、「cに垂直」という意味合いで「c⊥」と書きました ただの名前です。
fender0131

2016/03/25 10:06 編集

お答えありがとうございます。 ごめんなさい。また画像更新させて頂きました。
ozwk

2016/03/25 09:56 編集

cに垂直なベクトル「Hoge」を使って、 d=100*Hoge/(Hogeの長さ)と計算できますよということです。
fender0131

2016/03/25 09:51

Cに垂直時、d = 100 * 1 = 100 ということで解釈宜しいでしょうか?
fender0131

2016/03/25 10:04

ベクトルについて多少理解を深めることができました。 ありがとうございます。 ただ、折角ここまでお付き合いいただいているのですが、肝心のC(?,?)とD(?,?)の座標が分からずにいます・・・申し訳ないです。 求め方としては、結局どのようにベクトルを組合すことで、求められるのでしょうか?
ozwk

2016/03/25 10:24

ご自身の図で→OC = →OA + →ACと書いているのに わからないというのも不思議な話ですが?
fender0131

2016/03/25 10:37

ベクトルの表記上、→OC = →OA + →ACというのはわかるので、表記しました。 問題点 ・→OC = →OA + →AC のC座標が分からないので、長さを出すことができない。 ・Cの座標の出し方が分からない。 といった現状です。
ozwk

2016/03/25 10:50

ベクトルについて調べて入るということですが、 念のためベクトルの基本的なことを追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問