ゲーム上、「平地」は「0m」など一定の標高でのっぺりとするわけですが、実際には微妙な高低差があるだろうという感覚を持つのが自然です。特に「城下町の復興」では川がわざわざ崖に沿って流れているので、これはもう、そこが低くて川の東側は少しずつ高くなっていく地形なんだろうと思わせられます。わあぃ水の気持ちになって流れてみよう!(違)
ここで「ゆるシミュ(8)」([3658])のおさらいであります。…さら〜い!!(違)
・[3658]
> プレーヤーがゲーム内で地形を把握するためには何が必要かを考えます。
プレーヤーが目で見て目視で視感を言葉で述べ、というのでなく、データをほうりこめば自動で何らかの把握が完了する、というのを目指しませう。それを、最初は対話的に手作業で試してみませう、という「ゆるシミュ」でありました。
> ゲーム内の地形の標高を画像から読み取って数値化し、統計解析環境「R」に取り込んで、
> わざわざRに読み込んだということはあれですか。あれですね。
> 「高さ」が「10m」「0m」「-3m」の点(35488個くらい)は、なかったことにする
> 「x,y,z」という3列のレコード(行)が縦に30048行くらい並ぶ形式に変える
この数はマップによって変わります。…山奥の旅館で新鮮な海の幸の刺身!(以下略)
> 「本来あったはずの起伏を逆算する」アルゴリズムをこしらえる
これですこれです。
> ゲームとしてのプレイアビリティのようなものを持たせるため「0m」ぴったりの平地を多くしてあるという理解をしました。じゃあ(※)この「0m」の地点を、k-meansで求めたセントロイドの方向へ引っ張って、山に向かっては持ち上げ、海に向かっては押し下げ、そういうおしあいへしあいで均衡したモーメントみたいなのを求めて、それっぽい高低差をつけようではありませんか。
> ゲームのマップで「0m」の地点は後にも先にも「0m」より低くはならないと決め(※そうしないと陸上の面積が減ってしまい、ゲームの難易度が変わってしまいます)、基本的には山に向かって持ち上げる方向で、その上限を(斜めのモーメントではなく各地点でのZ軸の変化量で)「19m」(※「20m未満」の意)ということにしましょうか。
https://youtu.be/gS4_iFLpbDg?t=25s
メロンパン専用!!(違)
> 『距離の二乗に比例して減衰!』みたいなことを考えかけたけれど、「距離の逆数」でいいじゃないですか。本当でしょうか。
> 言葉では「逆!」と簡単に言うけれど、よく確かめないと混乱するよとはこのことだよ。
すっかり混乱しました。メロンパン専用!!(だから違)
> いよっ、ろっかくだいおうじ!!
…『ろっかくだいおうじ』ってだれだよ!!(※表現は演出です。)
> われわれビー玉。どこへゆくビー玉。
ついにビー玉になってしまいました。(棒読み)
http://daiohg.dengeki.com/ss/daiohg/uploads/2017/07/01-300x245.jpg
> 廻れっ!!
やーいろっかくだいおうじ。(たぶん違)
> 32GBのメモリが使用率98%といいながらCPUがうなります。かなり待たされます。
それは何かが間違っている。だからキャンセルしませう。わあぃキャンセルが出たぞう!!(違)
> みそ汁にはサツマイモを入れてみせるといいぞ。
> こんがり焼けた「mydistakari2d」の内容を確かめようとして、いきなり「mydistakari2d」と入力してEnterを押したりしてはいけません。距離行列は、縦に30048行、横に30047列、つまり902,852,256個のマス目があるんですよ。…ええーっ!! さあさあ「mydistakari2d」と入力してEnterを押してしまったフレンズは赤い八角形「STOP」と書かれたボタンを押そうね。…おっと、そっちは「(43)五目焼そば 800円」のボタンだよ。(棒読み)
・[3657]
> > ほえええ!!
結局どうなったんスか。
https://neorail.jp/forum/uploads/contour_akari_elv_n25c4.png?ref=3868
…うーん!
・「R with Excel」ぱやっぱ!!(※前回のおさらい)
3軸の座標が入った3列×30048行のテーブル※を読み込む (タブ区切り) | myakari3d=read.table("clipboard",h=0) |
※k-meansを実行しておく (k=9、nstart=50) | mykmakari9 <- kmeans(myakari3d, 9, nstart=50) |
※k-meansで得られた重心の表を RからExcelにコピーする | write.table(mykmakari9$centers, file="clipboard", sep="\t") |
| |
3軸の座標が入った3列×30048行のテーブルから 1列目と2列目を取り出したテーブルをつくる | myakari2d <- myakari3d[ ,c(1, 2)] myakari2d # 内容を確かめます |
2軸の座標が入った 2列×33333行の テーブルを読み込む (タブ区切り) | myakari0=read.table("clipboard",h=0) |
1行目に重心の1つ目の座標、 2行目から33334行目に テーブルの33333行を入れた テーブルをつくる | mytab1x33333 <- rbind(mykmakari9$centers[1, c(1,2)], myakari0) |
距離行列をつくり 1番目から33333番目(※1列目)だけを得る | mydist1 <- dist(mytab1x33333, diag=FALSE, upper=FALSE) mydist1x33333 <- head(mydist1, n=33333) |
| # 同様にして「mydist2x33333」〜「mydist9x33333」をつくる |
| |
自作の関数を定義する | myfunc1 <- function(a,b) sqrt(a ^ 2 + b ^ 2) # 斜辺の長さを求める |
自作の関数を定義する | myfunc3 <- function(delta,max,min,height) ((delta - min) / (max - min)) * height |
自作の関数を定義する | myfunc2 <- function(delta,dist) ((delta * 2) * (1 / (dist ^ 2))) # 距離の2乗の逆数をかけて「減衰」させる |
| |
| mydeltaakari0 <- cbind(myfunc2(mykmakari9$centers[3,3], myfunc1(mydist3x33333, mykmakari9$centers[3,3])), myfunc2(mykmakari9$centers[5,3], myfunc1(mydist5x33333, mykmakari9$centers[5,3])), myfunc2(mykmakari9$centers[6,3], m |