Jw_cad 相談室−その2 New

 Jw_cad についての相談の場としてお使いください
情報の交換には Jw_cad 情報交換室 をご利用ください
なお、情報交換室と相談室の両方に同じ内容を投稿するのはご遠慮ください

2009年9月以前の発言過去ログのページからご覧ください。

それ以降の過去ログは消失しています。
申し訳ありませんが、復活の予定はありません。


新規投稿 ┃ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索 ┃設定 ┃過去ログ ┃ホーム
22 / 310 ツリー    ←次へ | 前へ→

曲線上に等間隔の点 初心者ちゃん 21/7/23(金) 15:14

続き kojima 21/8/4(水) 0:35
続々 kojima 21/8/4(水) 0:36

続き
 kojima  - 21/8/4(水) 0:35 -
#円弧上に間隔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
#楕円弧上に間隔pitchで実点を描く
def arc_ten_draw2(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]
ziku_arg=item[10]*PI/180

xy=[0]
for i in 4..item.size-1
xy<<item[i]
end

sen_a=[];bunkaku=1
daen_rensen_array(sen_a,xy,bunkaku)
if((x1-sen_a[0][0]).abs<cl && (y1-sen_a[0][1]).abs<cl)
else
sen_a.reverse!
for i in 0..sen_a.size-1
x1=sen_a[i][0]
y1=sen_a[i][1]
x2=sen_a[i][2]
y2=sen_a[i][3]
sen_a[i][0]=x2
sen_a[i][1]=y2
sen_a[i][2]=x1
sen_a[i][3]=y1
end
end

for i in 0..sen_a.size-1
x1=sen_a[i][0];
y1=sen_a[i][1];
l=hypot(sen_a[i][3]-sen_a[i][1],sen_a[i][2]-sen_a[i][0])
arg=atan2(sen_a[i][3]-sen_a[i][1],sen_a[i][2]-sen_a[i][0])
l2=pitch-yo_tyo
if l2<=l
x3=x1+l2*cos(arg);y3=y1+l2*sin(arg)
arg2=atan2(y3-r_y,x3-r_x)
rx=r*cos(arg2-ziku_arg);
ry=r*sin(arg2-ziku_arg)/item[9]
arg3=atan2(ry,rx)
rx=r*cos(arg3);ry=r*sin(arg3)*item[9]
rl=hypot(ry,rx)
x4=r_x+rl*cos(arg2);y4=r_y+rl*sin(arg2)
printf("pt %.11f %.11f\n",x4,y4)
if l2<l
n=((l+yo_tyo)/pitch).to_i
yo_tyo=(l+yo_tyo)-pitch*n
for i2 in 0..n-2
l2 += pitch
x3=x1+l2*cos(arg);y3=y1+l2*sin(arg)
arg2=atan2(y3-r_y,x3-r_x)
rx=r*cos(arg2-ziku_arg);ry=r*sin(arg2-ziku_arg)/item[9]
arg3=atan2(ry,rx)
rx=r*cos(arg3);ry=r*sin(arg3)*item[9]
rl=hypot(ry,rx)
x4=r_x+rl*cos(arg2);y4=r_y+rl*sin(arg2)
printf("pt %.11f %.11f\n",x4,y4)
end
elsif l2==l
yo_tyo=0
end
else
yo_tyo += l
end
end

