Discuss Scratch

pie--pie--
Scratcher
45 posts

Scratch数学カフェ

#1059
僕がやりたかったのは、震央→津波観測点ですが、直線でであるともし震央と観測点が太平洋と日本海の時に、陸地を貫通していることになるので迂回地点を設け距離を実際に近づけようとしています。ただ、これでも一部陸地を貫通する計算(例えば福井県沖と佐渡だと能登半島を貫通する)になるので曲線にして距離の誤差を少なくしようと考えました。二点の距離を求めるのはすでに実装していますのでこの曲線の長さを求め、それを緯度経度に変換→kmに変換というかたちで津波高の計算に使用するということを考えています。スプレイン補完で二次関数の式を求め、積分で求められるのはわかったのですが「scratch上でどう積分すればいいか」と、「x、y座標で計算したときその距離をどういう風にkmに変換すればいいか」がわかりません。(2つ目はどうにかなる可能性が高いが一つ目については理解不能)教えてくださいお願いします。

when green flag clicked
think [世の中で不祥事を起こす人にだって理由があるんだもんな〜]
if <touching [my project] ?> then
say [Ура!]

else
think [Это не хорошо]
end
Jinenjo_000
Scratcher
100+ posts

Scratch数学カフェ

>>#1061
曲線の方程式 { x(t), y(t) } が求まったとすると、地球の曲率を無視した地図上での曲線の長さは
∫ ds
∫ √(dx²+dy²)
= ∫ √(dx/dt)² + (dy/dt)² dt

スプライン補間だったら x(t) や y(t) は t の多項式ですから、解析的に積分できるはずです。

一方地球の曲率を考えて、実際の距離を求めたいとなると少し複雑になります。
緯度をθ、経度をφ、地球の半径を R と表すと、地球上での微小距離 ds は

ds² = R² (dθ² + cos²θ dφ²)

これを求めるために、経度緯度を地図上のxy座標をつかって表します。

φ = x / R
θ = f(y / R) f : あなたが使ったy座標から緯度への変換 (多分 asin{tanh(y/R)}?)

なので

dφ = dx / R
dθ = (df/d(y/R)) d(y/R)

いま x,y はスプライン補間をつかって t の多項式 { x(t), y(t) } として求めたので曲線の長さは、

∫ ds
= ∫ R √(dθ² + cos²θ dφ²)
= ∫ R √( (df/d(y/R))² d(y/R)² + cos²(f(y/R) dx²)
= ∫ R √( (df/(dy/R))² (d(y/R)/dt)² + cos²(f(y(t))/R) (dx/dt)² ) dt
= ∫ √{ f'(y/R)² y'(t)² + cos²( f(y(t))/R ) x'(t)²} dt

のように t についての積分で表せます。
最後の積分については台形積分などで、有限の和に近似することになると思います。

途中間違っていたらすみません。
ioqj
Scratcher
100+ posts

Scratch数学カフェ

数学関連の質問なのでこちらで。
Scratchで対数(log)の底を指定する方法はありますか?

フォーラムの皆さん、こんにちは!ioqjと申します。
各リンクは以下から
コメント | フォロー | フォロワー | プロジェクト | お気に入り | 好き | フォローしているスタジオ | キュレーションしたスタジオ (通知数)
ついに夏が終わり、季節は秋、今まであんなに暑かったのが嘘のようです。。
現在のポスト数(署名の最終更新時点)は、(削除された投稿を除いて)326postsです。

Last edited by ioqj (10月 4, 2024 16:10:38)(JST)
ankouakaisikairoka
Scratcher
85 posts

Scratch数学カフェ

logの底の変換公式と使うと良いでしょう。
log_a(b)=log_c(b)/log_c(a)です。Scratchの場合、cは10かeになるでしょう。

↑線から下は署名です。
()は柿の種の断面図。
console.log("環境情報: Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36")
console.log("署名の最終更新日 2024/10/14 11時(JST)")
for (let i = 1; i <= 100; i++) {
  console.log((i % 3 ? '' : 'Fizz') + (i % 5 ? '' : 'Buzz') || i);
}

Powered by DjangoBB