@REM 連続線(円弧含)上に等間隔で実点を描く
@echo off
REM #jww
REM #cd
goto %1
REM #hm|距離指定(L)|分割数指定(R)|
REM #:1
REM #h1
REM #1連続線の始点を順に右クリックしてください
REM #99#
REM #c間隔 無指定:200/_/a
REM #k|1)線端起点(L)|2)両端均等(R)|/_/b
REM #hp
REM #e
REM #:2
REM #h1
REM #1連続線の始点を順に右クリックしてください
REM #99#
REM #c分割数 無指定:10/_/c
REM #hp
REM #e
:1
copy jwc_temp.txt temp.txt > nul
ruby -x %~f0 temp.txt %1 %2 %3> jwc_temp.txt
pause
goto end
:2
copy jwc_temp.txt temp.txt > nul
ruby -x %~f0 temp.txt %1 %2> jwc_temp.txt
pause
goto end
#!ruby -Ks
include Math
#楕円弧の始点座標を返す
def daenko_siten(zahyo)
if zahyo.size==7
x=zahyo[0]
y=zahyo[1]
r=zahyo[2]
siten=zahyo[3]
hen=zahyo[5]
ziku=zahyo[6]
rajian=siten*PI/180
ziku_arg=ziku*PI/180
zahyo_x=r*cos(rajian)
zahyo_y=r*sin(rajian)*hen
zahyo_xy=hypot(zahyo_y,zahyo_x)
zahyo_arg=atan2(zahyo_y,zahyo_x)
zahyo_xt=x+zahyo_xy*cos(zahyo_arg+ziku_arg)
zahyo_yt=y+zahyo_xy*sin(zahyo_arg+ziku_arg)
return zahyo_xt,zahyo_yt
end
end
#楕円弧の終点座標を返す
def daenko_syuten(zahyo)
if zahyo.size==7
x=zahyo[0]
y=zahyo[1]
r=zahyo[2]
syuten=zahyo[4]
hen=zahyo[5]
ziku=zahyo[6]
rajian=syuten*PI/180
ziku_arg=ziku*PI/180
zahyo_x=r*cos(rajian)
zahyo_y=r*sin(rajian)*hen
zahyo_xy=hypot(zahyo_y,zahyo_x)
zahyo_arg=atan2(zahyo_y,zahyo_x)
zahyo_xt=x+zahyo_xy*cos(zahyo_arg+ziku_arg)
zahyo_yt=y+zahyo_xy*sin(zahyo_arg+ziku_arg)
return zahyo_xt,zahyo_yt
end
end
#線の配列senから閉鎖図形・連続線を区分けする
def loop_renzoku_seach(sen,ten)
cl=1;flg=0;i=0
x=ten[0];y=ten[1]
0.upto(sen.size-1){|i|
if (sen[i][0]-x).abs<cl && (sen[i][1]-y).abs<cl or (sen[i][2]-x).abs<cl && (sen[i][3]-y).abs<cl
flg=1;break;
end
}
if flg==1
b=sen[i];sen.delete(sen[i])
end
if(b[2]-x).abs<cl && (b[3]-y).abs<cl
if b.size==4
a=[b[2],b[3],b[0],b[1]]
else
a=[b[2],b[3],b[0],b[1],b[4],b[5],b[6],b[7],b[8],b[9],b[10]]
end
else
if b.size==4
a=[b[0],b[1],b[2],b[3]]
else
a=[b[0],b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8],b[9],b[10]]
end
end
renzoku=[a];flg=1
while flg==1
flg=0
0.upto(sen.size-1){|i|
if (sen[i][0]-a[2]).abs<cl && (sen[i][1]-a[3]).abs<cl or (sen[i][2]-a[2]).abs<cl && (sen[i][3]-a[3]).abs<cl
flg=1;break;
end
}
if flg==1
b=sen[i];size=renzoku.size
if (renzoku[size-1][2]-b[0]).abs<cl && (renzoku[size-1][3]-b[1]).abs<cl
if b.size==4
a=[b[0],b[1],b[2],b[3]]#線データ
else
a=[b[0],b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8],b[9],b[10]]#円弧データ
end
elsif (renzoku[size-1][2]-b[2]).abs<cl && (renzoku[size-1][3]-b[3]).abs<cl
if b.size==4
a=[b[2],b[3],b[0],b[1]]#線データ
else
a=[b[2],b[3],b[0],b[1],b[4],b[5],b[6],b[7],b[8],b[9],b[10]]#円弧データ
end
end
renzoku<<a
sen.delete(sen[i])
end
end
return renzoku
end
#線上に間隔pitchで実点を描く
def ln_ten_draw(item,pitch,yo_tyo)
x1=item[0];y1=item[1];
l=sqrt((item[3]-item[1])*(item[3]-item[1])+(item[2]-item[0])*(item[2]-item[0]))
arg=atan2(item[3]-item[1],item[2]-item[0])
l2=pitch-yo_tyo
if l2<=l
printf("pt %.11f %.11f\n",x1+l2*cos(arg),y1+l2*sin(arg))
if l2<l
n=((l+yo_tyo)/pitch).to_i
yo_tyo=(l+yo_tyo)-pitch*n
0.upto(n-2){|i|
l2 += pitch
printf("pt %.11f %.11f\n",x1+l2*cos(arg),y1+l2*sin(arg))
}
elsif l2==l
yo_tyo=0
end
else
yo_tyo += l
end
return yo_tyo
end
#円弧上に間隔pitchで実点を描く
def arc_ten_draw(item,pitch,yo_tyo)
cl=1
x1=item[0];y1=item[1];x2=item[2];y2=item[3]
r_x=item[4];r_y=item[5];r=item[6];sikaku=item[7];syukaku=item[8]
arg=(syukaku-sikaku)*PI/180
l=r*arg
l2=pitch-yo_tyo
d_arg=l2/r
zahyo=[]
4.upto(item.size-1){|i|zahyo<<item[i]}
ten=daenko_siten(zahyo)
x=ten[0];y=ten[1];
if (x-x1).abs<cl && (y-y1).abs<cl
#円弧の始角が連続線の始点
if l2<=l
pt_x=r_x+r*cos(sikaku*PI/180+d_arg)
pt_y=r_y+r*sin(sikaku*PI/180+d_arg)
printf("pt %.11f %.11f\n",pt_x,pt_y)
n=((l+yo_tyo)/pitch).to_i
yo_tyo=(l+yo_tyo)-pitch*n
0.upto(n-2){|i|
l2 += pitch
d_arg=l2/r
pt_x=r_x+r*cos(sikaku*PI/180+d_arg)
pt_y=r_y+r*sin(sikaku*PI/180+d_arg)
printf("pt %.11f %.11f\n",pt_x,pt_y)
}
elsif l2==l
pt_x=r_x+r*cos(sikaku*PI/180+d_arg)
pt_y=r_y+r*sin(sikaku*PI/180+d_arg)
printf("pt %.11f %.11f\n",pt_x,pt_y)
yo_tyo=0
else
yo_tyo += l
end
else
#円弧の終角が連続線の始点
if l2<l
pt_x=r_x+r*cos(syukaku*PI/180-d_arg)
pt_y=r_y+r*sin(syukaku*PI/180-d_arg)
printf("pt %.11f %.11f\n",pt_x,pt_y)
n=((l+yo_tyo)/pitch).to_i
yo_tyo=(l+yo_tyo)-pitch*n
0.upto(n-2){|i|
l2 += pitch
d_arg=l2/r
pt_x=r_x+r*cos(syukaku*PI/180-d_arg)
pt_y=r_y+r*sin(syukaku*PI/180-d_arg)
printf("pt %.11f %.11f\n",pt_x,pt_y)
}
elsif l2==l
pt_x=r_x+r*cos(syukaku*PI/180-d_arg)
pt_y=r_y+r*sin(syukaku*PI/180-d_arg)
printf("pt %.11f %.11f\n",pt_x,pt_y)
yo_tyo=0
else
yo_tyo += l
end
end
return yo_tyo
end