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

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

ただいまの
回答率

90.47%

  • C#

    7444questions

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

  • Visual Studio 2013

    309questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,679

fender0131

score 113

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

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

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

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

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

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

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

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

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

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

イメージ説明

イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fender0131

    2016/03/25 14:55

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

    キャンセル

  • yuba

    2016/03/25 15:33

    今夜にでも。

    キャンセル

  • fender0131

    2016/03/25 15:38

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

    キャンセル

回答 4

checkベストアンサー

+1

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

まず元の線分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/28 11:03

    お返事遅くなり大変申し訳ございませんでした。
    大変わかりやすいご説明ありがとうございます。

    手順の流れが分かりやすく、プログラムを組む上で大変助かっております。
    現在皆様のアドバイスを元にプログラム着手しております。

    キャンセル

  • 2016/03/29 10:43

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

    キャンセル

+1

こんにちは。

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

線分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/28 11:09

    お返事遅くなり申し訳ございませんでした。
    いつもお答えありがとうございます。

    高校時代、ベクトル習っているはずなのですが、すっかり抜け落ちてしまっていますね(^^;)

    この方法で自分も始めに考えていました。
    公式等添付して頂きありがとうございました。
    大変助かりました。
    参考にさせて頂きます。

    キャンセル

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 14:54

    お答えありがとうございます。

    大変申し訳ないのですが、ベクトルの計算方法がいまいちわからずにいます。
    調べているものの、わからないので三平方の定理で計算してしまう私がいます・・・。

    もしよろしければさわりだけでもいいので、ご指導ご鞭撻頂けないでしょうか?

    キャンセル

  • 2016/03/25 15:07

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

    キャンセル

  • 2016/03/25 15:30

    お答えありがとうございます。

    正直に申し上げますと、ベクトルが何なのかよく理解していないレベルなので、始めのステップからわかっておりません・・・

    元の直線に垂直な単位ベクトルを算出とありますが、これはどういうことでしょうか?
    ↑画像のことであっていますでしょうか?

    キャンセル

  • 2016/03/25 15:33 編集

    > ベクトルが何なのかよく理解していないレベル
    高校向け数学の参考書を買うといいと思います。

    > ↑画像のことであっていますでしょうか?
    あってます。

    キャンセル

  • 2016/03/25 15:48

    お答えありがとうございます。
    あっていてよかったです。

    ↑の画像を再度更新しました。

    ということは、A(?,?)を基準とし、平行移動(?)すると赤線、
    平行移動(? + 100)が黄線となるという考え方でしょうか?

    これらを求める公式等があるということでしょうか?

    キャンセル

  • 2016/03/25 15:56

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

    キャンセル

  • 2016/03/25 16:01

    そうなんですよね・・・

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

    キャンセル

  • 2016/03/25 17:31

    編集かけて頂きありがとうございます!!

    参考にさせて頂いており、少し考えておりますので、少々お待ちいただいてもよろしいでしょうか?

    再度質問してしまうと思いますが、よろしくお願い致します。

    キャンセル

  • 2016/03/25 18:10 編集

    質問宜しいでしょうか?
    上の画像を更新しました。
    ozwk様の画像を参考に編集してみました。

    > dは、c⊥と同じ向きで、長さが100のものです。
    その通りです。ここまで把握できました。

    > 従ってdは、c⊥をc⊥の長さで割って、(=長さを1にして)100倍したものです:
    > d = 100 * c⊥/|c⊥|
    この式の意味合いが少しわかりませんでした。
    |c⊥|というのは、自身で設定した長さという解釈でよろしいでしょうか?
    見当違いな答えをしていたら申し訳ございません。

    よろしくお願い致します。

    キャンセル

  • 2016/03/25 18:36

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

    キャンセル

  • 2016/03/25 18:43 編集

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

    キャンセル

  • 2016/03/25 18:50 編集

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

    キャンセル

  • 2016/03/25 18:51

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

    キャンセル

  • 2016/03/25 19:04

    ベクトルについて多少理解を深めることができました。
    ありがとうございます。

    ただ、折角ここまでお付き合いいただいているのですが、肝心のC(?,?)とD(?,?)の座標が分からずにいます・・・申し訳ないです。

    求め方としては、結局どのようにベクトルを組合すことで、求められるのでしょうか?

    キャンセル

  • 2016/03/25 19:24

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

    キャンセル

  • 2016/03/25 19:37

    ベクトルの表記上、→OC = →OA + →ACというのはわかるので、表記しました。

    問題点
    ・→OC = →OA + →AC のC座標が分からないので、長さを出すことができない。
    ・Cの座標の出し方が分からない。

    といった現状です。

    キャンセル

  • 2016/03/25 19:50

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

    キャンセル

0

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/25 15:56

    お答えありがとうございます。

    何度かそのサイトにはお世話になっております。
    添付ありがとうございます。

    引っ掛けているつもりはないのですが、何かいい方法がないかと思い質問させて頂きました。


    キャンセル

  • 2016/03/25 15:58

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

    キャンセル

  • 2016/03/25 16:05

    平行移動のグラフのサイト大変参考になりました。
    ありがとうございます。

    始点終点なんですよね・・・

    キャンセル

  • 2016/03/25 16:13

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

    キャンセル

  • 2016/03/25 16:23

    わざわざリンクまで張って頂いて申し訳ないです。

    確かにこれで求めることができそうですね!
    ちょっと計算できるか確かめてみます!

    キャンセル

  • 2016/03/25 18:32

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

    キャンセル

  • 2016/03/25 19:08

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

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7444questions

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

  • Visual Studio 2013

    309questions

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