2012年5月20日投稿 / 投稿者 : Oskar / タグ : 投稿プログラム 実用ツール QRコード mkII専用
キミの DS(DSi/DSi LL/3DS)がコンパス(方位磁針)になる! *1
起動すると現在地を勝手に東京(新宿)と決め付けますが、A ボタンで変更できます。
「針」を北へ向けるために、太陽の見える方角を計算しています。
コンパスや地図の表示はアレですが、一応こんなことも考慮しています。
他にもいくつか、Wikipedia(英語版)の この辺 の式をこねくり回す過程で出てくる計算結果を表示しています。興味あればプログラムリストと Web を探してください。
「針」を動かすのには関係ありませんが、ついでなので太陽の高度も出しています。
計算に使う日時を固定できます。システム変数 MEM$ に次のような書式で値を代入してプログラムを起動します。
MEM$=”FIXDATETIME=20120521073159”
以上から、ある場所で日食などのイベントが起こる日時を知っていれば、そのとき、その場所での太陽の位置もだいたい分かります。
……ということで、時節柄、投稿を急いだのでした。
ええと、誠意検討中です。
プチコンmkII 向けの QR コードです。
PRG:OK_RADS1 | ||
---|---|---|
1/5 | 2/5 | 3/5 |
4/5 | 5/5 | 全 QR まとめ画像 |
ここ |
- ’====================
- ’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
この作品に対するコメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は掲示板へ)
*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.155 秒 | このページの最終更新 : 2022/09/20 (火) 12:44:03 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30