2009年3月28日土曜日

インターネットと電話線

おとといの夕方から突然インターネットに接続できなくなってしまいました。

電話の方も同時刻から雑音がひどくてまともに通話できるような状態ではありませんでした。

今日NTTに電話したら 特殊な車(電柱をとかの高さまで人を乗せて上げるようなの)が二台
ウチに来て 電話機・配線・保安器をみて回りました。 結局 ウチまで来ている電話線が途中で切れていたそうです。(最近風が強くてなんか当たったのか・・・?)

電柱電柱間での断線だったので 修理費用はかかりませんでした。

今までネットの回線が切断されやすかったのはその所為だったのかなと・・・(まぁ回線復帰しましたが 前と変わんない・・・)

基地局からかなり離れているので 光とか に(できれば)したいな と。

保安器を新しいのにしたからといって回線の安定性が保証されるわけじゃないから 工事するのも なんだな。。。

2009年2月25日水曜日

IRCでリバーシっぽいもの。

limeChatでリバーシするjavascriptこしらえました。

javascriptをいじるのは初体験でしたが、ハマってしまいそうです^^


以下 リーバシする スプリクト^^(わざとですよ)

var turn=0;//0黒 1 白 ターン
var data = new Array(8*8);
var data2 = new Array(8*8);
var channel_g;
var end=0;

function event::onChannelText(prefix, channel, text){
channel_g=channel;
if(text.match(/^#/i)){

cmd=""+text.match(/[a-z]+$/i);
var ddd=text.match(/(\d)/g);

if(ddd!=null){

x=ddd[0];
y=ddd[1];
if(end==1){
send(channel,"<color navy,silver><ゲームを再開してください>");
return(0);
}
if(x>8||x==0||y>8||y==0){
send(channel,"<color navy,silver><不正な入力です>");
}else{
if(putable(x-1,y-1)==0){
send(channel,"<color navy,silver><そこには打てません>");

}else{
copyArr12();
put(x-1,y-1);
turnChange()
if(numberOfPutable()==0){
turnChange()
if(numberOfPutable()==0){

if(black_n()>white_n()){
send(channel,"<color navy,silver><黒の勝ち>");
}
if(black_n()<white_n()){
send(channel,"<color navy,silver><白の勝ち>");
}
if(black_n()==white_n()){
send(channel,"<color navy,silver><引き分け>");
}
draw();
end=1;
return(0);
}else{
send(channel,"<color navy,silver><打つ手がないのでパス>");
}
}
draw();

}
}
}

if(cmd!=null){
if(cmd.search(/^new$/i)!=-1){
send(channel,"<color navy,silver><ゲームを開始します>");
newGame();
draw();
end=0;
}
if(cmd.search(/^matta$/i)!=-1){
if(matta_ok==1){
send(channel,"<color navy,silver><\"待った\"しました>");
copyArr21();
turnChange()
draw();
end=0;
matta_ok=0;
}else{
send(channel,"<color navy,silver><\"待った\"できません>");
}
}
}
}
}

function newGame(){
turn=0;
for(ix=0;ix<8;ix++){
for(iy=0;iy<8;iy++){
data[(ix)*8+(iy)] = 0;
}
}
data[(3)*8+(3)]=1; //1黒?
data[(4)*8+(4)]=1; //2白
data[(4)*8+(3)]=2;
data[(3)*8+(4)]=2;
}
function draw(){
send(channel_g,"<color white,white>,/<color gray,white>1<color white,white>,,<color gray,white>2<color white,white>,,<color gray,white>3<color white,white>,,<color gray,white>4<color white,white>,,<color gray,white>5<color white,white>,,<color gray,white>6<color white,white>,,<color gray,white>7<color white,white>,,<color gray,white>8");
for(iy=0;iy<8;iy++){
str="";
str+="<color gray,white>"+(iy+1);
for(ix=0;ix<8;ix++){

if(data[(ix)*8+(iy)]==0){
if(putable(ix,iy)==0){
str+=""+"<color green,green>.<color black,green>・<color green,green>.";
}else{
str+=""+"<color green,green>.<color red,green>・<color green,green>."
}
}
if(data[(ix)*8+(iy)]==1){
str+=""+"<color black,green>●";
}
if(data[(ix)*8+(iy)]==2){
str+=""+"<color white,green>●";
}
}
if(iy==5){
str+="<color> balck "+black_n();
}
if(iy==6){
str+="<color> white "+white_n();
}
if(iy==7){
if(turn==0){
str+="<color> 黒の番です";
}else{
str+="<color> 白の番です";
}
}
send(channel_g,str);
}
}

function black_n(){
amount=0;
for(i=0;i<64;i++){
if(data[i]==1){
amount++;
}
}
return(amount);
}

function white_n(){
amount=0;
for(i=0;i<64;i++){
if(data[i]==2){
amount++;
}
}
return(amount);
}

function putable(x,y){
rr=0;
if(data[(x)*8+(y)]==0){
if(turn==0){
a1=2;
a2=1;
}else{
a1=1;
a2=2;
}
if(x!=0&&y!=0){
m=1;
a=0;
while(1){
if(data[(x-m)*8+(y-m)]==a1){
a=1;
}
if(data[(x-m)*8+(y-m)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x-m)*8+(y-m)]==0){
break;
}
if(x-m==0||y-m==0){
break;
}
m++;

}
}

if(y!=0){
m=1;
a=0;
while(1){
if(data[(x)*8+(y-m)]==a1){
a=1;
}
if(data[(x)*8+(y-m)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x)*8+(y-m)]==0){
break;
}
if(y-m==0){
break;
}
m++;

}
}

if(x!=7&&y!=0){
m=1;
a=0;
while(1){
if(data[(x+m)*8+(y-m)]==a1){
a=1;
}
if(data[(x+m)*8+(y-m)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x+m)*8+(y-m)]==0){
break;
}
if(x+m==7||y-m==0){
break;
}
m++;

}
}

