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

投稿プログラム : 羅針盤DS

パンくずリスト

2012年5月20日投稿 / 投稿者 : Oskar / タグ : 投稿プログラム 実用ツール QRコード mkII専用

概要

キミの DS(DSi/DSi LL/3DS)がコンパス(方位磁針)になる! *1

使い方

操作

  1. プログラムを起動します。
  2. 外に出てお日様の光を浴びます。
  3. DS を下画面が水平になるように持ちます。
  4. タッチペンを DS の下画面と垂直になるように持ちます。
  5. タッチペンの影が中央の点の上を通る場所までスライドしてタッチペンを DS から離します。
    • スライド中もタッチペンは傾けないでください。
    • スライド中に表示されるガイドラインに影を合わせても同じことです。
    • 中心から離れたところで離すほうがよいです。
  6. 「コンパス」の赤い「針」の示した方向が「北」です。
  • DS の向きを変えたり場所を移動したりしたら上記を繰り返します。
  • X ボタンで終了します。

設定

起動すると現在地を勝手に東京(新宿)と決め付けますが、A ボタンで変更できます。

  • いい加減な日本地図が表示されるので、だいたいの場所をタッチしてください。
  • いい加減が嫌いなひとや、地図の範囲外にいるときは、Y ボタンで経度・緯度による位置の入力ができます。
  • 現在地を設定したら A ボタンで戻ります。

注意

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

詳細

計算結果の表示

「針」を北へ向けるために、太陽の見える方角を計算しています。

  • AZ (方位角)として、真北が0度の時計回りの角度で表示

コンパスや地図の表示はアレですが、一応こんなことも考慮しています。

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

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

隠し機能

「針」を動かすのには関係ありませんが、ついでなので太陽の高度も出しています。

  • ALT (高度)として、水平が0度の正負の角度で表示

計算に使う日時を固定できます。システム変数 MEM$ に次のような書式で値を代入してプログラムを起動します。

  • 【例】 2012年5月21日7時31分59秒 に固定する場合

    MEM$=”FIXDATETIME=20120521073159”

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

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

スクリーンショット・動画

ええと、誠意検討中です。

QR コード

プチコンmkII 向けの QR コードです。

PRG:OK_RADS1
1/52/53/5
rev2-qr0.pngrev2-qr1.pngrev2-qr2.png
4/55/5全 QR まとめ画像
rev2-qr3.pngrev2-qr4.pngここ

