システムメンテナンスのお知らせ

・一般の四角形(どの辺も等しい必要がない四角形)をグラフ上に表す関数で|a(x+p)+b(y+q)|+|c(x+p)+d(y+q)|+e(x+p)+f(y+q)=gより簡単なものはありますか?

・その四角形の頂点(x1,y1),(x2,y2),(x3,y3),(x4,y4)が与えられた時、上記の関数の値を求めることはできますか?
四角形のグラフとは以下のようなものです

「・一般の四角形(どの辺も等しい必要がない」の質問画像

質問者からの補足コメント

  • 長文回答ありがとうございます。これほど複雑とは思いませんでした。ご回答の式を一部解いて、例えば1番目の頂点の座標x1,y1は
    x1=-βC/(P-1)(βγ-αδ),y1=αC/(P-1)(βγ-αδ)
    とパラメーターで表すことはできたので感謝しています。
    確かにこの場合、頂点の座標がわかっていれば、変数の値はxn,ynに位置を代入し連立方程式を解くことで求められます
    しかし、それを毎回解くのは少々面倒なので、方程式を逆に解いて
    β=f(x1,y1,x2,y2,x3,y3,x4,y4)
    C=f(x1,y1,x2,y2,x3,y3,x4,y4)
    の形にし各頂点のみを引数にした関数を作り直接求めたいのですが、これが一向に解けないので困っています

      補足日時:2017/09/21 17:13
gooドクター

A 回答 (1件)

[1] ご質問の方程式の成り立ちを考えてみます。


  |X|+|Y|=C (C>0)
の解(X,Y)の集合は正方形です。頂点の座標(X,Y)は(0,C), (0,-C), (C,0), (-C,0)です。2本の対角線は互いに直交していてそれぞれX軸上、Y軸上にあり、従って対角線同士の交点は原点(X,Y)=(0,0)にあります。Cは原点から各頂点までの距離を表し、従ってこの正方形の一辺の長さは(√2)Cです。

  |AX|+|Y|=C (C>0, A>0)
とすれば、解(X,Y)の集合はいわゆる菱形です。頂点の座標(X,Y)は(0,C), (0,-C), (C/A,0), (-C/A,0)です。2本の対角線は互いに直交していてそれぞれX軸上、Y軸上にあり、従って対角線同士の交点は原点(X,Y)=(0,0)にあります。Aは(X軸に乗っている頂点と)が(Y軸に乗っている対角線の長さ)の何倍であるかを表しています。

  |AX|+|Y|=PY+C (C>0, A>0, |P|<1)
とすると、解(X,Y)の集合はいわゆる凧形です。頂点の座標(X,Y)は(0,C/(1-P)), (0,-C/(1+P)), (C/A,0), (-C/A,0)です。2本の対角線は互いに直交していてそれぞれX軸上、Y軸上にあり、従って対角線同士の交点は原点(X,Y)=(0,0)にあります。

  |AX|+|Y|=QX + PY+C (C>0, A>0, |P|<1, |Q|<A)
とすると、解(X,Y)の集合は頂点の座標(X,Y)は(0,C/(1-P)), (0,-C/(1+P)), (C/(A-Q),0), (-C/(A+Q),0)である凸四角形です。2本の対角線は互いに直交していてそれぞれX軸上、Y軸上にあり、従って対角線同士の交点は原点(X,Y)=(0,0)にあります。

次に、座標変換
  X = αs + βt
  Y = γs + δt
を考え、ただし、行列
M =
  α β
  γ δ
の行列式 |M|が|M|≠0 (すなわち αδ≠βγ)であり、かつ
  α^2 + β^2 = 1
  γ^2 + δ^2 = 1
を満たすものとします。
これを使って
  |A(αs + βt)|+|(γs + δt)|=Q(αs + βt) + P(γs + δt)+C (C>0, A>0, |P|<1, |Q|<A)
右辺を整理して
  |A(αs + βt)|+|(γs + δt)|=(Qα+Pγ)s + (Qβ+Pδ)t+C (C>0, A>0, |P|<1, |Q|<A)
としますと、今度は(s,t)平面での凸四角形の方程式になります。2本の対角線の方程式 X=0, Y=0 は(s,t)平面ではそれぞれ
  αs + βt = 0
  γs + δt = 0
であり、両者の交点は(s,t)=(0,0)にありますが、もはや直交しているとは限りません。
ここでMの逆行列を Wとし、(')を転置の記号とします。頂点(0,C/(1-P))は連立方程式
  αs + βt = 0
  γs + δt = C/(1-P))
の解(s,t)、すなわち、
  (s,t)' = W (0,C/(1-P))'
に写ります。残りの頂点についても同様に、(s,t)' = W(0,-C/(1+P))', W(C/(A-Q),0)', W(-C/(A+Q),0)' になるわけです。
 最後に (s,t)平面上での平行移動
 x = s - p
 y = t - q
を行うことで、対角線の交点は(x,y) = (-p,-q)に来ます。これでご質問の方程式にたどり着いたわけです。ご質問の式にある係数a,b,…と、C, A, P, Q, α,β,γ,δとの関係は自明でしょう。
 この方程式は凸四角形を表せるけれども、180°以上の内角を持つ四角形は表せない、ということは明らかです。
 四角形、その他折れ線で表される図形を表現する方法はいろいろ考えられます。たとえば、凸多角形の場合なら「いくつかの直線(四角形なら4本)で囲まれた図形」という風に表すことができます。また、「パラメータθを0から2πまで動かすと図形を一回りする」というように表す(素直に条件分岐で記述するか、どうしても1本の式にしたければヘビサイド関数 h(θ)= (θ<0なら0, θ>0なら1) などを使う)と、描画するための計算が手早くできます。目的に応じて適切な方法を選べば良いのです。で、ご質問の方程式は描画に使うには適していません。しかし、「或る与えられた点(x,y)はこの四角形の内点か、外点か、あるいは辺上にあるか?」を調べる際に、方程式の左辺に代入して計算した値が負か、正か、零か、によってただちに判定できるという、素晴らしい利点を持っています。

[2] 与えられた頂点の座標から、ご質問の式にある係数a,b,…を決定するには、これを逆に辿っていけば良いわけです。
(1) 「与えられた4つの頂点が凸四角形の4つの頂点になっている」ということを前提にしましょう。
(2) 2本の対角線の交点の座標(x,y)を計算します。すると、(x,y)=(-p, -q)によってp,qが決まります。
(3) 4つの頂点を
  s = x+p
  t = y+q
で平行移動します。これで2本の対角線の交点は (s,t)=(0,0)になりました。
(4) ひとつの対角線について、その方向(2通りありますが、どっちでも構いません)を表す単位ベクトル (β,-α)を計算します。単位ベクトルなので
  α^2 + β^2 = 1
です。もうひとつの対角線についても同様に(δ,-γ)を計算します。こうして得られたα,β,γ,δで行列
M =
  α β
  γ δ
を作ります。頂点の(s,t)座標を(s[i],t[i]) (i=1,2,3,4)として
  (X[i],Y[i]) = M(s[i],t[i])'   (i=1,2,3,4)
を計算すれば、それらは
  {(X[i],Y[i]) | i=1,2,3,4} = {(0,C/(1-P)), (0,-C/(1+P)), (C/(A-Q),0), (-C/(|A+Q),0)}
を満たします。これを使って、P, Q, A>0, C>0が決定できます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

gooドクター

人気Q&Aランキング