if(x!=7){
m=1;
a=0;
while(1){
if(data[(x+m)*8+(y)]==a1){
a=1;
}
if(data[(x+m)*8+(y)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x+m)*8+(y)]==0){
break;
}
if(x+m==7){
break;
}
m++;

}
}

if(x!=7&&y!=7){
m=1;
a=0;
while(1){
if(data[(x+m)*8+(y+m)]==a1){
a=1;
}
if(data[(x+m)*8+(y+m)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x+m)*8+(y+m)]==0){
break;
}
if(x+m==7||y+m==7){
break;
}
m++;

}
}

if(y!=7){
m=1;
a=0;
while(1){
if(data[(x)*8+(y+m)]==a1){
a=1;
}
if(data[(x)*8+(y+m)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x)*8+(y+m)]==0){
break;
}
if(y+m==7){
break;
}
m++;

}
}
if(x!=0&&y!=7){
m=1;
a=0;
while(1){
if(data[(x-m)*8+(y+m)]==a1){
a=1;
}
if(data[(x-m)*8+(y+m)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x-m)*8+(y+m)]==0){
break;
}
if(x-m==0||y+m==7){
break;
}
m++;

}
}
if(x!=0){
m=1;
a=0;
while(1){
if(data[(x-m)*8+(y)]==a1){
a=1;
}
if(data[(x-m)*8+(y)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x-m)*8+(y)]==0){
break;
}
if(x-m==0){
break;
}
m++;

}
}
}
return(rr);
}

