プチコンまとめWiki (初代/mkII)

Toukou/羅針盤DS の変更点

パンくずリスト


#title(投稿プログラム : 羅針盤DS)
#contents
// ↑この2行は削除しないでください。
// ←このように「//」で始まる行はコメントです。ページ本文には反映されません。
//------------------------------------------------------------------------------
// ・投稿年月日は、このページを投稿しようとしている今日の日付を半角数字で入力してください。
//   この日付は、投稿プログラムを自動的に年月日順に並べる際に使用されます。
// ↓↓↓
2012年5月20日投稿
// ↑↑↑
//------------------------------------------------------------------------------
// ・投稿者名は、将来的に投稿プログラム一覧に表示するために使用します。
// ・「名無しさん」のままにしておくと、匿名の方からの投稿として扱われます。
// ↓↓↓
/ 投稿者 : Oskar
// ↑↑↑
//------------------------------------------------------------------------------
// ・適当にタグをつけることができます。半角のコンマ区切りで複数つけられます。
//   タグをつけると、同じタグが付いたページを検索することができます。
// ★次に該当するプログラムは、特定のタグを設定するようご協力お願いします。
//   これらを設定すると、将来的に投稿プログラム一覧に目立つマークが付くようになる予定です。
// ・短いプログラム → 「1行プログラム」「数行プログラム」「1画面プログラム」タグのいずれか1つ
// ・初代プチコンでも動作するプログラム → 「初代対応」タグ
// ・mkII 以降専用のプログラム → 「mkII専用」タグ
// ・QRコードを掲載している → 「QRコード」タグ
// ・該当するなら「ゲーム」「実用ツール」「音楽」タグのいずれか
// ↓↓↓
/ &tag(投稿プログラム,実用ツール,QRコード,mkII専用);
// ↑↑↑

//------------------------------------------------------------------------------
// ここに概要とか書きます。
// ・** や *** で始まる行は子見出しとなります。* の数で深さが決まります。
// ・[#英数字] はページ内リンクに使用されるアンカーですが、
//   書かなかったり、消したりしてもかまいません。ない場合はランダムな文字列が自動付与されます。