プログラムリスト

  1. ’====================
  2. ’Rashimban DS
  3. ’OK_RADS1: 2012.05.20
  4. ’(C) Oskar
  5. ’====================
  6. GOSUB @INITIALIZE
  7. GOSUB @DRAW_COMPASS
  8. GOSUB @PUT_BGMAP
  9. GOSUB @MAIN
  10. GOSUB @FINALIZE
  11. END
  12. @INITIALIZE
  13. CLEAR
  14. ACLS:PNLTYPE ”OFF”
  15. GPAGE 1:GPRIO 2
  16. BGPAGE 1
  17. BC=15:BC2=30:OC=5:CC=10
  18. NC=2:SC=13
  19. LC=4 XOR 15
  20. GC=1:PC=12 XOR 0
  21. OX=128:OY=96:CR=80:PR=4
  22. ND=0:SD=180
  23. BX=14:BY=10
  24. DX=8*6:DY=8*8
  25. ’Default location (Shinjuku, Tokyo)
  26. LAT=35.69   ’North latitude
  27. LONG=139.69 ’East longitude
  28. ’JST location (Akashi, Hyogo)
  29. JSTLONG=135 ’East longitude
  30. RETURN
  31. @DRAW_COMPASS
  32. GDRAWMD 0:GCLS BC
  33. GCIRCLE OX,OY,PR,CC
  34. GCIRCLE OX,OY,CR,CC
  35. GPAINT OX,OY,OC
  36. CLS:LOCATE 0,0
  37. ? ”* INSTRUCTIONS *”
  38. ? ”1) GO OUT IN THE SUN.”
  39. ? ”2) HOLD YOUR DS HORIZONTALLY.”
  40. ? ”3) HOLD YOUR PEN VERTICALLY.”
  41. ? ”4) SLIDE YOUR PEN AND RELEASE”
  42. ? ”   IT WHERE THE SHADOW OF THE”
  43. ? ”   PEN IS JUST THROUGH THE ”
  44. ? ”   CENTER OF THE COMPASS.”
  45. ? ”5) THEN THE RED EDGE OF THE”
  46. ? ”   NEEDLE SHOWS THE NORTH.”
  47. ? ”− PRESS А TO SET YOUR LOCATION.”
  48. ? ”− PRESS Ф TO EXIT.”
  49. GOSUB @ROTATE
  50. RETURN
  51. @MAIN
  52. VSYNC 1
  53. IF TCHST THEN GOSUB @SENSE
  54. BTN=BTRIG()
  55. IF BTN AND 64 THEN RETURN
  56. IF BTN AND 16 THEN GOSUB @ADJUST
  57. GOTO @MAIN
  58. @FINALIZE
  59. GPAGE 0:GPRIO 3
  60. BGPAGE 0
  61. ACLS
  62. RETURN
  63. @SENSE
  64. IF TCHST THEN:ELSE @ENDIF_SENSE
  65.  X=TCHX:Y=TCHY
  66.  GDRAWMD 1
  67.  GLINE OX,OY,X,Y,LC
  68.  VSYNC 1
  69.  GLINE OX,OY,X,Y,LC
  70.  GDRAWMD 0
  71.  GOTO @SENSE
  72. @ENDIF_SENSE
  73. GOSUB @ORIENT
  74. GOSUB @ROTATE
  75. RETURN
  76. @ORIENT
  77. GOSUB @GET_JST ’Japan Standard Time (Mean solar time at Akashi)
  78. GOSUB @GET_EOT ’Equation Of Time
  79. GOSUB @GET_TDM ’Time difference from JST
  80. GOSUB @GET_HOUR_ANGLE
  81. GOSUB @GET_DECLINATION
  82. GOSUB @GET_AZIMUTH
  83. GOSUB @GET_ALTITUDE ’For information purpose only
  84. GOSUB @GET_ANGLE ’North/South
  85. LOCATE 0,15:? ” ”*32*7;
  86. LOCATE 0,15
  87. ? ”LAT=”;LAT,”LONG=”;LONG
  88. ? ”DATE=”;YY;”/”;MM;”/”;DD;” (”;N;”)”
  89. ? ”TIME=”;H;”:”;M;”:”;S;” ”
  90. ? ”EOT=”;EOT,”TDM=”;TDM
  91. ? ”HA=”;HA,”DEC=”;DEC
  92. ? ”AZ=”;AZ,”ALT=”;ALT
  93. ? ”TCHD=”;TCHD
  94. ? ”ND=”;ND,”SD=”;SD
  95. RETURN
  96. @GET_JST
  97. IF LEFT$(MEM$,12)==”FIXDATETIME=” THEN:ELSE @ENDIF_GJ
  98.  YY=VAL(MID$(MEM$,12+0,4))
  99.  MM=VAL(MID$(MEM$,12+4,2))
  100.  DD=VAL(MID$(MEM$,12+6,2))
  101.  H=VAL(MID$(MEM$,12+8,2))
  102.  M=VAL(MID$(MEM$,12+10,2))
  103.  S=VAL(MID$(MEM$,12+12,2))
  104.  RETURN
  105. @ENDIF_GJ
  106. DTREAD(DATE$),YY,MM,DD
  107. TMREAD(TIME$),H,M,S
  108. RETURN
  109. @GET_EOT
  110. ’Current days since Jan 1, 2000
  111. N=DD
  112. RESTORE @DAYS_A_MONTH
  113. @DAYS_A_MONTH
  114. DATA 31,28,31,30,31,30,31,31,30,31,30,31
  115. FOR I=1 TO MM−1
  116.  READ DM:N=N+DM
  117. NEXT
  118. N=N+(YY%4==0 AND YY%100>0 OR YY%400==0)
  119. FOR Y2K=0 TO YY−1−2000
  120.  N=N+365+(Y2K%4==0 AND Y2K%100>0 OR Y2K%400==0)
  121. NEXT
  122. ’Mean anomaly normalized
  123. ’in days in a tropical year
  124. ’(perihelion: about Jan. 4)
  125. MA=2*PI()*(N−4)/365.242
  126. ’Equation of time in minute
  127. ’(from Wikipedia [en])
  128. EOT=−7.657*SIN(MA)+9.862*SIN(2*MA+3.599)
  129. RETURN
  130. @GET_TDM
  131. ’Time difference in degree
  132. TDD=LONG−JSTLONG
  133. ’Time difference in minute
  134. TDM=24*60*TDD/360
  135. RETURN
  136. @GET_HOUR_ANGLE
  137. ’0 degree at noon
  138. HA=(H−12)*15+(M+EOT+TDM)/4+S/240
  139. RETURN
  140. @GET_DECLINATION
  141. ’(vernal equinox: about Mar. 20/21)
  142. ECLONG=2*PI()*(N−80.242)/365.242
  143. DEC=23.44*SIN(ECLONG)
  144. RETURN
  145. @GET_AZIMUTH
  146. ’deg−>rad conversion
  147. ’avoid RAD(x) for non−integral x.
  148. HAR=PI()*HA/180
  149. LATR=PI()*LAT/180
  150. DECR=PI()*DEC/180
  151. ’Coordinate conversion
  152. ’equatorial−>horizontal
  153. ’(from Wikipedia [en])
  154. SINAZCOSALT=−COS(DECR)*SIN(HAR)
  155. COSAZCOSALT=COS(LATR)*SIN(DECR)−SIN(LATR)*COS(DECR)*COS(HAR)
  156. AZR=ATAN(SINAZCOSALT,COSAZCOSALT)
  157. AZ=(DEG(AZR)+360)%360
  158. RETURN
  159. @GET_ALTITUDE
  160. ’No need for needle rotation
  161. COSALT=SINAZCOSALT/SIN(AZR)
  162. SINALT=SIN(LATR)*SIN(DECR)+COS(LATR)*COS(DECR)*COS(HAR)
  163. ALT=DEG(ATAN(SINALT,COSALT))
  164. IF ALT>90 THEN ALT=180−ALT
  165. IF ALT<−90 THEN ALT=−180−ALT
  166. RETURN
  167. @GET_ANGLE
  168. SUND=AZ
  169. TCHD=(DEG(ATAN(Y−OY,X−OX))+360)%360
  170. ’North/South angle in degree
  171. ’counterclockwise
  172. SD=(720−(TCHD−SUND))%360
  173. ND=(SD+180)%360
  174. RETURN
  175. @ROTATE
  176. ’Paint twice to avoid the bug
  177. GPAINT OX+PR,OY+PR,BC2,CC
  178. GPAINT OX+PR,OY+PR,BC,CC
  179. ’South
  180. C=SC:WD=5
  181. BD=SD−WD:ED=SD+WD
  182. GOSUB @DRAW_NEEDLE
  183. ’North
  184. C=NC:WD=5
  185. BD=ND−WD:ED=ND+WD
  186. GOSUB @DRAW_NEEDLE
  187. RETURN
  188. @DRAW_NEEDLE
  189. BD=FLOOR(BD+0.5)
  190. ED=FLOOR(ED+0.5)
  191. IF BD<0 THEN GOSUB @DRAW_NEEDLE1
  192. IF ED>360 THEN GOSUB @DRAW_NEEDLE2
  193. IF BD==ED THEN RETURN
  194. FOR R=PR+2 TO CR−8
  195.  GCIRCLE OX,OY,R,C,BD,ED
  196. NEXT
  197. RETURN
  198. @DRAW_NEEDLE1
  199. FOR R=PR+2 TO CR−8
  200.  GCIRCLE OX,OY,R,C,BD+360,360
  201. NEXT
  202. BD=0
  203. RETURN
  204. @DRAW_NEEDLE2
  205. FOR R=PR+2 TO CR−8
  206.  GCIRCLE OX,OY,R,C,0,ED−360
  207. NEXT
  208. ED=360
  209. RETURN
  210. @ADJUST
  211. GOSUB @ADJUST_ENTRY
  212. GOSUB @ADJUST_MAIN
  213. GOSUB @ADJUST_EXIT
  214. RETURN
  215. @ADJUST_ENTRY
  216. GCLS
  217. GOSUB @SHOW_BGMAP
  218. GOSUB @DRAW_GRID
  219. GOSUB @DRAW_INIT_PTR
  220. RETURN
  221. @ADJUST_MAIN
  222. VSYNC 1
  223. IF TCHST THEN GOSUB @ADJUST_LOCATION
  224. BTN=BTRIG()
  225. IF BTN AND 16 THEN RETURN
  226. IF BTN AND 128 THEN GOSUB @INPUT_LOCATION
  227. GOTO @ADJUST_MAIN
  228. RETURN
  229. @ADJUST_EXIT
  230. GOSUB @HIDE_BGMAP
  231. GOSUB @DRAW_COMPASS
  232. RETURN
  233. @SHOW_BGMAP
  234. BGOFS 0,0,24*8
  235. BGOFS 1,0,24*8
  236. RETURN
  237. @HIDE_BGMAP
  238. BGOFS 0,0,0
  239. BGOFS 1,0,0
  240. RETURN
  241. @DRAW_GRID
  242. FOR GX=0 TO 255 STEP DX
  243.  GLINE GX,0,GX,191,GC
  244. NEXT
  245. FOR GY=0 TO 191 STEP DY
  246.  GLINE 0,GY,255,GY,GC
  247. NEXT
  248. RETURN
  249. @DRAW_INIT_PTR
  250. TX=FLOOR((LONG−120)*DX/5+0.5)
  251. TY=FLOOR((45−LAT)*DY/5+0.5)
  252. GDRAWMD 1
  253. GLINE TX,0,TX,191,PC
  254. GLINE 0,TY,255,TY,PC
  255. GDRAWMD 0
  256. LOCATE 0,15:? ” ”*32*7
  257. LOCATE 0,15
  258. CLS:LOCATE 0,0
  259. ? ”TOUCH YOUR LOCATION ON THE MAP.”
  260. ? ”− PRESS Х TO INPUT YOUR DETAIL”
  261. ? ”  LOCATION.”
  262. ? ”− PRESS Ф TO RETURN.”
  263. LOCATE 0,15
  264. ? ”LAT=”;LAT,”LONG=”;LONG
  265. RETURN
  266. @ADJUST_LOCATION
  267. VSYNC 1
  268. IF TCHST THEN:ELSE @ENDIF_AP
  269.  GDRAWMD 1
  270.  GLINE TX,0,TX,191,PC
  271.  GLINE 0,TY,255,TY,PC
  272.  TX=TCHX:TY=TCHY
  273.  GLINE TX,0,TX,191,PC
  274.  GLINE 0,TY,255,TY,PC
  275.  GDRAWMD 0
  276.  GOTO @ADJUST_LOCATION
  277. @ENDIF_AP
  278. LAT=45−TY*5/DY
  279. IF TX<8*BX AND TY<8*BY THEN LAT=LAT−15
  280. LONG=120+TX*5/DX
  281. LOCATE 0,15:? ” ”*32*7;
  282. LOCATE 0,15
  283. ? ”LAT=”;LAT,”LONG=”;LONG
  284. RETURN
  285. @INPUT_LOCATION
  286. CLS:LOCATE 0,0
  287. ? ”INPUT YOUR LOCATION IN DEGREE.”
  288. LOCATE 0,15
  289. ? ”LAT=”;LAT,”LONG=”;LONG
  290. @INPUT_LAT
  291. LOCATE 0,17
  292. LINPUT ”NORTH LATITUDE: LAT=?”;L$
  293. IF L$==”” THEN @INPUT_LONG
  294. L=VAL(L$)
  295. IF L<23.44 OR 90<L THEN ? ”OUT OF RANGE.”:GOTO @INPUT_LAT
  296. LAT=L
  297. @INPUT_LONG
  298. LINPUT ”EAST LONGITUDE: LONG=?”;L$
  299. IF L$==”” THEN @INPUT_DONE
  300. L=VAL(L$)
  301. IF L<−180 OR 180<L THEN ? ”OUT OF RANGE.”:GOTO @INPUT_LONG
  302. LONG=L
  303. @INPUT_DONE
  304. WAIT 30
  305. GDRAWMD 1
  306. GLINE TX,0,TX,191,PC
  307. GLINE 0,TY,255,TY,PC
  308. GDRAWMD 0
  309. GOSUB @DRAW_INIT_PTR
  310. RETURN
  311. @PUT_BGMAP
  312. ’LOAD ”SCU1:OK_JMAP1”,FALSE
  313. RESTORE @BGMAP
  314. FOR J=0 TO 23
  315.  READ D$
  316.  FOR I=0 TO 31
  317.   IDX=FLOOR(I/4)
  318.   MDR=POW(2,3−I%4)
  319.   IF VAL(”&H”+MID$(D$,IDX,1)) AND MDR THEN SCRD=&H8025 ELSE SCRD=&H800A
  320.   BGPUT 1,I,24+J,SCRD
  321.  NEXT
  322. NEXT
  323. BGFILL 0,0,24,BX,24+BY,&H000E
  324. BGFILL 0,0,24,BX−1,24+BY−1,&H0000
  325. RETURN
  326. @BGMAP
  327. DATA 00000020
  328. DATA 00000038
  329. DATA 0000003E
  330. DATA 0010007C
  331. DATA 000000D8
  332. DATA 00400080
  333. DATA 00800040
  334. DATA 000000E0
  335. DATA 080000E0
  336. DATA 000000E0
  337. DATA 000002E0
  338. DATA 000001C0
  339. DATA 00000BC0
  340. DATA 00010FC0
  341. DATA 00001F80
  342. DATA 0003FF80
  343. DATA 0007FF00
  344. DATA 00265800
  345. DATA 0009D000
  346. DATA 005D8000
  347. DATA 000C0000
  348. DATA 000C0000
  349. DATA 00000000
  350. DATA 00080000

CHECKER FLAG (ひとことコメント)

この作品に対するコメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は掲示板へ)

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

*1 5/20: 当初のQRコードとプログラムリストは172行目のRETURNが抜けていたのでこそっと修正しました。

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