function put(x,y){
if(turn==0){
a1=2;
a2=1;
}else{
a1=1;
a2=2;
}
if(x!=0&&y!=0){
m=1;
a=0;
while(1){
if(data[(x-m)*8+(y-m)]==a1){
a=1;
}
if(data[(x-m)*8+(y-m)]==a2){
if(a==1){lineChange(x,y,x-m,y-m);}
break;
}
if(data[(x-m)*8+(y-m)]==0){
break;
}
if(x-m==0||y-m==0){
break;
}
m++;

}
}

if(y!=0){
m=1;
a=0;
while(1){
if(data[(x)*8+(y-m)]==a1){
a=1;
}
if(data[(x)*8+(y-m)]==a2){
if(a==1){lineChange(x,y,x,y-m);}
break;
}
if(data[(x)*8+(y-m)]==0){
break;
}
if(y-m==0){
break;
}
m++;

}
}

if(x!=7&&y!=0){
m=1;
a=0;
while(1){
if(data[(x+m)*8+(y-m)]==a1){
a=1;
}
if(data[(x+m)*8+(y-m)]==a2){
if(a==1){lineChange(x,y,x+m,y-m);}
break;
}
if(data[(x+m)*8+(y-m)]==0){
break;
}
if(x+m==7||y-m==0){
break;
}
m++;

}
}

if(x!=7){
m=1;
a=0;
while(1){
if(data[(x+m)*8+(y)]==a1){
a=1;
}
if(data[(x+m)*8+(y)]==a2){
if(a==1){lineChange(x,y,x+m,y);}
break;
}
if(data[(x+m)*8+(y)]==0){
break;
}
if(x+m==7){
break;
}
m++;

}
}

if(x!=7&&y!=7){
m=1;
a=0;
while(1){
if(data[(x+m)*8+(y+m)]==a1){
a=1;
}
if(data[(x+m)*8+(y+m)]==a2){
if(a==1){lineChange(x,y,x+m,y+m);}
break;
}
if(data[(x+m)*8+(y+m)]==0){
break;
}
if(x+m==7||y+m==7){
break;
}
m++;

}
}

if(y!=7){
m=1;
a=0;
while(1){
if(data[(x)*8+(y+m)]==a1){
a=1;
}
if(data[(x)*8+(y+m)]==a2){
if(a==1){lineChange(x,y,x,y+m);}
break;
}
if(data[(x)*8+(y+m)]==0){
break;
}
if(y+m==7){
break;
}
m++;

}
}
if(x!=0&&y!=7){
m=1;
a=0;
while(1){
if(data[(x-m)*8+(y+m)]==a1){
a=1;
}
if(data[(x-m)*8+(y+m)]==a2){
if(a==1){lineChange(x,y,x-m,y+m);}
break;
}
if(data[(x-m)*8+(y+m)]==0){
break;
}
if(x-m==0||y+m==7){
break;
}
m++;

}
}
if(x!=0){
m=1;
a=0;
while(1){
if(data[(x-m)*8+(y)]==a1){
a=1;
}
if(data[(x-m)*8+(y)]==a2){
if(a==1){lineChange(x,y,x-m,y);}
break;
}
if(data[(x-m)*8+(y)]==0){
break;
}
if(x-m==0){
break;
}
m++;

}
}
}

function lineChange(x1,y1,x2,y2){
if(turn==0){
a=1;
}else{
a=2;
}
mx=0
my=0
while(1){
data[(x1+mx)*8+(y1+my)]=a;
if(x2==x1+mx&&y2==y1+my){break;}
if(x2-x1>0){mx++;}
if(x2-x1<0){mx--;}
if(y2-y1>0){my++;}
if(y2-y1<0){my--;}
}
}

function numberOfPutable(){
amount=0;
for(ix=0;ix<8;ix++){
for(iy=0;iy<8;iy++){
if(putable(ix,iy)==1){amount++;}
}
}
//send(channel_g,""+amount);
return(amount);
}

function turnChange(){
if(turn==0){
turn=1;
}else{
turn=0;
}
}
matta_ok=0;
function copyArr12(){
matta_ok=1;
for(i=0;i<64;i++){
data2[i]=data[i];
}
}
function copyArr21(){
for(i=0;i<64;i++){
data[i]=data2[i];
}
}

2009年2月7日土曜日

ケンタッキーフライドチキンについて

時々ケンタッキーを食べる機会が自分にはあります。

個人的にケンタッキーを目の前にするとテンション上がります。


だって、おいしいじゃないですか。^^


ただ、鳥をミンチとかにせずそのままカットして揚げているので
それぞれ肉に、ばらつきあったりしますよね。


何でも ウィング サイ キール ドラム リブ の五種類があるそうです。


やっぱり一番大きな肉が食べたいですよね。


なんとケンタッキーでは部位が選択できる かも なのです。

(部位を指定して買えるか。 に対して)「ご来店時に、ご相談ください。
少数であれば、その時の商品の状況によって、お受けできる場合もありますので、
ご来店の際にご相談ください。
なお、必ずご希望にそえるということではございませんのでご了承願います。


だそうです。

リブ 10個!! とか無理そうですけど 常識の範囲内であれば 偏った注文もできそうです。

