2009年1月18日日曜日

リンクシミュレータ的な?

簡易リンクシミュレータ なるものをちょいとこしらえました。
データの打ち込みがめんどくさいですけど、 そこそこ 使えるかも(?


#define POS_X 0
#define POS_Y 1

#define LINK_LEN_1 2
#define LINK_LEN_2 3

#define SPEED 8

#define CENTER_X 2
#define CENTER_Y 3

#define LINK_1 0
#define LINK_2 1

#define MODE 3

#define FREE 0
#define PIN 1
#define MOTOR 2
#define MOTOR_R 3

#define END_DATA 2

#define PEN 7
#define ON_ 1
#define OFF_ 0

#define _MODE data2(id,MODE)
#define _SPEED data1(id,SPEED)
#define _POS_X data1(id,POS_X)
#define _POS_Y data1(id,POS_Y)
#define _CENTER_X data1(id,CENTER_X)
#define _CENTER_Y data1(id,CENTER_Y)
#define _PEN data2(id,PEN)
#define _LINK_1 data2(id,LINK_1)
#define _LINK_2 data2(id,LINK_2)
#define _LINK_1_LEN data2(id,4)=1:data1(id,LINK_LEN_1)
#define _LINK_2_LEN data2(id,9)=1:data1(id,LINK_LEN_2)
#define END_OF_DATA data2(id,END_DATA)=END_DATA

goto *main
*datum
//////////////////////リンクデータ開始//////////////////////////



name="テオヤンセン リンク"

id=0
_MODE=MOTOR_R //モータを定義する
_SPEED=10.0 //スピード [DEG per TURN]

_POS_X=50.0 //モータ作業点初期位置 X
_POS_Y=25.0 //モータ作業点初期位置 Y
_CENTER_X=_POS_X-10 //モータ軸X
_CENTER_Y=_POS_Y+10 //モータ軸Y

id=1
_MODE=PIN //固定点を定義する

_POS_X=0.0 //固定点位置 X
_POS_Y=0.0 //固定点位置 Y

id=2
_MODE=FREE //自由点を定義する

_POS_X=0.0 //自由点初期位置 X
_POS_Y=50.0 //自由点初期位置 Y

_LINK_1=0 //接続される点a
_LINK_2=1 //接続される点b

id=3
_MODE=FREE //自由点を定義する

_POS_X=-50.0 //自由点初期位置 X
_POS_Y=0.0 //自由点初期位置 Y

_LINK_1=2 //接続される点a
_LINK_2=1 //接続される点b

id=4
_MODE=FREE //自由点を定義する

_POS_X=0.0 //自由点初期位置 X
_POS_Y=-75.0 //自由点初期位置 Y

_LINK_1=0 //接続される点a
_LINK_2=1 //接続される点b

id=5
_MODE=FREE //自由点を定義する

_POS_X=-40.0 //自由点初期位置 X
_POS_Y=-75.0 //自由点初期位置 Y

_LINK_1=4 //接続される点a
_LINK_2=3 //接続される点b

id=6
_MODE=FREE //自由点を定義する

_POS_X=0.0 //自由点初期位置 X
_POS_Y=-75.0-100.0 //自由点初期位置 Y

_LINK_1=4 //接続される点a
_LINK_2=5 //接続される点b
_PEN=ON_

id=6

/*
name="ごく普通のリンク"

id=0
_MODE=MOTOR_R //モータを定義する
_SPEED=10.0 //スピード [DEG per TURN]

_POS_X=0.0 //モータ作業点初期位置 X
_POS_Y=100.0 //モータ作業点初期位置 Y
_CENTER_X=0.0 //モータ軸X
_CENTER_Y=0.0 //モータ軸Y

id=1
_MODE=PIN //固定点を定義する

_POS_X=200.0 //固定点位置 X
_POS_Y=0.0 //固定点位置 Y

id=2

_MODE=FREE //自由点を定義する

_POS_X=200.0 //自由点初期位置 X
_POS_Y=100.0 //自由点初期位置 Y

_LINK_1=0 //接続される点a
_LINK_1_LEN=200.0 //点aとの距離
_LINK_2=1 //接続される点b
_LINK_2_LEN=250.0 //点bとの距離

id=3

_MODE=FREE //自由点を定義する

_POS_X=0.0 //自由点初期位置 X
_POS_Y=260.0 //自由点初期位置 Y

_LINK_1=0 //接続される点a
_LINK_1_LEN=200.0 //点aとの距離
_LINK_2=2 //接続される点b
_LINK_2_LEN=200.0 //点bとの距離
_PEN=ON_

id=3
*/

////////////////////////////////////////////////////////////////
id+
END_OF_DATA //終了
id=0
//////////////////////リンクデータ終了//////////////////////////
title "簡易リンクシミュレータ -"+name+"-"
return

#define napier 2.718281828459045235360287471352
#define once repeat
#define end_once break %c loop
#define ctype stogx(%1) (( (%1)-offsetx )*(bai)+ginfo_winx/2)
#define ctype stogy(%1) (((%1)-offsety )*(-1.0)*(bai)+ginfo_winy/2)
#define ctype pp(%1) ((%1)*(%1))
#define ctype leng(%1,%2,%3, %4) (sqrt( pp((%1)-(%3))+pp((%2)-(%4))))
#define pi 3.1415926535897932384626433832795028841971
#define mmousex ((ginfo(0)-(ginfo(4)+(ginfo(10)-ginfo(12))/2)))
#define mmousey ((ginfo(1)-(ginfo(5)+(ginfo(11)-ginfo(13))-(ginfo(10)-ginfo(12))/2)))
*hankei
id=0
repeat
if data2(id,2)=2:id=0:break
if data2(id,3)=0{
if data2(id,4)=0{
data1(id,2)=leng(data1(data2(id,0),0),data1(data2(id,0),1),data1(id,0),data1(id,1))
data2(id,4)=1
}
if data2(id,9)=0{
data1(id,3)=leng(data1(data2(id,1),0),data1(data2(id,1),1),data1(id,0),data1(id,1))
data2(id,9)=1
}
}
id+
loop

return
*mem

bai=1.0 //表示倍率
offsetx=0 //表示中心 X
offsety=0 //表示中心 Y

gsel 3
color
boxf
gsel 0



waku=1
max=16
rate=1
c=4
ddim data1,max,9
dim data2,max,10

/*
data1

x
y
r1
r2
rad

data2

ID1
ID2
flag
0 未演算
1 演算済
2 エンド
att
0 自由
1 固定
2 モータ
*/


return

*draw
mes_ =""
repeat
color 128
line -1, stogy(0.0),ginfo_winx,stogy(0.0)
line stogx(0.0), -1,stogx(0.0),ginfo_winy
if data2(id,2)=2:id=0:break
data2(id,2)=0

if data2(id,3)=2||data2(id,3)=3{
color 0,128,0
line stogx(data1(id,0)),stogy(data1(id,1)),stogx(data1(id,2)),stogy(data1(id,3))
}
if data2(id,3)=0{
color 0,0,0
s1=data2(id,0)
s2=data2(id,1)
a1=data1(s1,0)
b1=data1(s1,1)
a2=data1(s2,0)
b2=data1(s2,1)
muri_lo=0
muri_lo1=0
randomize 287465827
randomize (id+33)*91+90+rnd(354265320)
du=rnd(256)
du=rnd(256)
du=rnd(256)
aa=rnd(3)
bb=3;rnd(3)
r=(rnd(128)+128)*(aa=0||bb=0)
g=(rnd(128)+128)*(aa=1||bb=1)
b=(rnd(128)+128)*(aa=2||bb=2)
if data2(id,6)=1:muri_lo=1
if data2(id,6)=2:muri_lo=2
if data2(id,5)=1:color r,g,b:muri_lo1=1
if data2(id,5)=2:color r,g,b:muri_lo1=2
line stogx(data1(id,0)),stogy(data1(id,1)),stogx(a1),stogy(b1)
line stogx(data1(id,0)),stogy(data1(id,1)),stogx(a2),stogy(b2)

if muri_lo{
color r,g,b
if muri_lo1=1:mes_=""+mes_+"点"+id+" において長さが足りません\n"
if muri_lo1=2:mes_=""+mes_+"点"+id+" において長すぎです。\n"
circle stogx(data1(data2(id,0),0)-data1(id,2)),stogy(data1(data2(id,0),1)-data1(id,2)),stogx(data1(data2(id,0),0)+data1(id,2)),stogy(data1(data2(id,0),1)+data1(id,2)),0
circle stogx(data1(data2(id,1),0)-data1(id,3)),stogy(data1(data2(id,1),1)-data1(id,3)),stogx(data1(data2(id,1),0)+data1(id,3)),stogy(data1(data2(id,1),1)+data1(id,3)),0
}
}
color 255,255,255
circle stogx(data1(id,0))-c,stogy(data1(id,1))-c,stogx(data1(id,0))+c,stogy(data1(id,1))+c,1
color 0,0,255
circle stogx(data1(id,0))-c,stogy(data1(id,1))-c,stogx(data1(id,0))+c,stogy(data1(id,1))+c,0
if data2(id,3)=1{
color 255,255,255
circle stogx(data1(id,0))-c,stogy(data1(id,1))-c,stogx(data1(id,0))+c,stogy(data1(id,1))+c,1
color 255,128,0
circle stogx(data1(id,0))-c,stogy(data1(id,1))-c,stogx(data1(id,0))+c,stogy(data1(id,1))+c,0
}

if data2(id,3)=2||data2(id,3)=3{
color 255,255,255
circle stogx(data1(id,2))-c,stogy(data1(id,3))-c,stogx(data1(id,2))+c,stogy(data1(id,3))+c,1
color 0,128,0
circle stogx(data1(id,2))-c,stogy(data1(id,3))-c,stogx(data1(id,2))+c,stogy(data1(id,3))+c,0
}

if pen_flag=1{
gsel 3
color
boxf
gsel 0
pen_flag=0
}
if data2(id,PEN)=ON_{
gsel 3
randomize 356745267875
randomize (id+33)*91+90+rnd(654356564)
du=rnd(256)
du=rnd(256)
du=rnd(256)
du=rnd(256)
aa=rnd(3)
bb=4;rnd(3)
r=(rnd(128)+128)*(aa=0||bb=0)
g=(rnd(128)+128)*(aa=1||bb=1)
b=(rnd(128)+128)*(aa=2||bb=2)
color r,g,b
if data2(id,8)=0:data2(id,8)=1: data1(id,6)=data1(id,0):data1(id,7)=data1(id,1)
line stogx(data1(id,6)),stogy(data1(id,7)),stogx(data1(id,0)),stogy(data1(id,1))
data1(id,6)=data1(id,0):data1(id,7)=data1(id,1)
gsel 0
}
color 0,0,255
pos stogx(data1(id,0))+10, stogy(data1(id,1))
mes id

id+
loop

pos 0,0
gmode 2,800,600
gcopy 3,0,0,800,600
color 255,0,0
pos waku+5,waku+5
mes mes_
pos ginfo_winx-120,5
mes "倍率"+bai
mes_ =""
color 0,0,0
if muri{
color 255,0,0
}

boxf 0,0,ginfo_winx,waku
boxf 0,0,waku,ginfo_winy
boxf 0,ginfo_winy-waku-1,ginfo_winx,ginfo_winy
boxf ginfo_winx-waku-1,0,ginfo_winx,ginfo_winx

return
*main



screen 0,800,600
buffer 3,800,600
gsel 3
color
boxf
gsel 0
onexit *exit
onclick gosub *oncli


gosub *mem
gosub *datum
gosub *hankei
id=0
rad=0.0

pos 0+3,ginfo_winy-21-3
objsize 88,21
button gosub "実行/停止",*strt_
loop_once=1
gosub *mainloop


repeat
wait 5
if shutu=1:shutu=0:break
loop
goto *strt
*mainloop
id=0
repeat

if data2(id,2)=0{
once
if data2(id,3)=2{
if data2(id,4)=0{
data2(id,4)=1
data1(id,4)=sqrt((data1(id,0)-data1(id,2))*(data1(id,0)-data1(id,2))+(data1(id,1)-data1(id,3))*(data1(id,1)-data1(id,3)))
data1(id,5)=pi+atan((data1(id,0)-data1(id,2)),(data1(id,1)-data1(id,3)))
}
r=data1(id,4)
rad=data1(id,5)
data1(id,0)=r*cos(rad)+data1(id,2)
data1(id,1)=r*sin(rad)+data1(id,3)
data1(id,5)+= pi*data1(id,8)/180.0
data2(id,2)=1
hen=1
break
}
if data2(id,3)=3{
if data2(id,4)=0{
data2(id,4)=1
data1(id,4)=sqrt((data1(id,0)-data1(id,2))*(data1(id,0)-data1(id,2))+(data1(id,1)-data1(id,3))*(data1(id,1)-data1(id,3)))
data1(id,5)=pi+atan((data1(id,0)-data1(id,2)),(data1(id,1)-data1(id,3)))
}
r=data1(id,4)
rad=data1(id,5)
data1(id,0)=r*cos(rad)+data1(id,2)
data1(id,1)=r*sin(rad)+data1(id,3)
data1(id,5)-= pi*data1(id,8)/180.0
data2(id,2)=1
hen=1
break
}
if data2(id,3)=0{
if ((((data2(data2(id,LINK_1),2)=1)|| (data2(data2(id,LINK_1),MODE))=PIN))&&(((data2(data2(id,LINK_2),2)=1)||(data2(data2(id,LINK_2),MODE))=PIN))){
s1=data2(id,LINK_1)
s2=data2(id,LINK_2)
a1=data1(s1,0)
b1=data1(s1,1)
a2=data1(s2,0)
b2=data1(s2,1)
r1=data1(id,2)
r2=data1(id,3)
l=0.0
l=leng(a1,b1,a2,b2)
rad_a=atan(sqrt(pp(2.0*r1*l)-pp(pp(r1)+pp(l)-pp(r2))),(pp(r1)+pp(l)-pp(r2)))
rad_b=atan(b2-b1,a2-a1)
nuke=0
iti=data2(id,5)

if l>=(r1+r2):muri=1:data2(id,5)=1:data2(id,6)=1:nuke=1:if iti!=1:hen=1
if abs(r1-r2)>=l:muri=1:data2(id,5)=2:data2(id,6)=2:nuke=1:if iti!=2:hen=1
if nuke=1:data2(id,2)=1:break
data2(id,5)=0

my1=sin(-rad_a+rad_b)*r1+b1
mx1=cos(-rad_a+rad_b)*r1+a1

my2=sin(rad_a+rad_b)*r1+b1
mx2=cos(rad_a+rad_b)*r1+a1

if leng(mx1,my1,data1(id,0),data1(id,1))<leng(mx2,my2,data1(id,0),data1(id,1)){
data1(id,0)=mx1
data1(id,1)=my1
}else{
data1(id,0)=mx2
data1(id,1)=my2
}
hen=1
data2(id,2)=1
break
}
}
if data2(id,3)=1{
hen=1
data2(id,2)=1
}
end_once
}


if data2(id,2)=2{
id=0
if hen=1{
hen=0:continue
}else{
color 255,255,255
boxf
color 0,0,0
gosub *draw
muri=0

redraw 1
if loop_once:loop_once=0:return
wait 5
redraw 0
mww=mousew
if (mww/120)>0{
bai*=(1.0+0.5)
pen_flag=1
offsetx=1.0*(-ginfo_winx/2+mmousex)/bai/napier+offsetx
offsety=-1.0*(-ginfo_winy/2+mmousey)/bai/napier+offsety
}

if (mww/120)<0{
bai*=(1.0/(1.0+0.5))
pen_flag=1
offsetx=-1.0*(-ginfo_winx/2+mmousex)/bai/napier+offsetx
offsety=1.0*(-ginfo_winy/2+mmousey)/bai/napier+offsety
}
getkey click_,1
if click=1&&click_once=0:click_once=1{
offsetx_=offsetx
offsety_=offsety
mou_x1=mmousex
mou_y1=mmousey
}

if click{
pen_flag=1

offsetx=-1.0*((mmousex)-mou_x1)/bai+offsetx_
offsety=1.0*((mmousey)-mou_y1)/bai+offsety_
;dialog offsetx
}
if click_=0:click_once=0:click=0{
}

continue
}
}


id+
if shutu=1:shutu=0:break
loop
goto *strt

*strt_
shutu=1
return

*strt
if switch_=0:switch_=1{
if obj_make:clrobj obj_id:obj_make=0
goto *mainloop
}
switch_=0
pos 88+3,ginfo_winy-21-3
objsize 88,21
button "初期化",*shoki
obj_id=stat
obj_make=1
repeat
wait 5
if shutu=1:shutu=0:break
loop
goto *strt
*shoki
id=0
hen=0
obj_make=0
clrobj obj_id
gosub *mem:gosub *datum:gosub *hankei
switch_=0
loop_once=1
gosub *mainloop
repeat
wait 5
if shutu=1:shutu=0:break
loop
goto *strt
*exit
end
*oncli
click=1
return

2008年12月20日土曜日

HSPでランタイムを使わずにコンソールを使う

ランタイムを使用せずコンソールを使ってみようと思います。
copenでコンソールを開き
coutputで文字を表示し、
cinputでキーボードから打たれた文字を取得します。
ccloseでコンソールを閉じます。

#module console
#define STD_INPUT_HANDLE (-10)
#define STD_OUTPUT_HANDLE (- 11)
#define STD_ERROR_HANDLE (-12)

#uselib "kernel32.dll"
#func AllocConsole "AllocConsole"
#func FreeConsole "FreeConsole"
#cfunc GetStdHandle "GetStdHandle" int
#func SetStdHandle "SetStdHandle" int,int
#func ReadFile "ReadFile" int,int,int,int,int
#func WriteFile "WriteFile" int,int,int,int,int

#deffunc cset
SetStdHandle STD_OUTPUT_HANDLE,7
SetStdHandle STD_INPUT_HANDLE,3
return
#deffunc copen
AllocConsole

return stat
#deffunc cclose
FreeConsole
return stat
#deffunc coutput str buf_
buf=buf_
b=0
WriteFile GetStdHandle(STD_OUTPUT_HANDLE),varptr(buf),strlen(buf),b,0
stat_=stat
if stat_=0{
return -1
}
return
#deffunc cinput var buf_
d=0
buf_max=64
sdim buf,buf_max
data=0
index=0
repeat
ReadFile GetStdHandle(STD_INPUT_HANDLE),varptr(data),1,varptr(d),0
stat_=stat
if stat_=0{
return -1
}
if data=13||data=10||data=0{
buf_=buf
return
}
poke buf,index,data
index+
if index=buf_max{
sdim buf_d,buf_max
buf_d=buf
buf_max+=64
sdim buf,buf_max
buf=buf_d
}
loop
return
#deffunc cbinput var buf_
d=0
buf_max=64
sdim buf,buf_max
data=0
index=0
repeat
ReadFile GetStdHandle(STD_INPUT_HANDLE),varptr(data),1,varptr(d),0
stat_=stat
if stat_=0{
return -1
}
if data=0{
buf_=buf
return
}
poke buf,index,data
index+
if index=buf_max{
sdim buf_d,buf_max
buf_d=buf
buf_max+=64
sdim buf,buf_max
buf=buf_d
}
loop
return
#global

//////////サンプル///////////
a=""
copen
coutput "hello world"
cinput a
coutput a
wait
cclose
wait
end

2008年9月23日火曜日

任意桁数の実数計算


#module
#defcfunc comp_h int a,int b
if a<b :return b
return a
#defcfunc comp_l int a,int b
if a<b :return a
return b

#deffunc fteki var keka_,var size1_,var ten1_
k1=size1_-ten1_-1-1
sdim keka_2,size1_
sik=0
sij=0
repeat
if peek(keka_,k1+ten1_+1)=0:sik+:else:break
k1-
loop
k1=-ten1_-1
repeat
if peek(keka_,k1+ten1_+1)=0:sij+:else:break
k1+
loop

size1_-=sik+sij
ten1_=sij

memcpy keka_2,keka_,size1_,0,sij
memcpy keka_,keka_2,size1_,0,0

return
#deffunc fzetai var hiki2_,int size2_,int ten2_,int sehu2_, var hiki3_,int size3_,int ten3_,int sehu3_
size1_=comp_h(ten2_+1,ten3_+1)+comp_h(size2_-ten2_-1,size3_-ten3_-1)+1
ten1_=comp_h(ten2_,ten3_)+1


k1=size1_-ten1_-1-1

repeat

st1=0
st2=0
if k1<=size2_-ten2_-1-1&&k1>=-ten2_-1{

st1=((sehu2_!1)*2-1)*peek(hiki2_,k1+ten2_+1)

}
if k1<=size3_-ten3_-1-1&&k1>=-ten3_-1{
st2=((sehu3_!1)*2-1)*peek(hiki3_,k1+ten3_+1)
}
st3=st1+st2+kuri
kuri=0
if st3>=10:st3-=10:kuri=1
if st3<0:st3+=10:kuri=-1


k1-
if k1<-(ten1_+1):break
loop

if kuri!=0:return 1
return


return
#deffunc fplus var keka_3,var size1,var ten1,var sehu1, var hiki2,int size2,int ten2,int sehu2, var hiki3,int size3,int ten3,int sehu3

fzetai hiki2, size2, ten2, sehu2, hiki3, size3, ten3, sehu3
han=1
if stat=1:han=-1

size1=comp_h(ten2+1,ten3+1)+comp_h(size2-ten2-1,size3-ten3-1)+1
ten1=comp_h(ten2,ten3)+1
sdim keka_3,size1
sdim keka,size1
k1=size1-ten1-1-1
kuri=0
repeat

st1=0
st2=0
if k1<=size2-ten2-1-1&&k1>=-ten2-1{

st1=han*((sehu2!1)*2-1)*peek(hiki2,k1+ten2+1)

}
if k1<=size3-ten3-1-1&&k1>=-ten3-1{
st2=han*((sehu3!1)*2-1)*peek(hiki3,k1+ten3+1)
}
st3=st1+st2+kuri
kuri=0
if st3>=10:st3-=10:kuri=1
if st3<0:st3+=10:kuri=-1
poke keka,k1+ten1+1,st3

k1-
if k1<-(ten1+1):break
loop


sehu1=((han+1)/2!1)

fteki keka ,size1 ,ten1

;if kuri!=0:dialog "エラー"
memcpy keka_3,keka,size1,0,0
return
#global
a=""
size2=30
ten2=0//1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
sdim suti1,size2
//配列にデータをいれます (π)
poke suti1,0,3
poke suti1,1,1
poke suti1,2,4
poke suti1,3,1
poke suti1,4,5
poke suti1,5,9
poke suti1,6,2
poke suti1,7,6
poke suti1,8,5
poke suti1,9,3
poke suti1,10,5
poke suti1,11,8
poke suti1,12,9
poke suti1,13,0
poke suti1,14,9
poke suti1,15,3
poke suti1,16,2
poke suti1,17,3
poke suti1,18,8
poke suti1,19,4
poke suti1,20,6
poke suti1,21,2
poke suti1,22,6
poke suti1,23,4
poke suti1,24,3
poke suti1,25,3
poke suti1,26,8
poke suti1,27,3
poke suti1,28,0
poke suti1,29,0

size3=2
sdim suti3,size3
poke suti1,0,3
ten3=0
sehu3=0

sehu2=0


//fplus 代入される変数,サイズ,小数点位置 足す変数,サイズ,小数点位置 足される変数,サイズ,小数点位置
fplus suti,size,ten,sehu,suti1,size2,ten2,sehu2,suti3,size3,ten3,sehu3
//結果はデバッグウィンドウのメモリダンプで・・・

mes size1
mes ten1

2008年9月21日日曜日

自作RADツール(HSP) 途中断念・・・ 再開の可能性あり?

RADツールを製作していましたが行き詰っていました。
ソースを公開します
ソースを実行するときは main_test.hsp を実行してください。
EXEを実行するときは !試作!.exe を実行して下さい。

ダウンロード ->http://begriff.web.fc2.com/radtool.zip

式評価とポーランド記法化


screen 0,700,600
;mes 12 + 24 * limit ( 68 ,36+48*sin(85), 120+64 ) * 59 +( 63>=23)
buf="12 + 24 * limit ( 68+89 ,36+48*sin(85), 120+64 ) * 59 +( 63>=23)"
;buf="24 * limit ( 68+89 ,48*aa(85+77,99*2), 120+64 )"
mes buf
len=strlen(buf)
sdim buf2,len

repeat
data=peek(buf,c)
if (data=' '||data=9)=0{
poke buf2,c2,data
c2+
}

c+
if c=len:c=0:c2=0:break
loop//--------------------------

mes buf2

len=strlen(buf2)
sdim buf,len
buf=buf2
sdim buf2,len

repeat
data=peek(buf,c)
if data='+'||data='-'||data='*'||data='/'||data='\\'||data='|'||data='&'||data='^'||data='='||data='>'||data='<'||data='!'{
poke buf2,c,'C'
}else : if data='('{
poke buf2,c,'B'
}else : if data=')'{
poke buf2,c,'D'
}else : if data=','{
poke buf2,c,'K'
}else : poke buf2,c,'A'
c+
if c=len:c=0:break
loop//--------------------------

mes buf2

len=strlen(buf2)

repeat
data=peek(buf2,c)
if data='A'{
c2=c
func=0
repeat
data=peek(buf2,c2)
if data!='A'{
if data='B':func=1
break
}
c2+
if c2=len:break
loop
c2=0

if func{
repeat
data=peek(buf2,c)
if data ! 'A':break
poke buf2,c,'F'
c+
if c=len:c=0:break
loop
}
}

c+
if c>=len:c=0:break
loop//--------------------------
mes "シンボル化"
mes buf2

len=strlen(buf2)
sdim buf3,len
sdim ad,len,len
sdim cd,len,len

repeat
data=peek(buf2,c)
if data='A'{
poke buf3,c3,'A'
c3+
repeat
if peek(buf2,c+c2)!'A':break
data2=peek(buf,c+c2)
poke ad(ac),c2,data2
c2+
loop
c2-
c=c+c2
c2=0
ac+
}else :if data='C'{
poke buf3,c3,'C'
c3+
repeat
if peek(buf2,c+c2)!'C':break
data2=peek(buf,c+c2)
poke cd(cc),c2,data2
c2+
loop
c2-
c=c+c2
c2=0
cc+
}else : if data='F'{
poke buf3,c3,'F'
c3+
repeat
if peek(buf2,c+c2)!'F':break
data2=peek(buf,c+c2)
poke cd(cc),c2,data2
c2+
loop
c2-
c=c+c2
c2=0
cc+
}else {
poke buf3,c3,data
c3+
}
c+
if c>=len:c=0:break
loop//--------------------------
c3=0
cc=0
ac=0

buf2=buf3
mes "シンボル簡易化"
mes buf2

len=strlen(buf2)
dim bk,len
dim ck,len


repeat//--------------------------
data=peek(buf2,c)
if data='B':lv+

if data='C'||data='F'{
ck(cc)=lv
cc+
}
if data='B'||data='D'||data='K'{
bk(bc)=lv
bc+
}
if data='D':lv-
c+
if c>=len:c=0:break
loop
bc=0
cc=0


dim cy,len
dim ch,len
repeat//--------------------------
data=peek(buf2,c)
if data='C'{
data2=cd(cc)
h=0
if data2="*":cy(cc)=5:ch(cc)=2:h=1
if data2="/":cy(cc)=5:ch(cc)=2:h=1
if data2="\\":cy(cc)=5:ch(cc)=2:h=1
if data2="+":cy(cc)=4:ch(cc)=2:h=1
if data2="-":cy(cc)=4:ch(cc)=2:h=1
if data2="<<":cy(cc)=3:ch(cc)=2:h=1
if data2=">>":cy(cc)=3:ch(cc)=2:h=1
if data2="=":cy(cc)=2:ch(cc)=2:h=1
if data2="==":cy(cc)=2:ch(cc)=2:h=1
if data2="!":cy(cc)=2:ch(cc)=2:h=1
if data2="!=":cy(cc)=2:ch(cc)=2:h=1
if data2=">":cy(cc)=2:ch(cc)=2:h=1
if data2="<":cy(cc)=2:ch(cc)=2:h=1
if data2=">=":cy(cc)=2:ch(cc)=2:h=1
if data2="<=":cy(cc)=2:ch(cc)=2:h=1
if data2="&":cy(cc)=1:ch(cc)=2:h=1
if data2="&&":cy(cc)=1:ch(cc)=2:h=1
if data2="|":cy(cc)=1:ch(cc)=2:h=1
if data2="||":cy(cc)=1:ch(cc)=2:h=1
if data2="^":cy(cc)=1:ch(cc)=2:h=1
if h=0:dialog "式の記述が無効です。 不明な演算子 \" "+data2+" \""
cc+
}
if data='F'{
cy(cc)=6
cc+
}
c+
if c>=len:c=0:break
loop
h=0
fhm=0
cc=0
dim cf,len
repeat//--------------------------
data=peek(buf2,c)
if data='B'||data='D'||data='K'{
bc+
}
if data='F'{
k=bk(bc)
c2=2
repeat
data2=peek(buf2,c+c2)
if data2='B'||data2='D'||data2='K'{
bc2+


}
if k=bk(bc+bc2){
if data2='A':d=1
if data2='K':fh+
if data2='D':break
}
c2+
if c+c2>=len:c2=0:break
loop
bc2=0
c2=0
fh+
if d=0:fh=0
d=0
if fhm<fh:fhm=fh
ch(cc)=fh
cf(cc)=1
fh=0
cc+
poke buf2,c,'C'
}
if data='C'{
cf(cc)=0
cc+
}
c+
if c>=len:c=0:break
loop
cc=0
bc=0
mes buf2

sdim buf3,len
dim c_st,len
dim ca,len
c_sa=0
c3=0
repeat//--------------------------
data=peek(buf2,c)
if data='C'{
data2=peek(buf2,c+1)
repeat
if c_sa!0&&(ck(c_st(c_sa))>ck(cc)||((ck(c_st(c_sa))=ck(cc)&&cy(c_st(c_sa))>=cy(cc)))){
ca(c4)=c_st(c_sa)
poke buf3,c3,'C'
c3+
c4+
c_sa-
}else : break
loop
if data2='A'{
poke buf3,c3,'A'
c3+
c+
data2=peek(buf2,c+1)
}
if data2='B'{
c_sa+
c_st(c_sa)=cc
}
if data2='C'{
if (ck(cc+1))>ck(cc)||(ck(cc+1)=ck(cc)&&cy(cc+1)>=cy(cc)){
c_sa+
c_st(c_sa)=cc
}else{
ca(c4)=cc
poke buf3,c3,'C'
c3+
c4+
}
}
if data2='K'||data2='D'||data2=0{
ca(c4)=cc
poke buf3,c3,'C'
c3+
c4+
}

cc+
}

if data='K'||data='D'||data=0{
lv=bk(bc)
if data=0:lv=0
repeat
if c_sa!0&&lv=ck(c_st(c_sa)){
ca(c4)=c_st(c_sa)
poke buf3,c3,'C'
c3+
c4+
c_sa-
}else :break
loop
}

if data='B'||data='K'||data='D'{
bc+
}

if data='A'{
poke buf3,c3,'A'
c3+
}
c+
if c>=len+1:c=0:break
loop
bc=0
c2=0
c3=0
c4=0
cc=0
mes "\n逆ポーランド記法化(シンボル)"
mes buf3
/*いらない↓*/
sdim buf4,512
len=strlen(buf3)
repeat//--------------------------
data=peek(buf3,c)
if data='A'{
buf4+=ad(ac)+" "
ac+
}
if data='C'{
buf4+=cd(ca(cc))
if cf(ca(cc)):buf4+="()"
buf4+=" "
cc+
}
c+
if c>=len+1:c=0:break
loop
mes "\n逆ポーランド記法化(人間が認識できるようにするだけなので内部処理的にはいらない 上と同じ)"
mes buf4
/*いらない↑*/
cc=0
ac=-1
dim a_st,len//各数値がどのスタックにあるか
sdim st_st,fhm//引数に渡す値の配列
sdim buf5,512
st2=0//引数の順番
ac=-1
c2=0

repeat//--------------------------
data=peek(buf3,c)
if data='A'{

ac+
}
if data='C'{
retn=ch(ca(cc))
st_itiml=0
st_itims=0
st2=0

syu=0
repeat retn//引数に渡す値を配列に収納

st_iti=a_st(ac-c2)
if st_iti=0{

st_st(st2)=ad(ac-c2)
st2+
c2+

}else{

st_st(st2)="st"+a_st(ac-c2)
st2+
c2+
if st_itims>st_iti || st_itims=0:st_itims=st_iti
if st_itiml<st_iti:st_itiml=st_iti
;dialog st_itims
}
repeat
if (ac-c2)<0:syu=1:break
st_iti2=a_st(ac-c2)

if st_iti2=0:break
if st_iti!=st_iti2:break
c2+
loop
if syu=1:break

loop

if st_itims=0{
st+
}else{
st=st_itims
}

repeat c2
a_st(ac-cnt)=st
loop

buf5+="st"+st+" = "
if cf(ca(cc)){
buf5+=cd(ca(cc))+"( "
repeat retn
if retn!1&&cnt!0 :buf5+=", "
f=retn-cnt
buf5+=st_st(retn-cnt-1)
loop
buf5+=" )"
}else{
buf5+=st_st(1)+" "+cd(ca(cc))+" "+st_st(0)

}
buf5+="\n"
c2=0
st2=0
cc+
}

c+
if c>=len:c=0:break
loop
buf5+="ans = st1"

mes "\n\n変換前の数式"
mes buf
mes "\n変換後の数式\n"
mes buf5

2008年9月20日土曜日

ベジェ曲線


#module
#deffunc Beziers int x1,int y1,int x2, int y2, int x3 ,int y3,int x4,int y4,double rate
t=0.0
line x1,y1,x1,y1
repeat
x=(1.0-t)*(1.0-t)*(1.0-t)*x1+3.0*(1.0-t)*(1.0-t)*t*x2+3.0*(1.0-t)*t*t*x3+t*t*t*x4
y=(1.0-t)*(1.0-t)*(1.0-t)*y1+3.0*(1.0-t)*(1.0-t)*t*y2+3.0*(1.0-t)*t*t*y3+t*t*t*y4
line x,y
t+=rate
if t>1:break
loop
line x4,y4
line x4,y4,x4,y4
return
#global

k=4
f=4

onclick gosub *click

x(0)=300:y(0)=300
x(1)=300:y(1)=100
x(2)=100:y(2)=300
x(3)=100:y(3)=100

gosub *draw

stop
*click
i=0
repeat 4
if x(i)-k< mousex&&mousex< x(i)+k&&y(i)-k< mousey&&mousey< y(i)+k{
repeat
x(i)=mousex
y(i)=mousey
gosub *draw
getkey key,1
if key=0:break
wait 0
loop
}
i+
loop
return
*draw
redraw 0
color 255,255,255
boxf

color 192,192,255
line x(0),y(0),x(1),y(1)
line x(2),y(2),x(3),y(3)
color 0,0,0

Beziers x(0),y(0),x(1),y(1),x(2),y(2),x(3),y(3),0.01

color 255,,
circle x(0)-f,y(0)-f,x(0)+f,y(0)+f,0
circle x(3)-f,y(3)-f,x(3)+f,y(3)+f,0

color ,,255
circle x(1)-f,y(1)-f,x(1)+f,y(1)+f,0
circle x(2)-f,y(2)-f,x(2)+f,y(2)+f,0
redraw 1
return

2008年9月13日土曜日

難航^^

自作言語について色々と思いめぐらせるこのごろです。
初期案は変数と言う概念を持たず
直接メモリアドレスを参照すると言う形でした。
しかし問題が出てきました。
たとえばユーザー関数を別ファイルで汎用化させようとした場合、
関数間でメモリエリアの干渉が起こってしまうのです。
つまり、現状のままでは変数と言う概念が必要不可欠なのです。

言語仕様を一掃しようと思います。
まず言語的にサポートする機能は最低限のものであるというコンセプトは残します。
ではその機能を列挙します。

一般文

変数定義
ラベル定義
演算文(一項式)
条件分岐
無条件分岐

プリプロセス文

インクルード
ディファイン
外部DLL指定 外部関数指定