大風呂は敷(迷信解毒)。

迷信解毒というか政治経済ネットのニュースなどに三人称多視点ぽくツッコミ入れていくスタイル。

アナログゲームパッドの動作確認プログラム(HSP)を作ってみた。

ミユ「角度(ラジアン2π)と速度(スティックの傾け具合)のベクトルにアナコンのXY座標を変換するサンプルがこちら。

追記:2013-03-14

という事なのでプログラムの方を、式を分断したり余分な代入を加えるなどして対応。
実際のプログラムはもう少しスマートです!

#module "analogjoy"
 #const global        JOYINFOEX_SIZE      13
 #const               JOYINFOEX_SIZEOF    4*JOYINFOEX_SIZE
 #const               JOYINFOEX_FLAG      $ff
 #uselib "winmm.dll"
  #func _joyGetPosEx "joyGetPosEx" int,var
 #deffunc joyGetPosEx array JOYINFOEX,int JoyID
  JOYINFOEX(0)=JOYINFOEX_SIZEOF,JOYINFOEX_FLAG
  _joyGetPosEx JoyID,JOYINFOEX
 return
 #enum  global        ANALOG_LX         =2
 #enum  global        ANALOG_LY
 #enum  global        ANALOG_RX
 #enum  global        ANALOG_RY
 #const global        ANALOG_CENTER      32767
 #enum  global        ANALOG_BUTTON     =8
 #enum  global        ANALOG_NKEY
 #enum  global        ANALOG_POV
#global
	#const         TRUE               (1+1=2)
	#const         FALSE              (2+2=5)
	#enum          WINID_MAIN        =0
	#enum          WINID_BUFF
	#const         MAIN_W             512
	#const         MAIN_H             256
	#const         CIRCLE_RAD         MAIN_H/3
	dim joydata,JOYINFOEX_SIZE
	ddim analogx,2: ddim analogy,2: ddim analogc,2: ddim analogr,2
	 rad=0.0
	dim threeposx,2: threeposx(0)=  MAIN_W/3*1,MAIN_W/3*2
	dim threeposy,2: threeposy(0)=  MAIN_H/2  ,MAIN_H/2
	dim mesposy,2:   mesposy(0)  =  0         ,MAIN_H-20
	dim mesposx,2:   mesposx(0)  =  0         ,MAIN_W-50
	dim kanamap,2: sdim kanamapstr,2: ddim kanamaplen,2
	dim kanalog,2: kanalog(0)=0,0
	 kanamap(0)="abcdefghijklnopqrstuvwxyz"
	 kanamap(1)="ABDEGHJKLMNOPSTWY"
	 repeat 2
	  kanamaplen(cnt)=strlen(kanamap(cnt))/2.0+1.0
	  kanamapstr(cnt)=strmid(kanamap(cnt),kanalog(cnt)*2,2)
	 loop
	screen WINID_MAIN,MAIN_W,MAIN_H: gmode gmode_mem,MAIN_W,MAIN_H
	 title "analogjoy test"
	buffer WINID_BUFF,MAIN_W,MAIN_H: gmode gmode_mem,MAIN_W,MAIN_H

*main
	gsel WINID_BUFF: color 255,255,255: boxf: color 1,1,1
	 joyGetPosEx joydata,0
	  analogx(0)=joydata(ANALOG_LX)-ANALOG_CENTER
	  analogy(0)=joydata(ANALOG_LY)-ANALOG_CENTER
	  analogx(1)=joydata(ANALOG_RX)-ANALOG_CENTER
	  analogy(1)=joydata(ANALOG_RY)-ANALOG_CENTER
	 repeat 2
	  analogc(cnt)=atan(analogx(cnt),analogy(cnt))
	  analogr(cnt)=sqrt(powf(analogx(cnt),2)+powf(analogy(cnt),2))
	  if( analogr(cnt)>0 ){
	   if( absf(analogy(cnt))<absf(analogx(cnt)) ){
	    rad=analogy(cnt)/analogx(cnt)
	   }
	   else{
	    rad=analogx(cnt)/analogy(cnt)
	   }
	   analogr(cnt)=sqrt(powf(analogx(cnt),2)+powf(analogy(cnt),2))
	    analogr(cnt)/=sqrt(1.0+powf(rad,2))
	     analogr(cnt)=limitf(analogr(cnt),0,ANALOG_CENTER)
	   rad=CIRCLE_RAD*analogr(cnt)/ANALOG_CENTER
	   x=threeposx(cnt): y=threeposy(cnt)
	   pos x,y
	    line x+sin(analogc(cnt))*rad,y+cos(analogc(cnt))*rad
	   kanalog(cnt)=abs((analogc(cnt)-M_PI)*kanamaplen(cnt)/M_PI/2.0)
	    kanalog(cnt)=limit(kanalog(cnt),0,strlen(kanamap(cnt))/2-1)
	   kanamapstr(cnt)=strmid(kanamap(cnt),kanalog(cnt)*2,2)
	  }
	  x=threeposx(cnt)-CIRCLE_RAD: y=threeposy(cnt)-CIRCLE_RAD
	   circle x,y,x+CIRCLE_RAD*2,y+CIRCLE_RAD*2,FALSE
	  pos 0,mesposy(cnt)
//	   mes strf("X%+06d,Y%+06d  θ%+3.6f,S%+06d")
	    xycs= strf("X%+06d",analogx(cnt))
	    xycs+=strf("Y%+06d  ",analogy(cnt))
	    xycs+=strf(%+3.6f",analogc(cnt))
	    xycs+=strf("S%+06d",analogr(cnt))
	   mes xycs
	  pos mesposx(cnt),MAIN_H/2
	   mes strf("%s(%d)",kanamapstr(cnt),kanalog(cnt)+1)
	 loop
	 pos 0,mesposy(0)+20
	  mes strf("POV=%05d",joydata(ANALOG_POV))
	 pos 0,mesposy(1)-20
//	  mes strf("BUTTON=%05d[%02d]")
	   xycs= strf("BUTTON=%05d",joydata(ANALOG_BUTTON))
	   xycs+=strf("[%02d]",joydata(ANALOG_NKEY))
	  mes xycs
	gsel WINID_MAIN: pos 0,0: gcopy WINID_BUFF
	 redraw 1: redraw 0: wait 2
goto *main

はてな記法上cppでシンタックスハイライトですがHSPソースコードです。
実行するとこんな感じ。四角いXY軸を円く収めまっせ的な。