勝手な推測ですが、"オリジナルチキン" 5ピース を頼めば、 上で言った 
五種類全部 "かぶり"なしで買えるんでしょうかね?

個人的にドラムとリブは苦手なので、 、"オリジナルチキン" 4ピース ドラムとリブはなしで と言う注文がしたいですね。

食べ物の話をしていると、おなかが減ってきました。。。 そんなこんなで I love KFC.

2009年2月1日日曜日

文字列を延々と歪ませる  ピクセル間 補正 有り

文字列を延々と歪ませる ピクセル間 補正 有り。
この前のは変形するたびに、汚くなっていったので ピクセル間で補正してみました。



#module
#uselib "gdi32.dll"
#func GetTextExtentPoint32 "GetTextExtentPoint32A" int,int,int,int
#deffunc messize var tBuf,array tSize
notesel tBuf
repeat notemax
noteget tBuf2,cnt
tBuf3=tBuf2
txtLen=strlen(tBuf3)
dim tSize,2
GetTextExtentPoint32 hdc,varptr(tBuf3),txtLen,varptr(tSize)
if cnt=0:x=tSize(0)
if x<tSize(0):x=tSize(0)
loop
tSize(0)=x
tSize(1)=tSize(1)*notemax
return
#global

#include "hspmath.as"
#define ctype stogx(%1) (( (%1)-offsetx )*(bai)+ginfo_winx/2)
#define ctype stogy(%1) (((%1)-offsety )*(-1.0)*(bai)+ginfo_winy/2)
#define e 2.718281828459045235360287471352
#define pi 3.1415926535897932384626433832795028841971
bai=1.0 //表示倍率
offsetx=0 //表示中心 X
offsety=0 //表示中心 Y
randomize
title "文字列を延々と歪ませる ピクセル間補正有り"
onexit *exit
goto *sake
*exit
end
*sake

screen 3

skx=-320.0
sky=-240.0
smx=320.0
smy=240.0

dialog ".bmp;*.jpg",16,""
if stat!=0{
picload refstr,1



color 255,128,128
}else{color 128,128,128}
repeat
x+=30
line x,-1,x,ginfo_winy
if x>ginfo_winx:break
loop

repeat
y+=30
line -1,y,ginfo_winx,y
if y>ginfo_winy:break
loop


font "",50

buf=""

repeat 8
f=rnd(2)
buf+=strf("%c",f*(rnd(26)+65)+(f!1)*(rnd(26)+97))
loop
messize Buf,textSize

pos stogx(-textSize(0)/2)-1,stogy(-textSize(1)/2)-1
color 255,255,255
mes buf
pos stogx(-textSize(0)/2)-1,stogy(-textSize(1)/2)+1
color 255,255,255
mes buf
pos stogx(-textSize(0)/2)+1,stogy(-textSize(1)/2)-1
color 255,255,255
mes buf
pos stogx(-textSize(0)/2)+1,stogy(-textSize(1)/2)+1
color 255,255,255
mes buf

pos stogx(-textSize(0)/2),stogy(-textSize(1)/2)
color 0,0,0
mes buf

gsel 0,1


repeat

x_=skx
y_=sky
xx=0
yy=0
ox=1.0*rnd(300)-150
sx=1.0*rnd(60)+5
bx=1.0*rnd(100)+5
rad=1.0*rnd(360)*pi/180

repeat
x__=x_*cos(rad)-y_*sin(rad)
y__=x_*sin(rad)+y_*cos(rad)
x=x__*cos(rad)+(1.0/(pow(e,(x__-ox)/sx)+pow(e,-(x__-ox)/sx))*bx+y__)*sin(rad)
y=-x__*sin(rad)+(1.0/(pow(e,(x__-ox)/sx)+pow(e,-(x__-ox)/sx))*bx+y__)*cos(rad)

gsel 3
pget stogx(x),stogy(y)
r1=ginfo_r
g1=ginfo_g
b1=ginfo_b
pget stogx(x-1),stogy(y)
r2=ginfo_r
g2=ginfo_g
b2=ginfo_b
pget stogx(x),stogy(y-1)
r3=ginfo_r
g3=ginfo_g
b3=ginfo_b
pget stogx(x-1),stogy(y-1)
r4=ginfo_r
g4=ginfo_g
b4=ginfo_b

