[[20160307122354]] 『座標計算』(ゆき) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『座標計算』(ゆき)

 任意の点P(x1,y1)と任意の点Q(x2,y2)を結んだ線分PQより
 点Qの垂線(長さ10)の点A(x3,y3)とその反対側の垂線(長さ10)の
 点B(x4,y4)の座標を取るマクロを作成したいのですが、
 数学の知識に乏しくどのような式にしていいかわかりません。
 どなたかご教示いただけないでしょうか?

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 To ゆきさん

 参考資料です。
 垂線の足を行列式で解く方法、直交座標を極座標に変換して解く方法です。
 マクロは一切使っていません。
 ずいぶん、前に作成したので詳細は忘れましたが、

 垂線の足.xls(ダウンロードパスワード:abc)
 http://ww10.puny.jp/uploader/download/1457325299.zip

 マクロ作成はエキスパートさんに任せます。
(マリオ) 2016/03/07(月) 13:40

 難しく考えすぎました。すいません。上の記事は忘れてください。

 点(X3,Y3)から直線ax+by+c=0への垂線の長さ(L)は、

 L=|a*x3+b*Y3+c|  /  √(a^2+b^2)

 直線の式のa,b,cをP(x1,y1)と任意の点Q(x2,y2)から、求める。
 ax+by+c=0の式は、y=mx+b(mは傾き、bは切片)の変形型。

 この数式を使って、マクロを組めばいいかな(^^♪
(マリオ) 2016/03/07(月) 14:14

 マリオさんコメントありがとうございます。

 仮に…点P(-3,1)、点Q(2,-4)としたとき、
 傾きは (Y2 - Y1) / (X2 - X1) つまり -1
 切片は -傾き * X1 + Y1 で -2
 式としては y = - x - 2
 変形して x - y - 2 = 0 
 a=1、b=-1、c=2
 ということですね。

 今回はL=10で点A(x3,y3)、点B(x4,y4)を求めたいのですが、
 ここからがよくわからないです。

(ゆき) 2016/03/07(月) 14:42


  y = - x - 2
 までOKで、両辺に (x + 2)を足すと、
 y + (x + 2) = - x - 2 + (x + 2)になるから、
 y + x + 2 = 0

 整理して、
 x + y + 2 = 0
 となって、 
 a=1、b=1、c=2ですよね。

(マリオ) 2016/03/07(月) 15:52


 とりあえず、Bは除外して、P,Q,Aだけで考える。

 点AはQを通り、かつ、直線PQに垂直なのだから、

 (直線AQの傾き)×(直線PQの傾き)= -1
 になる。これ重要です。

 直線PQはy=mx+nとしましたね。
 なので、直線AQは、y=-(1/m)x + pで表せる【-(1/m)が傾き、pが切片】
(マリオ) 2016/03/07(月) 16:10

 mは、-1でしたので、
 直線AQは、y = 1 * x +p で表せて、Q(2,-4)を代入して、
 -4 = 1 * 2 + p
 両辺に2を引いて、
 -4+(-2)= 1 * 2 + p +(-2)
 -6 = p
 p = -6

 ★★★最終的に、直線AQは y = x -6で表せる
 この式は、変数が2つある(xとy)から、
 この式だけではAの座標を求めることができない。

 もう一つの式が次の式になる。
 ★★★L=|a*x3+b*Y3+c|  /  √(a^2+b^2)
(マリオ) 2016/03/07(月) 16:36

 点A(x3,y3)について
   x3=x2+L/√(m^2+1) → 9.07106
   y3=m*(x2+L/√(m^2+1))+p → -5.07106

 点B(x4,y4)について
   x4=x2-L/√(m^2+1) → 7.07106
   y4=m*(x2-L/√(m^2+1))+p → -7.07106

 であっていますでしょうか_?
(ゆき) 2016/03/07(月) 16:54

 間違っていると思います。

 ★★★L=|a*x3+b*Y3+c|  /  √(a^2+b^2)の式は、
 x3,Y3はx,yと読み替えて、
 L=10, a=1,b=1, c=2
 を代入すると、
 10^2=(1*x+1*y+2)^2  /  (1^2 + 1^2)
 100 = (x+y+2)^2  / 2

 ★★★200 = (x+y+2)^2     になる。
 先程の、直線AQの式   y = x -6   を代入

 200 = (x+x-6+2)^2
 200 = (2x-4)^2
 200 = 4x^2 +16
 184 = 4x^2
 46 = x^2

 x= ±√46

 よって、点Aと点Bのx座標は、x= ±√46だとわかる。
 あとは、直線AQの式   y = x -6の式に代入すれば、
 点Aと点Bのy座標も分かる。

 ■■■■■■■■■■■■■■■■■■■■
 ∴      点A(+√46,  +√46 - 6)
         点B(-√46,  -√46 - 6)

 ★ちなみに、直線がPQがY軸と並行、または、X軸と平行のときは、
 この式は使わない。その場合は、簡単に求めることができますよね。

 マクロ作成時は、
 (1)PとQが同じ点ではないことを確認。
 (1)直線がPQがY軸と並行なら、処理1
 (2)直線がPQがX軸と並行なら、処理2
 (3)どちらでもないなら、処理3(今まで解説してきた数式を使う)
 みたいな感じかな。

(マリオ) 2016/03/07(月) 16:59


 丁寧にありがとうございます。

 理屈と私が計算が苦手なのが分かりました・・。
 ちょっとコードに起こすのに苦労しています。
(ゆき) 2016/03/07(月) 17:12

 面倒ですよね(+_+)

 点P (Px, Py)
 点Q (Qx, Qy)
 点R (Rx, Ry)
 点S (Sx, Sy)
 直線PQに垂直で、長さがLである「線分QR」と「線分QS」を考える。
 Px,Py,Qx,Qy,Lの値が与えられているとき、
 Rx,Ry,Sx,Syを求めたい。
 **************************************************************
 (直線PQの傾き)= (Qy-Py)  /  (Qx-Px)
   直線QSの式: y = {-(Qx-Px)  /  (Qy-Py)}* x + t  【←tは切片】
 この式に点Q (Qx, Qy)を代入して、
 Qy = {-(Qx-Px)  /  (Qy-Py)}* Qx + n
 Qy +  {(Qx-Px)  /  (Qy-Py)}* Qx = n
 これで、切片tがわかったので、
 ★直線QSの式: y = {-(Qx-Px)  /  (Qy-Py)}* x + Qy +  {(Qx-Px)  /  (Qy-Py)}* Qx  【←(1)式】

   直線PQの式: y = { (Qy-Py)  /  (Qx-Px)}* x + u  【←uは切片】
 この式に点Pでも、点Qでもどちらでもいいが、点P (Px, Py)を代入して、
 Py = { (Qy-Py)  /  (Qx-Px)}* Px + u
 Py - { (Qy-Py)  /  (Qx-Px)}* Px=  u
 これで、切片uがわかったので、
   直線PQの式: y = { (Qy-Py)  /  (Qx-Px)}* x + Py - { (Qy-Py)  /  (Qx-Px)}* Px
  【y=αx+β】表記のこの式を【ax + by + c = 0】表記に変形。
  -{ (Qy-Py)  /  (Qx-Px)}* x + y  - Py + { (Qy-Py)  /  (Qx-Px)}* Px = 0
  となるでの、
  ★a = -{ (Qy-Py)  /  (Qx-Px)}             【←(2)式】
  ★b = 1                                     【←(3)式】
  ★c=- Py + { (Qy-Py)  /  (Qx-Px)}* Px     【←(4)式】

 また、L  =  |a*x + b*y + c|  /  √(a^2+b^2)  【←(5)式】
 であるので、【(5)式に(1),(2),(3)(4)式を代入して、x=の形にする。】

 めんどくさい(+_+)
(マリオ) 2016/03/07(月) 18:55

学校の宿題を代わりにやって〜的な問題には答えないんだけど、
なんか解答が変な方向なんでちょっとだけ。

この問題はpとqから水平と垂直に補助線引いてできる三角形と、
同じくpとbに補助線引いてできる三角形が相似なんじゃね?って問題。
傾きも切片もつかわない。
(日捲り熊五郎) 2016/03/07(月) 19:05


 To 日捲り熊五郎 さん

 もっと簡単に求められるでしょっていう、ご指摘ですよね?
 学校の宿題っぽいですね。こりゃ。高校1年生の数学の授業みたい。

 ゆきさんが、はじめに定義した内容でいくと、
 Qから線分PAに下した垂線の足をCと定義すると、
 直角三角形PAQと直角三角形QACが相似になりますよね。このこと?ん〜。
 
 >pとbに補助線〜
 とありますが、bって何ですか?
 A,Bの座標を簡単に求める方法、PLEASE,ヒントください!

(マリオ) 2016/03/07(月) 20:31


 お遊びで。

 点Pから点Qに向かうベクトルPQを仮に(x,y)とすると
 これに直交するベクトルは(-y,x)と書けます。

 方向が逆のものは、(y,-x)です。

 その長さは((-y)^2+ x^2)^(1/2) ですから、
 これを長さ10に比例的に延ばせばいい。

 コードはこんな風になるのでは?
 
     Dim u As point
     Dim a As point
     Dim b As point

     '例
     p.x = 1: p.y = 1
     q.x = 4: q.y = 5

     pq.x = q.x - p.x
     pq.y = q.y - p.y

     'PQに直交する長さ10のベクトル
     u.x = -pq.y * 10 / ((pq.x ^ 2 + pq.y ^ 2) ^ (1 / 2))
     u.y = pq.x * 10 / ((pq.x ^ 2 + pq.y ^ 2) ^ (1 / 2))

     '答えのひとつA
     a.x = q.x + u.x
     a.y = q.y + u.y
     'もう一つB
     b.x = q.x - u.x
     b.y = q.y - u.y

     Debug.Print a.x; a.y
     Debug.Print b.x; b.y

 End Sub

(γ) 2016/03/07(月) 20:59


 コードの頭が飛んでしまいました。

 Option Explicit
 Type point
     x As Double
     y As Double
 End Type
 Sub test()
     Dim p As point, q As point
     Dim pq As point
 を追加してください。
 
 # 編集ができないですねえ。これは少し使いにくくなったねえ。

(γ) 2016/03/07(月) 21:12


 皆さんありがとうございます
 未だに悪戦苦闘中ですので結果はいましばらく。

 地理関係の仕事をしておりまして、GoogleEARTHの
 Kmlファイルから情報を読み込んで基準軌跡から指定距離内に並走する軌跡の
 存在有無のチェックができないか試みるためのものです。
 決して学校の宿題ではありませんので、念のため。

(ゆき) 2016/03/07(月) 21:30


 傾き(角度)を求めてから、±90度、三角関数でx,yを求める。

Sub test()

    Dim bb

    bb = Pos(-3, 1, 2, -4, 10)   'P(x,y),Q(x,y),長さ

    MsgBox "A点(" & bb(1) & ", " & bb(2) & ")" & vbLf & _
           "B点(" & bb(3) & ", " & bb(4) & ")"
End Sub

 Function Pos(Px, Py, Qx, Qy, Length)
     Dim Matrix(1 To 4) As Double
     Dim xLength As Double '傾きの分母
     Dim Slope As Double

     xLength = Qx - Px

     With WorksheetFunction
        If xLength = 0 Then
            Slope = .Pi() / 2
        Else
            Slope = Atn((Qy - Py) / (Qx - Px)) '傾きを弧度で求める
        End If

        Matrix(1) = Cos(Slope + .Pi() / 2) * Length  '90度プラスしてから、座標原点からのxを先ず求める
        Matrix(1) = Matrix(1) + Qx                   'それから、Q点の座標分だけxを平行移動する

        '以下同様
        Matrix(2) = Sin(Slope + .Pi() / 2) * Length + Qy  '90度プラス後、y座標を求める

        Matrix(3) = Cos(Slope - .Pi() / 2) * Length + Qx  '90度マイナス後、x座標を求める
        Matrix(4) = Sin(Slope - .Pi() / 2) * Length + Qy  '90度マイナス後、y座標を求める
     End With

     Pos = Matrix  'A(x,y),B(x,y)を格納

 End Function

 >地理関係の仕事をしておりまして、GoogleEARTHの
 > Kmlファイルから情報を読み込んで基準軌跡から指定距離内に並走する軌跡の
 > 存在有無のチェックができないか試みるためのものです。

 地球の丸さ(楕円?)を考えに入れないでいいのかなぁと云う気がしていますけども。
 私にはよく分からないですが、以前、同系統(?)の質問があったような気がします。
  
 『ある1点の緯度経度から●●km離れた緯度経度の取得』(Ryu) 
[[20131117173744]]

(半平太) 2016/03/07(月) 23:15


 ベクトルですかγさん、敵いません。
 γさんのコードで、
 p.x = -3: p.y = 1
 q.x = 2: q.y = -4
 とすると、
 点A  ( 9.07106781186548  ,    3.07106781186547 )
 点B  (-5.07106781186547  ,  -11.0710678118655  )
 ですよね。

 なんか、次の値で算出したけど、間違ってたのか(+_+)
 ゆきさん、すいません。直線式でも解けるはずなんだけど。
  ∴      点A(+√46,  +√46 - 6)
         点B(-√46,  -√46 - 6)
         何がまちがってたのか??

 To 半平太 さん
 三角関数ですか(+_+)すごいな〜。
(マリオ) 2016/03/08(火) 00:34

 みなさんありがとうございます。
 いろいろな解法があるんですねー。
 γさん、半平太さん、コードのご提示までありがとうございます。
 日捲り熊五郎さん助言ありがとうございます。
 マリオさん手解きありがとうございます。

 一旦解決としたいと思います。
 また質問させていただきたいと思います。
(ゆき) 2016/03/08(火) 10:17

 結果です。
 γさんのベクトル計算の式をそのまま使わさせていただきました。
 半平太さんのからご指摘いただいておりました地球が球体であることを
 考えに入れなくていいかというところは、使用しているのが平面直角座標系
 であることと、長さが0.00015度程度という小さなものですので
 ほぼ影響しませんでした。

 携わっていただいたみなさまありがとうございました。(特にマリオさん)
(ゆき) 2016/03/10(木) 16:32

 To ゆき さん
 力になれず、すいません(>_<)
 100メートルの距離で、15ミリの影響があるんですかね。影響大きいような。

   100メートル → 100000ミリ
    100000×0.00015=15
(マリオ) 2016/03/10(木) 18:23

 ★間違い
 *****************************
  2016/03/07(月) 16:59
 (訂正前)
  200 = (2x-4)^2
  200 = 4x^2 +16  ←★ここで間違ってました
 *****************************
 (訂正後)
  200 = (2x-4)^2
  200 = 4x^2 -16x +16  ←★正しくは、こう
        4x^2 -16x -184 = 0
 ++++++++++++++++++++++++++++++++++++++++
  2次方程式の解の公式は、
  x=  {-b±√(b^2-4ac)}  /  2a
 a=4
 b=-16
 c=-184
 なので、
 ++++++++++++++++++++++++++++++++++++++++
 x=  {-(-16)±√((-16)^2-4*4*-184)}  /  2*4
 x=  {16±√(256+2944)}  /  2*4
 x=  {16±√(3200)}  /  2*4
 x=  {16±40√2}  /  8
 x=  2±5√2

 よって、x = 2+5√2 ≒  9.07106
         x = 2-5√2 ≒ -5.07107

 y座標の算出は、直線AQの式   y = x -6 を使えばいい。
(マリオ) 2016/03/10(木) 19:16

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.