アプリ版:「スタンプのみでお礼する」機能のリリースについて

■光の入射角
 北から時計回りにA度
 水平面から空方向にB度
■反射パネル
 真南向きに地面からC度の傾斜で設置
■光の反射角
 北から時計回りにX度
 水平面から空方向にY度

この条件下でXとYを算出したいですが、一般式の求め方はどうなるでしょうか?

 X=f(A,B,C)

 Y=f(A,B,C)

の関係式だと思います。

仮にC=0(水平に配置)だとすると、
 X=A+180
 Y=B
仮にC=90(鉛直に配置)だとすると、
 X=360-A
 Y=-B
になります。

よろしくおねがいします。

A 回答 (2件)

これは、X, Y という「角度」を求めるのは難しいので、「ベクトルの向き」ということで考えればよいでしょう。



話が厄介なのは、「反射パネルが傾斜している」ということなので、反射パネルを「水平」とみなす座標軸で反射を考え、元の「地面」を基準にした座標に戻してやればよいのです。

 地面を基準にした座標を、「地面をX-Y平面、北がY軸、東がX軸」「地面に鉛直な高さ方向をZ軸」にすると、入射光のベクトル →Ri は、ベクトルの長さを R とすると、きちんと図を書けばわかるように
  →Ri = (-R*cosB*sinA, -R*cosB*cosA, -R*sinB)
です。

 これを、「反射パネルをX-Y平面、北の方向がY軸、東がX軸」「反射パネルに鉛直な高さ方向をZ軸」に変換すると、要するにもともとの「地面」座標を、X軸を軸として角度「-C」だけ回転したものだということが分かります。つまり、X座標は変わらず、Y,Zが回転します。角度 -C だけ座標軸が回転すると、新しい座標 Y', Z' は
  Y' = Y * cos(-C) + Z * sin(-C)
  Z' = -Y * sin(-C) + Z * cos(-C)
となりますから、反射パネルを基準にした座標では、入射光 →Ri1 は
  →Ri1 = (-R*cosB*sinA, -R*cosB*cosA*cosC + R*sinB*sinC, -R*cosB*cosA*sinC - R*sinB*cosC)

 これが基準面(X-Y平面)で反射するということは、ベクトルのX,Y成分は変わらず、Z成分だけが反転するということです。つまり、反射光 →Ro1 は
  →Ro1 = (-R*cosB*sinA, -R*cosB*cosA*cosC + R*sinB*sinC, R*cosB*cosA*sinC + R*sinB*cosC)

 今度は、これを「地面」座標に戻すために、座標軸をX軸を軸として角度「C」だけ回転させます。
 その結果のY成分は、
   [ -R*cosB*cosA*cosC + R*sinB*sinC ]*cosC + [ R*cosB*cosA*sinC + R*sinB*cosC ]*sinC
  = -R*cosB*cosA*cos^2C + R*sinB*sinC*cosC + R*cosB*cosA*sin^2C + R*sinB*cosC*sinC
  = -R*cosB*cosA*(cos^2C - sin^2C) + R*sinB*(sinC*cosC + cosC*sinC)
  = -R*cosB*cosA*cos(2C) + R*sinB*sin(2C)
Z成分は
   -[ -R*cosB*cosA*cosC + R*sinB*sinC ]*sinC + [ R*cosB*cosA*sinC + R*sinB*cosC ]*cosC
  = R*cosB*cosA*cosC*sinC - R*sinB*sin^2C + R*cosB*cosA*sinC*cosC + R*sinB*cos^2C
  = R*cosB*cosA*(cosC*sinC + sinC*cosC) + R*sinB*(cos^2C - sin^2C)
  = -R*cosB*cosA*sin(2C) + R*sinB*cos(2C)

 これより、「地面」座標での反射光のベクトル →Ro は、
   →Ro = (-R*cosB*sinA, -R*cosB*cosA*cos(2C) + R*sinB*sin(2C), -R*cosB*cosA*sin(2C) + R*sinB*cos(2C))

 けっこう複雑ですねえ。計算間違いしているかもしれませんので、検算してみてください。

 ご質問のように、
■光の反射角
 北から時計回りにX度
 水平面から空方向にY度
という条件にすると、
 tanX = x/y = (-cosB*sinA)/(cosB*cosA*cos(2C) + sinB*sin(2C))
 tanY = z/√(x^2 + y^2)
    = [ -cosB*cosA*sin(2C) + sinB*cos(2C) ] / √[ (cosB*cosA*cos(2C) + sinB*sin(2C))^2 + (cosB*cosA*sin(2C) + sinB*cos(2C))^2 ]
    = [ -cosB*cosA*sin(2C) + sinB*cos(2C) ] / √[ cos^2B*sin^2A*cos^2(2C) + 2*cosB*cosA*cos(2C)*sinB*sin(2C) + sin^2B*sin^2(2C) + cos^2B*cos^2A*sin^2(2C) + 2*cosB*cosA*sin(2C)*sinB*cos(2C) + sin^2B*cos^2(2C) ]
    = [ -cosB*cosA*sin(2C) + sinB*cos(2C) ] / √[ cos^2B*cos^2A + 4*cosB*cosA*cos(2C)*sinB*sin(2C) + sin^2B ]
う~ん、ちょっと面倒くさいので、これ以上はパスします。
 おそらく、tanX、tanYでこれですから、
   X= ・・・
   Y= ・・・
とはうまく表せないと思います。

 ちなみに、Ri = (Rx, Ry, Rz) として、これを使って Ro を表わすと
   Ro = (Rx, Ry*cos(2C) - Rz*sin(2C), Ry*sin(2C) - Rz*cos(2C))
ですね。A, B は消えて、入射ベクトルに対して「C」のみの関数で表わせます。
 この形で表わすのが一番わかりやすいと思います。

 仮に、C=0° とすれば
   Ro = (Rx, Ry, -Rz)
ですから、素直な地面(XY平面)での反射です。
 また、C=90° とすれば
   Ro = (Rx, -Ry, Rz)
ということで、XZ平面での反射になります。
 正しい反射になっていますよね?
    • good
    • 0

こういう問題はポンチ絵で概況を説明しないと。

意味全く不明。
    • good
    • 0

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