部分的な答え:
私が収集したものによると、 の長い文字列はtrtqtqss
、本質的に、場所のバイナリ検索を示しています。大まかに訳すと次のようになります。
- 文字から始め
t
ます。これにより、「浅い世界」が得られます
- 地図上でポイントを探します。左上の象限にある場合は、
q
. 右上の場合は、 を追加しr
ます。右下、追加s
。左下、追加t
。
- 新しい象限を拡大します。繰り返す。
文字を追加するたびに、タイルのサイズが半分になり、新しい左下隅が見つかります。世界地図を幅と高さ = 1 の長方形と考えると、追加された文字ごとに新しいコーナーを見つけることができます。これは、コメントでリンクしたアルゴリズムの本質です。
それに加えて、既知の文字列から衛星画像への変換の「ロゼッタ ストーン」(再びリンクから) を加えて、次のコードを示します。これにより、文字列に基づいてポイントの経度/緯度が得られます。それをコンパイルし、文字列を引数として実行可能ファイルに渡します。
#include <stdio.h>
#include <string.h>
#include <math.h>
double NormalToMercator(double y) {
double pi;
pi = 2 * asin(1);
y -= 0.5;
y *= 2 * pi;
y = exp( 2 * y );
y = ( y - 1 ) / ( y + 1 );
y = -asin( y );
return -y * 180 / pi;
}
int main(int argc, char* argv[]) {
double x=0, y=0, scale=1;
char buf[100]={' '};
int ii;
buf[0]=argv[1][0];
for(ii = 1; ii < strlen(argv[1]); ii++) {
buf[ii-1]=argv[1][ii];
scale *= 0.5;
switch (tolower(argv[1][ii])) {
case 'q':
y+=scale;
break;
case 'r':
y+=scale;
x+=scale;
break;
case 's':
x+=scale;
break;
case 't':
break;
default:
break;
}
printf("the string %s gets you to (x,y): %.9lf, %.9lf\n", \
buf, x, y);
}
printf("the final lat/long is %.5lf, %.5lf\n", 360.0 * (x - 0.5), NormalToMercator(y));
}
中間printf
ステートメントは、アルゴリズムがゆっくりと適切な場所に向かっている様子を示すためにあります。あなたのコメント ( tsrrtrsqsqqqrqrtsst
) のリンクからの文字列でこれをテストし、座標を取得しました153.39935ºE 28.32372ºS
(注 - 経度の負の数は「W」を意味し、緯度の負の数は「S」を意味します。153.39935、-28.32372 を得ました)。 . それらをGoogleマップに入力すると、ブログ投稿のリンクを入力すると表示される病院の写真が表示されました。