昔mixiで書いた日記なのですが、なかなか面白いと思いますのでブログに転記します。
よく観光スポットとかで「地球が丸く見える~~岬」というのがあるのですが、 自分の個人的な経験でも、本当にそういう地点に行くと地球が丸く感じられた 経験があります。
具体的には視野の左右の端の水平線は、視野の中央の水平線より
若干下がっているように見えるのです。
しかし、テレビなどで 「それは錯覚、地球が丸いという知識が前提となりそう見えているだけ。 人間の観測地点程度の高度では地球の丸みは感じられない」 ということが言われていた。
自分的には、地球が丸いという、後から学んだ知識などなくても、本当に、 裸の心で水平線を見て丸く見えたのでこのような自然な感覚が否定されている のが非常にムカついていたのです。
僕はこの水平線が丸く見えた経験を飛躍させて、 古代の人たちも実は地球が丸いということをおぼろげに気づいていたのではないか とさえ考えていた。
ただむかついているだけではしょうがないので、うまいこと計算してこの丸み が人間に知覚できるのかがんばってみました。
具体的には視野の中央と視野の端の水平線の角度(視角?)の差を求めてみました。
ちょっと説明がめんどくさいのですが大まかに説明すると、
水平線が作る円と観測地点Poとが作る円錐を考える。
水平線の任意の点をPgとする。
人間の視野角?は200度とのことなので、Pgからこの半分の100度回転させた水平線上の 点をPrとする。
円錐に接し、Po-Pgに接する平面とPoPrとのなす角が求めたい角度
いい加減にやったので80%くらい計算間違いしてると思うんですが、下記のような結果が出ました。
答え合わせもあんまりしてなくて本当にいいかげんですので信用しないでください。
計算メモとロジックをエクセルのマクロに記述したものをはっつけますので 突っ込みをお待ちしております。
100mの岬で、 0.457624909 度 と計算されました。
ちなみに「1cmの対象を1m先からみた時の視角が0.57度」ということだそうです。
海抜100mの場合は、視野の両端では1cmの対象を1m先から見たくらいの大きさよりちょっと少ないくらい水平線が下がって見えてるということかな?人間の感覚で知覚できそうな 気がしますよね。
地球の半径 半径6367.25km(赤道での直径と極での直径の中間値を採用) 人間の視野角200度として計算
観測者地点(海抜)[M] 視野の中央と端との水平線の角度の差(ラジアンではなく度)
0.1 0.014471504
0.2 0.020465797
0.3 0.02506538
0.4 0.028943007
0.5 0.032359265
0.6 0.035447799
0.7 0.038287998
0.8 0.040931592
0.9 0.043414509
1 0.04576291
1.1 0.047996544
1.2 0.050130755
1.3 0.052177744
1.4 0.054147403
1.5 0.056047886
1.6 0.057886008
1.7 0.05966753
1.8 0.061397382
1.9 0.063079813
2 0.064718522
3 0.07926367
4 0.091525794
5 0.102328939
6 0.112095726
7 0.121077211
8 0.129436971
9 0.137288628
10 0.144714907
11 0.15177826
12 0.158527208
13 0.165000334
14 0.171228923
15 0.177238758
16 0.183051385
17 0.188685031
18 0.194155278
19 0.199475567
20 0.204657594
50 0.323591172
100 0.457624909
150 0.56047117
200 0.647173371
250 0.723558481
300 0.79261494
350 0.856118026
400 0.915224438
450 0.970737622
500 1.02324257
550 1.0731809
600 1.120895712
650 1.166659854
700 1.210694552
750 1.253182127
800 1.294274953
850 1.334101918
900 1.372773203
950 1.410383873
1000 1.447016634
1050 1.482743966
1100 1.517629819
1150 1.551730945
1200 1.585097994
1250 1.617776388
1300 1.649807048
1350 1.681226996
1400 1.712069857
1450 1.742366277
1500 1.772144281
1550 1.801429579
1600 1.830245822
1650 1.858614826
1700 1.886556769
1750 1.914090352
1800 1.941232951
作成したエクセルのVBAマクロ(モジュールに貼り付けて使ってください)
CalcSikaku(地球の半径,観測地点の海抜)が角度を求める関数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
Option Explicit 'R: 地球の半径 [m] 'h: 観測地点の地面からの距離(海抜) [m] Public Function CalcSikaku(ByVal R As Double, ByVal h As Double) As Variant Dim lengthPoPx As Double Dim lengthPxPg As Double Dim lengthPoPg As Double Dim sita As Double Dim naiseki As Double Dim norm1 As Double Dim norm2 As Double Dim x1 As Double Dim y1 As Double Dim z1 As Double Dim x2 As Double Dim y2 As Double Dim z2 As Double sita = CalcSita(R, h) lengthPoPg = CalcLengthPoPg(R, h) lengthPoPx = lengthPoPg * Cos(sita) lengthPxPg = lengthPoPg * Sin(sita) x1 = 0 y1 = lengthPoPx z1 = lengthPxPg x2 = lengthPxPg * Cos(ToRadian(10)) y2 = -1 * lengthPxPg * Cos(ToRadian(10)) z2 = -1 * lengthPoPx naiseki = CalcNaiseki(x1, y1, z1, x2, y2, z2) norm1 = CalcNorm(x1, y1, z1) norm2 = CalcNorm(x2, y2, z2) CalcSikaku = ToDegree(myAcos(naiseki / (norm1 * norm2))) End Function Public Function CalcNaiseki(ByVal x1 As Double, ByVal y1 As Double, ByVal z1 As Double, ByVal x2 As Double, ByVal y2 As Double, ByVal z2 As Double) As Variant CalcNaiseki = x1 * x2 + y1 * y2 + z1 * z2 End Function Public Function CalcNorm(ByVal X As Double, ByVal y As Double, ByVal z As Double) As Variant Dim wk As Double wk = X * X + y * y + z * z CalcNorm = Sqr(wk) End Function Public Function CalcLengthPoPg(ByVal R As Double, ByVal h As Variant) As Variant CalcLengthPoPg = (R + h) * Cos(CalcSita(R, h)) End Function Public Function CalcSita(ByVal R As Double, ByVal h As Variant) As Variant CalcSita = myASin(R / (R + h)) End Function '度→ラジアン Public Function ToRadian(ByVal Degrees As Double) As Double ToRadian = (Application.WorksheetFunction.Pi / 180) * Degrees End Function 'ラジアン→度 Public Function ToDegree(ByVal Radian As Double) As Double ToDegree = (180 / Application.WorksheetFunction.Pi) * Radian End Function Function myASin(X As Double) As Double myASin = Atn(X / Sqr(-X * X + 1#)) End Function Function myAcos(X As Double) As Double myAcos = -Atn(X / Sqr(-X * X + 1#)) + (Application.WorksheetFunction.Pi / 2#) End Function |