xt=1*x
if x>0:xt+=1
yt=1*y
if y>0:yt+=1
xx=1.0*xt-x
yy=1.0*yt-y

r=((1.0-xx)*(1.0-yy))*r1+((xx)*(1.0-yy))*r2+((1.0-xx)*yy)*r3+(xx*yy)*r4
g=((1.0-xx)*(1.0-yy))*g1+((xx)*(1.0-yy))*g2+((1.0-xx)*yy)*g3+(xx*yy)*g4
b=((1.0-xx)*(1.0-yy))*b1+((xx)*(1.0-yy))*b2+((1.0-xx)*yy)*b3+(xx*yy)*b4


gsel 0
color r,g,b
pset stogx(x_),stogy(y_)

x_+
if x_>=smx:x_=skx:y_+:if y_>=smy:y_=sky:break

wait 0
loop
gsel 3
gmode 0,640,480,0
pos 0,0
gcopy 0,0,0,640,480

loop


2009年1月31日土曜日

文字列を延々と歪ませる

文字列(&画像&線)を延々と歪ませる ソースコードをこしらえました。
x'=x , y'=1/(e^(x)+e^(-x))+y という式を使って あとは、行列を使って回転移動させたりしただけです。




#module
#uselib "gdi32.dll"
#func GetTextExtentPoint32 "GetTextExtentPoint32A" int,int,int,int
#deffunc messize var tBuf,array tSize
notesel tBuf
repeat notemax
noteget tBuf2,cnt
tBuf3=tBuf2
txtLen=strlen(tBuf3)
dim tSize,2
GetTextExtentPoint32 hdc,varptr(tBuf3),txtLen,varptr(tSize)
if cnt=0:x=tSize(0)
if x<tSize(0):x=tSize(0)
loop
tSize(0)=x
tSize(1)=tSize(1)*notemax
return
#global

#include "hspmath.as"
#define ctype stogx(%1) (( (%1)-offsetx )*(bai)+ginfo_winx/2)
#define ctype stogy(%1) (((%1)-offsety )*(-1.0)*(bai)+ginfo_winy/2)
#define e 2.718281828459045235360287471352
#define pi 3.1415926535897932384626433832795028841971
bai=1.0 //表示倍率
offsetx=0 //表示中心 X
offsety=0 //表示中心 Y
randomize
title "文字列を延々と歪ませる"
onexit *exit
goto *sake
*exit
end
*sake

screen 3

dialog "",16,""
picload refstr,1
skx=-320.0
sky=-240.0
smx=320.0
smy=240.0

color 255,128,128

repeat
x+=30
line x,-1,x,ginfo_winy
if x>ginfo_winx:break
loop

repeat
y+=30
line -1,y,ginfo_winx,y
if y>ginfo_winy:break
loop


font "",30

buf=""

repeat 8
f=rnd(2)
buf+=strf("%c",f*(rnd(26)+65)+(f!1)*(rnd(26)+97))
loop
messize Buf,textSize

pos stogx(-textSize(0)/2),stogy(-textSize(1)/2)
color 0,0,0
mes buf

gsel 0,1


repeat

x_=skx
y_=sky

ox=1.0*rnd(300)-150
sx=1.0*rnd(60)+5
bx=1.0*rnd(100)+5
rad=1.0*rnd(360)*pi/180

repeat
x__=x_*cos(rad)-y_*sin(rad)
y__=x_*sin(rad)+y_*cos(rad)
x=x__*cos(rad)+(1.0/(pow(e,(x__-ox)/sx)+pow(e,-(x__-ox)/sx))*bx+y__)*sin(rad)
y=-x__*sin(rad)+(1.0/(pow(e,(x__-ox)/sx)+pow(e,-(x__-ox)/sx))*bx+y__)*cos(rad)

gsel 3
pget stogx(x),stogy(y)
r=ginfo_r
g=ginfo_g
b=ginfo_b

gsel 0
color r,g,b
pset stogx(x_),stogy(y_)

x_+
if x_>=smx:x_=skx:y_+:if y_>=smy:y_=sky:break

wait 0
loop
gsel 3
gmode 0,640,480,0
pos 0,0
gcopy 0,0,0,640,480

loop

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