プチコンまとめArchive

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

パンくずリスト

このページの最終更新 : 2022/09/20 (火) 12:44:03

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