return yo_tyo
end
#連続線上に間隔pitchで実点を描く
def rensen_ten_draw(rensen,pitch,yo_tyo)
0.upto(rensen.size-1){|i|
if rensen[i].size==4#線データ
yo_tyo=ln_ten_draw(rensen[i],pitch,yo_tyo)
else#円弧データ
if rensen[i][9]==1
yo_tyo=arc_ten_draw(rensen[i],pitch,yo_tyo)
else
yo_tyo=arc_ten_draw2(rensen[i],pitch,yo_tyo)
end
end
}
end
#楕円弧を連続線に変更してsen_aに格納する
def daen_rensen_array(sen_a,xy,bunkaku)
cl=1
ten=daenko_siten(xy[1..-1]);x1=ten[0];y1=ten[1];
ten=daenko_syuten(xy[1..-1]);x2=ten[0];y2=ten[1];
x=xy[1];y=xy[2];r=xy[3];sikaku=xy[4];syukaku=xy[5];hen=xy[6];ziku=xy[7]
enko_kaku=syukaku-sikaku
n=(enko_kaku/bunkaku).to_i
if n==0
sen_a<<[x1,y1,x2,y2]
return 1
end
s_arg=sikaku*PI/180
ziku_arg=ziku*PI/180
bun_arg=bunkaku*PI/180
x2_2=0;y2_2=0
0.upto(n-2){|i|
rx=r*cos(s_arg)
ry=r*sin(s_arg)*hen
l=hypot(ry,rx)
arg=atan2(ry,rx)
x1_2=x+l*cos(arg+ziku_arg)
y1_2=y+l*sin(arg+ziku_arg)

rx=r*cos(s_arg+bun_arg)
ry=r*sin(s_arg+bun_arg)*hen
l=hypot(ry,rx)
arg=atan2(ry,rx)
x2_2=x+l*cos(arg+ziku_arg)
y2_2=y+l*sin(arg+ziku_arg)
sen_a<<[x1_2,y1_2,x2_2,y2_2]

s_arg += bun_arg
}
if (x2-x2_2).abs<cl && (y2-y2_2).abs<cl
else
sen_a<<[x2_2,y2_2,x2,y2]
end
return 0
end
#連続線の総延長を返す
def rensen_total_l(rensen)
t_l=0
0.upto(rensen.size-1){|i|
if rensen[i].size==4#線データ
l=hypot(rensen[i][3]-rensen[i][1],rensen[i][2]-rensen[i][0])
else
if rensen[i][9]==1
r=rensen[i][6]
arg=(rensen[i][8]-rensen[i][7])*PI/180
l=r*arg
else
sen_a=[];bunkaku=1
xy=rensen[i][3..-1]
daen_rensen_array(sen_a,xy,bunkaku)
l=0
0.upto(sen_a.size-1){|i2|
l += hypot(sen_a[i2][3]-sen_a[i2][1],sen_a[i2][2]-sen_a[i2][0])
}
end
end
t_l += l
}
return t_l
end

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62@ai126170232220.41.access-internet.ne.jp>
・ツリー全体表示

続々
 kojima  - 21/8/4(水) 0:36 -
#rensenの並べ替え
def rev_array(rensen)
rensen2=[]
rensen.each{|item|
item[0],item[1],item[2],item[3]=item[2],item[3],item[0],item[1]
rensen2<<item
}
return rensen2.reverse
end
#コマンドライン引数
pitch=200.0;nn=10
sitei=ARGV[1].to_i
while ARGV.size>1
case argument=ARGV.pop
when /\/a/
pitch=argument[2..-1].to_f
when /\/b/
kiten=argument[2..-1].to_i
when /\/c/
houkou=argument[2..-1].to_i
when /\/d/
nn=argument[2..-1].to_i
end
end
#メインルーチン
sen_a=[];hp_a=[]
while ARGF.gets
xy=$_.split
if xy[0]=~/^hp/
hp_a<<[xy[1].to_f,xy[2].to_f]
end
if xy[0]=~/^\d|^-/
xy.collect!{|item|item.to_f}
sen_a<<xy
end
if xy[0]=~/^ci/
xy.collect!{|item|item.to_f}
if xy.size==4
xy<<0<<360<<1<<0
end
if(xy[4]>xy[5])
xy[4] -= 360
elsif xy[4]==xy[5]
xy[4]=0
xy[5]=360
end
zahyo=xy[1..-1]
ten=daenko_siten(zahyo);
x1=ten[0];y1=ten[1];
ten=daenko_syuten(zahyo);
x2=ten[0];y2=ten[1];
if(xy[7] != 0 && xy[6]==1)
xy[4] += xy[7]
xy[5] += xy[7]
xy[7]=0
end
sen_a<<[x1,y1,x2,y2,xy[1],xy[2],xy[3],xy[4],xy[5],xy[6],xy[7]]
end
end
0.upto(hp_a.size-1){|i|
ten=hp_a[i]
j,rensen=loop_renzoku_seach(sen_a,ten)
if rensen.size>0
if j==1
array=rensen_point_array(rensen)
s=zahyo_s(array)
if houkou ==1
if s<0
rensen=rev_array(rensen)
end
else
if s>0
rensen=rev_array(rensen)
end
end
end

t_l=rensen_total_l(rensen)
n=(t_l/pitch).to_i
if sitei==1
if kiten==2
l2=pitch-((t_l-n*pitch)+pitch)/2
yo_tyo=l2

elsif kiten==3
pitch=t_l/(n+1)
yo_tyo=0
printf("h#(#{n+1}分割) %.3fmm\n",pitch)
else
yo_tyo=0
end
printf("h#(#{n+1}分割)\n") unless kiten==3
else
pitch=t_l/nn
yo_tyo=0
printf("h#%.3fmm\n",pitch)
end
rensen_ten_draw(rensen,pitch,yo_tyo)
end
}
__END__
:end

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62@ai126170232220.41.access-internet.ne.jp>
・ツリー全体表示

22 / 310 ツリー    ←次へ | 前へ→
新規投稿 ┃ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索 ┃設定 ┃過去ログ ┃ホーム
 891110
ページ:  ┃  記事番号:  

C-BOARD Moyuku v1.03b5
Jw_cad Copyright (C)1997-2021 Jiro Shimizu & Yoshifumi Tanaka