* 概要 [#Summary]
キミの DS(DSi/DSi LL/3DS)がコンパス(方位磁針)になる!
((5/20: 当初のQRコードとプログラムリストは172行目のRETURNが抜けていたのでこそっと修正しました。))

* 使い方 [#HowToUse]
** 操作 [#Instructions]
+ プログラムを起動します。
+ 外に出てお日様の光を浴びます。
+ DS を下画面が水平になるように持ちます。
+ タッチペンを DS の下画面と垂直になるように持ちます。
+ タッチペンの影が中央の点の上を通る場所までスライドしてタッチペンを DS から離します。
-- スライド中もタッチペンは傾けないでください。
-- スライド中に表示されるガイドラインに影を合わせても同じことです。
-- 中心から離れたところで離すほうがよいです。
+ 「コンパス」の赤い「針」の示した方向が「北」です。

- DS の向きを変えたり場所を移動したりしたら上記を繰り返します。
- X ボタンで終了します。

** 設定 [#Config]
起動すると現在地を勝手に東京(新宿)と決め付けますが、A ボタンで変更できます。
- いい加減な日本地図が表示されるので、だいたいの場所をタッチしてください。
- いい加減が嫌いなひとや、地図の範囲外にいるときは、Y ボタンで経度・緯度による位置の入力ができます。
- 現在地を設定したら A ボタンで戻ります。

** 注意 [#Warnings]
- 夜は使えません。
- 薄日・曇・雨・雪のときは使えません。
- DS の時刻を日本時間に合わせていないと使えません。
- ニュージーランドあたりでは使えません。
- 日本でも沖ノ鳥島では使えません。残念ながら北回帰線より北だけです。
- これを使って道に迷ったりしても、投稿者は一切責任を負いません。
- 薄日で影が薄いからといって、肉眼で太陽を直視しないでください。

* 詳細 [#Details]
** 計算結果の表示 [#Techniques]
「針」を北へ向けるために、太陽の見える方角を計算しています。
- AZ (方位角)として、真北が0度の時計回りの角度で表示

コンパスや地図の表示はアレですが、一応こんなことも考慮しています。
- 太陽の地軸が傾きによる影響と、太陽の公転が楕円であることによる影響
-- EOT (均時差)として、分単位で表示 (式は [[この辺:http://en.wikipedia.org/wiki/Equation_of_time#Approximation_based_on_above_calculation]] から取ってきた)
-- 参考1: [[冬至は一年で一番日の出の遅い日か?・・・均時差の話:http://koyomi8.com/reki_doc/doc_0508.htm]] 
-- 参考2: [[冬至なのに日暮れが遅い?!:http://www.mcat.ne.jp/~tachan/tenmon/higuregaosoi/higuregaosoi.htm]]

- 現在地の経度と標準時子午線の経度の差による影響 
-- TDM (分単位の時差)として、分単位で表示
-- 例えば、鳥取と東京では経度で約5度差があるので、1日の5/360 = 約20分ぶん太陽の動きにずれがある。

他にもいくつか、Wikipedia(英語版)の [[この辺:http://en.wikipedia.org/wiki/Horizontal_coordinate_system#Transformation_of_coordinates]] の式をこねくり回す過程で出てくる計算結果を表示しています。興味あればプログラムリストと Web を探してください。

** 隠し機能 [#UndocumentedFeatures]
「針」を動かすのには関係ありませんが、ついでなので太陽の高度も出しています。
- ALT (高度)として、水平が0度の正負の角度で表示

計算に使う日時を固定できます。システム変数 &basic{MEM$}; に次のような書式で値を代入してプログラムを起動します。
- 【例】 2012年5月21日7時31分59秒 に固定する場合
~ &basic{MEM$="FIXDATETIME=20120521073159"};

以上から、ある場所で日食などのイベントが起こる日時を知っていれば、そのとき、その場所での太陽の位置もだいたい分かります。

……ということで、時節柄、投稿を急いだのでした。
/////////////////////////////////

* スクリーンショット・動画 [#ScreenShots]
ええと、誠意検討中です。
// 動作しているところを撮影した写真や動画があれば貼り付けてください。

// ページを作成すると、画像の添付ができるようになります。(作成する前はできません)
// 作成後のページの右上、ウィキメニューにある「添付」から画像をアップロードできます。
// (添付ファイルはページごとに別個に管理されています。必ず作成後のページに添付してください)
// 画像をアップロードしたら、以下の書式でページ内に貼り付けられます。
// #ref(添付ファイル名)

// 以下の書式で、YouTube やニコニコ動画を貼り付けられます。
// #youtube(0HWX7kovgY8)
// #nicovideo(sm13684820)

/////////////////////////////////
// QR コードがない場合は、この部分は削除してください

* QR コード [#QR]
プチコンmkII 向けの QR コードです。

// 【重要】旧プチコンから mkII に転送したプログラムは、mkII で保存しなおしてから
// QR コード化すると、枚数が半分ぐらいに減ります。ぜひお試し下さい。
// 【重要】添付できるのは画像ファイルのみです。zip ファイルは解凍してください。

// ページを作成すると、QR コードの添付ができるようになります。(作成する前はできません)
// 作成後のページの右上、ウィキメニューにある「添付」から画像をアップロードできます。
// (添付ファイルはページごとに別個に管理されています。必ず作成後のページに添付してください)
// QR コードをアップロードしたら、以下の書式でページ内に貼り付けられます。
//#ref(OK_RADS1-rev2.png)

// QR コードを大きくしたい場合は、倍率指定ができます。コンマは必ず 2 つ指定してください。
// ブラウザによっては補完がかかってボケますが、それでも問題なく読み込み可能です。
// #ref(アップロードしたファイル名,,200%)

// 複数の QR コードを貼り付けるために表組みを用いる場合、&ref(); を使用します。
// (#ref() を表に埋め込んでしまうと、古い Internet Explorer でうまく表示されません)
// |>|>|~PRG:FILENAME|
// |~1/3|~2/3|~3/3|
// |&ref(qr0.png,,200%);|&ref(qr1.png,,200%);|&ref(qr2.png,,200%);|
|>|>|~PRG:OK_RADS1|
|~1/5|~2/5|~3/5|
|&ref(rev2-qr0.png);|&ref(rev2-qr1.png);|&ref(rev2-qr2.png);|
|~4/5|~5/5|~全 QR まとめ画像|
|&ref(rev2-qr3.png);|&ref(rev2-qr4.png);|~[[ここ:http://wiki.hosiken.jp/petc/?plugin=attach&refer=Toukou%2F%CD%E5%BF%CB%C8%D7DS&openfile=OK_RADS1-rev2.png]]|
/////////////////////////////////

* プログラムリスト [#List]
#basic{{
’====================
’Rashimban DS
’OK_RADS1: 2012.05.20
’(C) Oskar
’====================

GOSUB @INITIALIZE
GOSUB @DRAW_COMPASS
GOSUB @PUT_BGMAP
GOSUB @MAIN
GOSUB @FINALIZE
END

@INITIALIZE
CLEAR
ACLS:PNLTYPE ”OFF”
GPAGE 1:GPRIO 2
BGPAGE 1
BC=15:BC2=30:OC=5:CC=10
NC=2:SC=13
LC=4 XOR 15
GC=1:PC=12 XOR 0
OX=128:OY=96:CR=80:PR=4
ND=0:SD=180
BX=14:BY=10
DX=8*6:DY=8*8
’Default location (Shinjuku, Tokyo)
LAT=35.69   ’North latitude
LONG=139.69 ’East longitude
’JST location (Akashi, Hyogo)
JSTLONG=135 ’East longitude
RETURN

@DRAW_COMPASS
GDRAWMD 0:GCLS BC
GCIRCLE OX,OY,PR,CC
GCIRCLE OX,OY,CR,CC
GPAINT OX,OY,OC
CLS:LOCATE 0,0
? ”* INSTRUCTIONS *”
? ”1) GO OUT IN THE SUN.”
? ”2) HOLD YOUR DS HORIZONTALLY.”
? ”3) HOLD YOUR PEN VERTICALLY.”
? ”4) SLIDE YOUR PEN AND RELEASE”
? ”   IT WHERE THE SHADOW OF THE”
? ”   PEN IS JUST THROUGH THE ”
? ”   CENTER OF THE COMPASS.”
? ”5) THEN THE RED EDGE OF THE”
? ”   NEEDLE SHOWS THE NORTH.”
?
? ”− PRESS А TO SET YOUR LOCATION.”
? ”− PRESS Ф TO EXIT.”
GOSUB @ROTATE
RETURN

@MAIN
VSYNC 1
IF TCHST THEN GOSUB @SENSE
BTN=BTRIG()
IF BTN AND 64 THEN RETURN
IF BTN AND 16 THEN GOSUB @ADJUST
GOTO @MAIN

@FINALIZE
GPAGE 0:GPRIO 3
BGPAGE 0
ACLS
RETURN

@SENSE
IF TCHST THEN:ELSE @ENDIF_SENSE
 X=TCHX:Y=TCHY
 GDRAWMD 1
 GLINE OX,OY,X,Y,LC
 VSYNC 1
 GLINE OX,OY,X,Y,LC
 GDRAWMD 0
 GOTO @SENSE
@ENDIF_SENSE
GOSUB @ORIENT
GOSUB @ROTATE
RETURN

@ORIENT
GOSUB @GET_JST ’Japan Standard Time (Mean solar time at Akashi)
GOSUB @GET_EOT ’Equation Of Time
GOSUB @GET_TDM ’Time difference from JST
GOSUB @GET_HOUR_ANGLE
GOSUB @GET_DECLINATION
GOSUB @GET_AZIMUTH
GOSUB @GET_ALTITUDE ’For information purpose only
GOSUB @GET_ANGLE ’North/South
LOCATE 0,15:? ” ”*32*7;
LOCATE 0,15
? ”LAT=”;LAT,”LONG=”;LONG
? ”DATE=”;YY;”/”;MM;”/”;DD;” (”;N;”)”
? ”TIME=”;H;”:”;M;”:”;S;” ”
? ”EOT=”;EOT,”TDM=”;TDM
? ”HA=”;HA,”DEC=”;DEC
? ”AZ=”;AZ,”ALT=”;ALT
? ”TCHD=”;TCHD
? ”ND=”;ND,”SD=”;SD
RETURN

@GET_JST
IF LEFT$(MEM$,12)==”FIXDATETIME=” THEN:ELSE @ENDIF_GJ
 YY=VAL(MID$(MEM$,12+0,4))
 MM=VAL(MID$(MEM$,12+4,2))
 DD=VAL(MID$(MEM$,12+6,2))
 H=VAL(MID$(MEM$,12+8,2))
 M=VAL(MID$(MEM$,12+10,2))
 S=VAL(MID$(MEM$,12+12,2))
 RETURN
@ENDIF_GJ
DTREAD(DATE$),YY,MM,DD
TMREAD(TIME$),H,M,S
RETURN

@GET_EOT
’Current days since Jan 1, 2000
N=DD
RESTORE @DAYS_A_MONTH
@DAYS_A_MONTH
DATA 31,28,31,30,31,30,31,31,30,31,30,31
FOR I=1 TO MM−1
 READ DM:N=N+DM
NEXT
N=N+(YY%4==0 AND YY%100>0 OR YY%400==0)
FOR Y2K=0 TO YY−1−2000
 N=N+365+(Y2K%4==0 AND Y2K%100>0 OR Y2K%400==0)
NEXT
’Mean anomaly normalized
’in days in a tropical year
’(perihelion: about Jan. 4)
MA=2*PI()*(N−4)/365.242
’Equation of time in minute
’(from Wikipedia [en])
EOT=−7.657*SIN(MA)+9.862*SIN(2*MA+3.599)
RETURN

@GET_TDM
’Time difference in degree
TDD=LONG−JSTLONG
’Time difference in minute
TDM=24*60*TDD/360
RETURN

@GET_HOUR_ANGLE
’0 degree at noon
HA=(H−12)*15+(M+EOT+TDM)/4+S/240
RETURN

@GET_DECLINATION
’(vernal equinox: about Mar. 20/21)
ECLONG=2*PI()*(N−80.242)/365.242
DEC=23.44*SIN(ECLONG)
RETURN

@GET_AZIMUTH
’deg−>rad conversion
’avoid RAD(x) for non−integral x.
HAR=PI()*HA/180
LATR=PI()*LAT/180
DECR=PI()*DEC/180
’Coordinate conversion
’equatorial−>horizontal
’(from Wikipedia [en])
SINAZCOSALT=−COS(DECR)*SIN(HAR)
COSAZCOSALT=COS(LATR)*SIN(DECR)−SIN(LATR)*COS(DECR)*COS(HAR)
AZR=ATAN(SINAZCOSALT,COSAZCOSALT)
AZ=(DEG(AZR)+360)%360
RETURN

@GET_ALTITUDE
’No need for needle rotation
COSALT=SINAZCOSALT/SIN(AZR)
SINALT=SIN(LATR)*SIN(DECR)+COS(LATR)*COS(DECR)*COS(HAR)
ALT=DEG(ATAN(SINALT,COSALT))
IF ALT>90 THEN ALT=180−ALT
IF ALT<−90 THEN ALT=−180−ALT
RETURN

@GET_ANGLE
SUND=AZ
TCHD=(DEG(ATAN(Y−OY,X−OX))+360)%360
’North/South angle in degree
’counterclockwise
SD=(720−(TCHD−SUND))%360
ND=(SD+180)%360
RETURN

@ROTATE
’Paint twice to avoid the bug
GPAINT OX+PR,OY+PR,BC2,CC
GPAINT OX+PR,OY+PR,BC,CC
’South
C=SC:WD=5
BD=SD−WD:ED=SD+WD
GOSUB @DRAW_NEEDLE
’North
C=NC:WD=5
BD=ND−WD:ED=ND+WD
GOSUB @DRAW_NEEDLE
RETURN

@DRAW_NEEDLE
BD=FLOOR(BD+0.5)
ED=FLOOR(ED+0.5)
IF BD<0 THEN GOSUB @DRAW_NEEDLE1
IF ED>360 THEN GOSUB @DRAW_NEEDLE2
IF BD==ED THEN RETURN
FOR R=PR+2 TO CR−8
 GCIRCLE OX,OY,R,C,BD,ED
NEXT
RETURN

@DRAW_NEEDLE1
FOR R=PR+2 TO CR−8
 GCIRCLE OX,OY,R,C,BD+360,360
NEXT
BD=0
RETURN

@DRAW_NEEDLE2
FOR R=PR+2 TO CR−8
 GCIRCLE OX,OY,R,C,0,ED−360
NEXT
ED=360
RETURN

@ADJUST
GOSUB @ADJUST_ENTRY
GOSUB @ADJUST_MAIN
GOSUB @ADJUST_EXIT
RETURN

@ADJUST_ENTRY
GCLS
GOSUB @SHOW_BGMAP
GOSUB @DRAW_GRID
GOSUB @DRAW_INIT_PTR
RETURN

@ADJUST_MAIN
VSYNC 1
IF TCHST THEN GOSUB @ADJUST_LOCATION
BTN=BTRIG()
IF BTN AND 16 THEN RETURN
IF BTN AND 128 THEN GOSUB @INPUT_LOCATION
GOTO @ADJUST_MAIN
RETURN

@ADJUST_EXIT
GOSUB @HIDE_BGMAP
GOSUB @DRAW_COMPASS
RETURN

@SHOW_BGMAP
BGOFS 0,0,24*8
BGOFS 1,0,24*8
RETURN

@HIDE_BGMAP
BGOFS 0,0,0
BGOFS 1,0,0
RETURN

@DRAW_GRID
FOR GX=0 TO 255 STEP DX
 GLINE GX,0,GX,191,GC
NEXT
FOR GY=0 TO 191 STEP DY
 GLINE 0,GY,255,GY,GC
NEXT
RETURN

@DRAW_INIT_PTR
TX=FLOOR((LONG−120)*DX/5+0.5)
TY=FLOOR((45−LAT)*DY/5+0.5)
GDRAWMD 1
GLINE TX,0,TX,191,PC
GLINE 0,TY,255,TY,PC
GDRAWMD 0
LOCATE 0,15:? ” ”*32*7
LOCATE 0,15
CLS:LOCATE 0,0
? ”TOUCH YOUR LOCATION ON THE MAP.”
?
? ”− PRESS Х TO INPUT YOUR DETAIL”
? ”  LOCATION.”
? ”− PRESS Ф TO RETURN.”
LOCATE 0,15
? ”LAT=”;LAT,”LONG=”;LONG
RETURN

@ADJUST_LOCATION
VSYNC 1
IF TCHST THEN:ELSE @ENDIF_AP
 GDRAWMD 1
 GLINE TX,0,TX,191,PC
 GLINE 0,TY,255,TY,PC
 TX=TCHX:TY=TCHY
 GLINE TX,0,TX,191,PC
 GLINE 0,TY,255,TY,PC
 GDRAWMD 0
 GOTO @ADJUST_LOCATION
@ENDIF_AP
LAT=45−TY*5/DY
IF TX<8*BX AND TY<8*BY THEN LAT=LAT−15
LONG=120+TX*5/DX
LOCATE 0,15:? ” ”*32*7;
LOCATE 0,15
? ”LAT=”;LAT,”LONG=”;LONG
RETURN

@INPUT_LOCATION
CLS:LOCATE 0,0
? ”INPUT YOUR LOCATION IN DEGREE.”
LOCATE 0,15
? ”LAT=”;LAT,”LONG=”;LONG
@INPUT_LAT
LOCATE 0,17
LINPUT ”NORTH LATITUDE: LAT=?”;L$
IF L$==”” THEN @INPUT_LONG
L=VAL(L$)
IF L<23.44 OR 90<L THEN ? ”OUT OF RANGE.”:GOTO @INPUT_LAT
LAT=L
@INPUT_LONG
LINPUT ”EAST LONGITUDE: LONG=?”;L$
IF L$==”” THEN @INPUT_DONE
L=VAL(L$)
IF L<−180 OR 180<L THEN ? ”OUT OF RANGE.”:GOTO @INPUT_LONG
LONG=L
@INPUT_DONE
WAIT 30
GDRAWMD 1
GLINE TX,0,TX,191,PC
GLINE 0,TY,255,TY,PC
GDRAWMD 0
GOSUB @DRAW_INIT_PTR
RETURN

@PUT_BGMAP
’LOAD ”SCU1:OK_JMAP1”,FALSE
RESTORE @BGMAP
FOR J=0 TO 23
 READ D$
 FOR I=0 TO 31
  IDX=FLOOR(I/4)
  MDR=POW(2,3−I%4)
  IF VAL(”&H”+MID$(D$,IDX,1)) AND MDR THEN SCRD=&H8025 ELSE SCRD=&H800A
  BGPUT 1,I,24+J,SCRD
 NEXT
NEXT
BGFILL 0,0,24,BX,24+BY,&H000E
BGFILL 0,0,24,BX−1,24+BY−1,&H0000
RETURN

@BGMAP
DATA 00000020
DATA 00000038
DATA 0000003E
DATA 0010007C
DATA 000000D8
DATA 00400080
DATA 00800040
DATA 000000E0
DATA 080000E0
DATA 000000E0
DATA 000002E0
DATA 000001C0
DATA 00000BC0
DATA 00010FC0
DATA 00001F80
DATA 0003FF80
DATA 0007FF00
DATA 00265800
DATA 0009D000
DATA 005D8000
DATA 000C0000
DATA 000C0000
DATA 00000000
DATA 00080000
}}

/////////////////////////////////
// コメントを募集したくないなら、ここから下は削除してください

* CHECKER FLAG (ひとことコメント) [#Comments]
この作品に対するコメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は[[掲示板>Board]]へ)
- ''投稿者'' : ご意見ご要望があればぜひ。 (&new{2012/05/20 (日) 02:15:27};)
- ''しーきゃ'' : 計算結果で表示される変数の意味( EOT=時間の方程式 とか)をここの説明にのせたらいいんじゃないでしょうか (&new{2012/05/20 (日) 22:10:42};)
- ''名無しさん'' : あんまり自分でも分かっていないからなあ。とりあえず参考URLをひとつ載せました。 (&new{2012/05/21 (月) 07:07:27};)
- ''投稿者'' : あと、AZの基準の説明の間違いをこそっと修正。 (&new{2012/05/21 (月) 07:09:45};)
- ''名無しさん'' : 画像が大きすぎてQRコードが表示されない (&new{2012/05/22 (火) 03:02:10};)
- ''名無しさん'' : 注意がクソワロタ (&new{2012/05/22 (火) 15:45:12};)
- ''名無しさん'' : &basic{えいごがわからないYO( ´ー`)ふうー}; (&new{2012/05/22 (火) 15:51:50};)
- ''投稿者'' : QRコードを分割画像(縦横2倍)にして1ファイルのサイズを小さくしました。 (&new{2012/05/24 (木) 01:14:15};)
- ''投稿者'' : ついでに参考URLを増やしたりしていじってみました。 (&new{2012/05/24 (木) 01:24:41};)
- ''カービィ★KIRBY'' : 上画面の説明文がぁぁぁっ! わか蘭っ!!! (&new{2012/06/03 (日) 14:04:33};)
- ''ウイング'' : なにこれすごい (&new{2012/06/04 (月) 19:31:57};)
- ''Amako Soft'' : やべえ面白そう (&new{2012/06/13 (水) 18:52:50};)
- ''nao sato'' : 英語だったので和訳してみました。 (&new{2013/01/30 (水) 20:05:00};)
- ''ヨッシー'' : プチコン3号にうつそうとおもったけど、50行ほどいったところで400行は、無理だ。と思い考え中。 (&new{2015/07/08 (水) 01:03:59};)
- ''投稿者'' : 3号に移植しました。一応モーションセンサー対応。公開キー:X3SK4P4Y (&new{2015/10/02 (金) 00:21:28};)

#comment

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.014 秒 | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30