Indexへ
(22732)//【22634】→(22637)
------------------------
【タイトル】中心に行くほどピッチが細かくなる渦巻
【記事番号】 22634 (*)
【 日時 】04/10/05 18:30
【 発言者 】あかし EZE04122@Nifty.Com

中心に行くほどピッチが細かくなる渦巻を書きたいのですが
外部変形その他ご存じありませんか?
JWWのTEST6.JWW Fグループの2.5Dも参考にして
いろいろやりましたがうまくいきません。
多重円の中心から放射線を書き交点をスプライン曲線でつなぐのは
スマートではありませんし皆様お教えを


Indexへ
(22634)←【22637】→(22726)
------------------------
【タイトル】Re(1):中心に行くほどピッチが細かくなる渦巻
【記事番号】 22637 (22634)
【 日時 】04/10/05 18:45
【 発言者 】siegel

▼あかしさん:
>中心に行くほどピッチが細かくなる渦巻を書きたいのですが
>外部変形その他ご存じありませんか?
>JWWのTEST6.JWW Fグループの2.5Dも参考にして
>いろいろやりましたがうまくいきません。
>多重円の中心から放射線を書き交点をスプライン曲線でつなぐのは
>スマートではありませんし皆様お教えを

妥当かどうかわかりませんが、渦巻きを書く外変です。

「曲者達」
Jw_cad for Windows用 jgawk(mawk32)外部変形SCRIPT・様々な曲線の描画に挑戦
作者:杉井 左内さん
8.アルキメデス曲線      : r=r0+a・θ
http://www.vector.co.jp/soft/dos/business/se145971.html

アルキメデス螺線(B.C.225年)の説明は、下記です。
http://www004.upp.so-net.ne.jp/s_honma/curve/logarithmicspiral.htm

はずしていましたら、すみません。


Indexへ
(22637)←【22726】→(22870)
------------------------
【タイトル】Re(2):中心に行くほどピッチが細かくなる渦巻
【記事番号】 22726 (22637)
【 日時 】04/10/06 18:51
【 発言者 】あかし EZE04122@nifty.com

▼siegelさん:
 ありがとうございました、表現が曖昧で申しわけございません。
アルキメデス曲線のように渦巻の間隔が均等でなく一定の比率で
変化していく物を作図したいのです フェルマーの渦巻線(このたび知りました)の
中心からの折返し1/2を削除したような図形です。
「曲者達」の図形も確認できました。
もう少しがんばってみます、今後も宜しくお願いいたします。

>妥当かどうかわかりませんが、渦巻きを書く外変です。
>
>「曲者達」
>Jw_cad for Windows用 jgawk(mawk32)外部変形SCRIPT・様々な曲線の描画に挑戦
>作者:杉井 左内さん
>8.アルキメデス曲線      : r=r0+a・θ
>http://www.vector.co.jp/soft/dos/business/se145971.html
>
>アルキメデス螺線(B.C.225年)の説明は、下記です。
>http://www004.upp.so-net.ne.jp/s_honma/curve/logarithmicspiral.htm
>
>はずしていましたら、すみません。


Indexへ
(22726)←【22870】→(22871)
------------------------
【タイトル】Re(2):中心に行くほどピッチが細かくなる渦巻
【記事番号】 22870 (22637)
【 日時 】04/10/11 12:01
【 発言者 】99RI

▼siegelさん:
                      by 99RI

>アルキメデス螺線(B.C.225年)の説明は、下記です。
>http://www004.upp.so-net.ne.jp/s_honma/curve/logarithmicspiral.htm


 これは楽しいサイトですね。紹介していただいてありがたいです。

上記のサイトのトップは:
http://www004.upp.so-net.ne.jp/s_honma/

 なのですね。

 このサイトの、左側の「私の備忘録」から
   ⇒ 「数学・・・解析学分野」
   ⇒ 「いろいろな曲線」

 ということで、上記の
http://www004.upp.so-net.ne.jp/s_honma/curve/parameter.htm
に入れました。

 「さんすう大好き人間」には、本当にうれしいHPですね。

 …あ、脱線ネタですみませんでした (^^;


Indexへ
(22870)←【22871】→(22666)
------------------------
【タイトル】Re(3):中心に行くほどピッチが細かくなる渦巻
【記事番号】 22871 (22870)
【 日時 】04/10/11 12:17
【 発言者 】99RI

▼当ツリーの皆さん (^o^)
                      by 99RI
>上記のサイトのトップは:
>http://www004.upp.so-net.ne.jp/s_honma/

 ここで、下記の道具を見つけました (^o^)

http://okumedia.cc.osaka-kyoiku.ac.jp/~tomodak/grapes/

 ネット上には、素晴らしい世界がいろいろありますね。
  (jwwもそのひとつですね)
 問題は、私にそれを味わう力が無いということです… (^^;

 素晴らしい時代に生まれたものです(~/~)
 いつもは、縄文時代に生まれたかったと考えているオイラですが…

 再度の脱線、ご容赦を m(_ _)m


Indexへ
(22871)←【22666】→(22729)
------------------------
【タイトル】Re(1):中心に行くほどピッチが細かくなる渦巻
【記事番号】 22666 (22634)
【 日時 】04/10/06 09:14
【 発言者 】コジマ

▼あかしさん:
>中心に行くほどピッチが細かくなる渦巻を書きたいのですが
>外部変形その他ご存じありませんか?
>JWWのTEST6.JWW Fグループの2.5Dも参考にして
>いろいろやりましたがうまくいきません。
>多重円の中心から放射線を書き交点をスプライン曲線でつなぐのは
>スマートではありませんし皆様お教えを

どんな割合で半径を増やせばいいか分かりませんので、とりあえず、半径を倍増する外変を作ってみました。
半径の初期値を 10 にすれば次からの半径は 30 60 100 150 ・・・となってゆきます。

尚、この外変の実行には mswin32 版 Ruby のインストールが必要です。
以下で入手できます。

http://www61.tok2.com/home2/gravelroad/tips/install.html

コピペ後、全角スペースを半角スペースに一括置換してください。

◎バッチファイル(ファイル名 渦巻円2.bat)

@REM 渦巻き円を作図(半径倍増)
@echo off
REM #jww
REM #cd
REM #h0
REM #hp
REM #c回転方向 左廻り:1 右廻り:無指定 /_/a
REM #c半径初期値を入力(2倍・3倍・4倍・・・に増加してゆく)/_/b
REM #c渦巻き数を入力 /_/c
REM #1基準点を指示
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -Ks 渦巻円2.rb temp.txt %1 %2 %3 > jwc_temp.txt


◎スクリプトファイル(ファイル名 渦巻円2.rb)

BEGIN{
$x1=Array.new
$x2=Array.new
$kaiten=0
$upr=0
$n=0
while ARGV.length > 1
case argument=ARGV.pop
when/^\/a/
$kaiten=argument[2..-1].to_i
when/^\/b/
$upr=argument[2..-1].to_f
when/^\/c/
$n=argument[2..-1].to_i
end
end
}
def main
while ARGF.gets
xy =split
if xy[0]=="hp1"
  ax=xy[1].to_f
  ay=xy[2].to_f
end
end
m=0
n=1
r=$upr
$n.times{
m +=n-1
printf("ci %e %e %e %e %e %e %e\n",ax,ay,r*m,180,360,1,0)
$x1.push(ax-r*m)
$x2.push(ax+r*m)
n+=1
}
if $kaiten==1
  n=$x1.size-1
  m=$x1.size-2
else
  n=$x1.size-2
  m=$x1.size-1
end
($n-1).times{
x=$x1[n]+($x2[m]-$x1[n])/2
r=($x2[m]-$x1[n])/2
printf("ci %e %e %e %e %e %e %e\n",x,ay,r,0,180,1,0)
n-=1
m-=1
}
end
main()


Indexへ
(22666)←【22729】→(22757)
------------------------
【タイトル】Re(2):中心に行くほどピッチが細かくなる渦巻
【記事番号】 22729 (22666)
【 日時 】04/10/06 19:05
【 発言者 】あかし EZE04122@nifty.com

▼コジマさん:
 早速に外変組んでいただきましてありがとうございます。
私は外変の実行にRubyを使った事がありません、これを機会に
やってみます Gawkの物もなんとか出来ていますので結果が楽しみです。
今後とも宜しくお願いいたします。

渦巻の間隔が増えていく比率は10から20%です

>どんな割合で半径を増やせばいいか分かりませんので、とりあえず、半径を倍増する外変を作ってみました。
>半径の初期値を 10 にすれば次からの半径は 30 60 100 150 ・・・となってゆきます。
>
>尚、この外変の実行には mswin32 版 Ruby のインストールが必要です。
>以下で入手できます。
>
>http://www61.tok2.com/home2/gravelroad/tips/install.html


Indexへ
(22729)←【22757】→(22798)
------------------------
【タイトル】Re(2):中心に行くほどピッチが細かくなる渦巻
【記事番号】 22757 (22666)
【 日時 】04/10/07 20:43
【 発言者 】あかし EZE04122@nifty.com

▼コジマ 様:
渦巻円2.rbの置き場所(PATH)にちょっとまごつきましたが本当にうまく行くものですね、 まつもと様のHPでRubyのリファレンスも見ております。

>どんな割合で半径を増やせばいいか分かりませんので、とりあえず、半径を倍増する外変を作ってみました。
>半径の初期値を 10 にすれば次からの半径は 30 60 100 150 ・・・となってゆきます。

目標のスクリプトは 中心径約30mm〜(入力値) 中心に続く幅約8mm〜(入力値) 幅増加の率or(加算寸法mm)ずつ太(細)くなる  渦巻き回数(入力値)

と言う物です、目下懸命に模索中ですが先は見えません(T.T)1週間がんばってもダメなときは コジマ様 模範解答を下さい。


Indexへ
(22757)←【22798】→(22803)
------------------------
【タイトル】Re(3):中心に行くほどピッチが細かくなる渦巻
【記事番号】 22798 (22757)
【 日時 】04/10/09 10:36
【 発言者 】コジマ

模範解答ではありませんが(もっと簡潔な方法があるかも?)
以下のスクリプトで実行できます。

コピペ後、全角スペースを半角スペースに一括置換してください。

◎バッチファイル(ファイル名 渦巻円3.bat)

@REM 渦巻き円を作図(半径加増)
@echo off
REM #jww
REM #cd
REM #h0
REM #hp
REM #c回転方向 左廻り:1 右廻り:無指定 /_/a
REM #c最内側の半径を入力:r(mm) /_/b
REM #c追加する半径との数値差を入力:决1(mm) /_/c
REM #c数値差を順次増加させる値を入力:决2(mm) /_/d
REM #c渦巻き数を入力 /_/e
REM #1基準点を指示
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -Ks 渦巻円3.rb temp.txt %1 %2 %3 %4 %5 > jwc_temp.txt

◎スクリプトファイル(ファイル名 渦巻円3.rb )

BEGIN{     #↓注釈文
$x1=Array.new #空の配列を新規作成して変数$x1に代入
$x2=Array.new #空の配列を新規作成して変数$x2に代入
$kaiten=0   #回転方向デフォルト値(無指定の時右廻り)
$r=30     #最内側半径のデフォルト値(無指定の時30mm)
$dr1=8     #追加半径との数値差デフォルト値(無指定の時8mm)
$dr2=4     #順次増加させる値のデフォルト値(無指定の時4mm)
$n=10     #渦巻き数のデフォルト値(無指定の時10)

while ARGV.length > 1       #コマンドライン引数が1個以上の時以下繰り返し
 case argument=ARGV.pop     #コマンドライン引数のチェック開始
  when/^\/a/           #aならば以下の処理
   $kaiten=argument[2..-1].to_i #回転方向の指定($kaitenの値を入替る)
  when/^\/b/           #bならば以下の処理
   $r=argument[2..-1].to_f   #最内側半径の指定($rの値を入替る)
  when/^\/c/           #cならば以下の処理
   $dr1=argument[2..-1].to_f  #最内側半径の指定($dr1の値を入替る)
  when/^\/d/           #dならば以下の処理
  $dr2=argument[2..-1].to_f #追加する半径との数値差の指定($dr2の値を入替る)
  when/^\/e/           #eならば以下の処理
   $n=argument[2..-1].to_i   #渦巻き数の指定($nの値を入替る)
 end               #コマンドライン引数のチェック終了
end                #while文の終わり
}                 #BEGIN部分の終わり


while ARGF.gets         #temp.textの1行ずつの読込開始
xy =split            #1行文の文字列を分割して配列とし変数xyに代入。

if xy[0]=="hp1"    #配列の最初の文字がhp1ならば(CAD画面上での指示点1)
  ax=xy[1].to_f   #配列の2番目の文字を浮動小数点数に変換して変数axに代入
  ay=xy[2].to_f   #配列の3番目の文字を浮動小数点数に変換して変数ayに代入
end          #if 構文の終了
end          #temp.textの1行ずつの読込終了

printf("ci %e %e %e %e %e %e %e\n",ax,ay,$r,180,360,1,0)
#x座標ax,y座標ayを中心に半径$r 始角180°終角360°扁平率1 軸角0 の半円を描く
$x1.push(ax-$r)    #配列$x1の末尾へ ax-$r のx座標値を格納する。
$x2.push(ax+$r)    #配列$x2の末尾へ ax+$r のx座標値を格納する。

n=0          #初期値0の変数を用意する
r=$r+$dr1       #追加してゆく半円の半径初期値
($n-1).times{     #以降の{ }内の実行文を 渦巻き数-1回繰り返す。
printf("ci %e %e %e %e %e %e %e\n",ax,ay,r,180,360,1,0)
#x座標ax,y座標ayを中心に半径r 始角180°終角360°扁平率1 軸角0 の半円を描く

$x1.push(ax-r)    #配列$x1の末尾へ ax-r のx座標値を格納する。
$x2.push(ax+r)    #配列$x2の末尾へ ax+r のx座標値を格納する。
n+=1         #繰り返す度に n は 1 ずつ増加してゆく
r+=$dr1+$dr2*n    #繰り返す度に 半径r は $dr1+$dr2*n ずつ増加してゆく
}          #times 実行文の末尾


if $kaiten==1    #回転方向の指定に入力した文字が1ならば
  n=$x1.size-1   #nの初期値は配列$x1に格納された要素数-1とする
  m=$x1.size-2   #mの初期値は配列$x1に格納された要素数-2とする
else         #回転方向の指定に入力した文字が1でないならば
  n=$x1.size-2   #nの初期値は配列$x1に格納された要素数-2とする
  m=$x1.size-1   #mの初期値は配列$x1に格納された要素数-1とする
end         #if文の終了

($n-1).times{    #以降の{ }内の実行文を 渦巻き数-1回繰り返す。
x=$x1[n]+($x2[m]-$x1[n])/2  #反対側の半円の中心の x座標を求める
r=($x2[m]-$x1[n])/2     #反対側の半円の 半径r を求める
printf("ci %e %e %e %e %e %e %e\n",x,ay,r,0,180,1,0)
#x座標x,y座標ayを中心に半径r 始角0°終角180°扁平率1 軸角0 の半円を描く

n-=1         #繰り返す度に n は 1 ずつ減少してゆく
m-=1         #繰り返す度に m は 1 ずつ減少してゆく
}          #times 実行文の末尾


Indexへ
(22798)←【22803】→(22812)
------------------------
【タイトル】Re(4):中心に行くほどピッチが細かくなる渦巻
【記事番号】 22803 (22798)
【 日時 】04/10/09 11:51
【 発言者 】あかし EZE04122@nifty.com

▼コジマ 様:

管理人様 お礼と感想ですがこの交換室に不適切であれば削除して下さい。

渦巻初日 初めて知りました
脳味噌混乱してわからんようになりました
一定の割合で幅が狭くなっていく渦巻きは
半径の差がある正半円が互い違いに組み合わせてもできますね
見れば見るほど錯覚に陥ります
線色換えて正半円の中心に正円を重ねると間違いなく円弧ですし
渦巻きの芯に正円を重ねるとどこの部分も変化していますね
微分で表現される常に中心のない?曲線(円弧は芯がありますね)
が最後まで連続しているのかと思っておりました
確認後も半信半疑です 頭の芯までいたくなりました
コジマ様のスクリプトを何度も読み返したり 
作図した渦巻を消去したりの結果です 
これが曲線属性にされていれば見抜けませんでした
でも肝心の外変は出来ていません ツライ

渦巻2日目 等角螺旋と極座標の表現数式をSiegel様に
教えていただきましたが渦巻線の性質?と変位は何となくで、
数学的には確認し切れませんでした こちらも ツライ

渦巻3日目 試行錯誤(?_?)のあと気づきましたが隣り合わせた線間の
増減比がまちまちですし90°回転させた時に見え方が違います。
1/2ではなく4分割円弧を90°毎に組み合わせた物を
作図しましたが(外変は組めません)目のまわりか方がすこしましかな?

最終日 渦巻円3 ありがとうございます、完成品ですね。
スクリプトにコメントまで特に**.Pushは大昔のアセンブラー時の表現が残って
いるのですね この渦巻円は厚紙にコピーして線に沿って切り中心を持ち上げて
糸で吊し下から加熱して上昇気流で回転するのを子供達に見せる教材に使います。
えんぴつに糸を巻き付けてぐるぐる書いたりしましたがやはりCADで書きたいと
思いました。コメントもありますし続けて1/4円弧の組み合わせた物に
アタックしてみます         長文すみません。


Indexへ
(22803)←【22812】→(22805)
------------------------
【タイトル】Re(5):中心に行くほどピッチが細かくなる渦巻
【記事番号】 22812 (22803)
【 日時 】04/10/09 15:27
【 発言者 】コジマ

おっしゃるとおり、半円を組あわせて、視覚的に渦巻き状に見せています。
スクリプトの注釈のとおり。

数学的な、渦巻き状微分で表現される常に中心のない?曲線
が最後まで連続しているものは、作れません。(能力不足)

尚、さきほどのスクリプトは下側の半円が同心円なので、修正しました。

以下のスクリプトは、修正して同心円をなくしています。
但し、数学的な渦巻き曲線ではありません。


BEGIN{
$x1=Array.new
$x2=Array.new
$kaiten=0
$r=30
$dr1=8
$dr2=4
$n=10

while ARGV.length > 1
 case argument=ARGV.pop
  when/^\/a/
   $kaiten=argument[2..-1].to_i
  when/^\/b/
   $r=argument[2..-1].to_f
  when/^\/c/
   $dr1=argument[2..-1].to_f
  when/^\/d/
  $dr2=argument[2..-1].to_f
  when/^\/e/
   $n=argument[2..-1].to_i
 end
end
}
while ARGF.gets
xy =split

if xy[0]=="hp1"
  ax=xy[1].to_f
  ay=xy[2].to_f
end
end

printf("ci %e %e %e %e %e %e %e\n",ax,ay,$r,180,360,1,0)
$x1.push(ax-$r)
$x2.push(ax+$r)
n=0
r=$r+$dr1+$dr2/4
($n-1).times{
if $kaiten==1
  zure=$dr2/4+($dr2/2)*n
else
  zure=-$dr2/4-($dr2/2)*n
end
printf("ci %e %e %e %e %e %e %e\n",ax+zure,ay,r,180,360,1,0)
$x1.push(ax+zure-r)
$x2.push(ax+zure+r)
n+=1
r+=$dr1+$dr2/2+$dr2*n
}          #times 実行文の末尾

if $kaiten==1
  n=$x1.size-1
  m=$x1.size-2
else
  n=$x1.size-2
  m=$x1.size-1
end

($n-1).times{
x=$x1[n]+($x2[m]-$x1[n])/2
r=($x2[m]-$x1[n])/2
printf("ci %e %e %e %e %e %e %e\n",x,ay,r,0,180,1,0)
n-=1
m-=1
}


Indexへ
(22812)←【22805】→(22813)
------------------------
【タイトル】Re(4):中心に行くほどピッチが細かくなる渦巻
【記事番号】 22805 (22798)
【 日時 】04/10/09 12:35
【 発言者 】99RI

▼コジマさん:
                        by 99RI

 通りがかりのものですが、少し教えてください。

>($n-1).times{    #以降の{ }内の実行文を 渦巻き数-1回繰り返す。
>x=$x1[n]+($x2[m]-$x1[n])/2  #反対側の半円の中心の x座標を求める
>r=($x2[m]-$x1[n])/2     #反対側の半円の 半径r を求める
>printf("ci %e %e %e %e %e %e %e\n",x,ay,r,0,180,1,0)
>#x座標x,y座標ayを中心に半径r 始角0°終角180°扁平率1 軸角0 の半円を描く

 私は、awk外変は少し判るのですが、rubyはサッパリです。
  (この際、覚えなくては)

 ところで、今回のスクリプトは、上記の引用部分を見ますと、
「始角0°終角180°」の半円を、円の中心を少しずつずらして、
次々と描画して行き、渦状に並べているのでしょうか。
 あるいは、微細な直線で細かく近似させているのでしょうか?
渦の中心からどの方向に見ても、渦の間隔が正確に等比級数的に
なるためには、後者のやり方が必要なのかなと思いまして、質問
させて頂きました。 よろしく m(__)m  (^o^)


Indexへ
(22805)←【22813】→(22815)
------------------------
【タイトル】Re(5):中心に行くほどピッチが細かくなる渦巻
【記事番号】 22813 (22805)
【 日時 】04/10/09 15:42
【 発言者 】コジマ

▼99RIさん:
>▼コジマさん:
>                        by 99RI
>
> 通りがかりのものですが、少し教えてください。
>
>>($n-1).times{    #以降の{ }内の実行文を 渦巻き数-1回繰り返す。
>>x=$x1[n]+($x2[m]-$x1[n])/2  #反対側の半円の中心の x座標を求める
>>r=($x2[m]-$x1[n])/2     #反対側の半円の 半径r を求める
>>printf("ci %e %e %e %e %e %e %e\n",x,ay,r,0,180,1,0)
>>#x座標x,y座標ayを中心に半径r 始角0°終角180°扁平率1 軸角0 の半円を描く
>
> 私は、awk外変は少し判るのですが、rubyはサッパリです。
>  (この際、覚えなくては)
>
> ところで、今回のスクリプトは、上記の引用部分を見ますと、
>「始角0°終角180°」の半円を、円の中心を少しずつずらして、
>次々と描画して行き、渦状に並べているのでしょうか。
> あるいは、微細な直線で細かく近似させているのでしょうか?
>渦の中心からどの方向に見ても、渦の間隔が正確に等比級数的に
>なるためには、後者のやり方が必要なのかなと思いまして、質問
>させて頂きました。 よろしく m(__)m  (^o^)


おっしゃるとおり(スクリプトの注釈のとおり)半円を並べて、視覚的に渦巻きにみせています。

数学的な、渦巻き曲線ではありません。
(とくに、このスクリプトでは、下側の半円が同心円なので特に)

下側の半円の半円の中心もズラして同心円をなくせば、間隔は一定の比率で増えていきます。以下修正したものです。
但し、あくまでも、数学的な、渦巻き曲線ではありません。

BEGIN{
$x1=Array.new
$x2=Array.new
$kaiten=0
$r=30
$dr1=8
$dr2=4
$n=10

while ARGV.length > 1
 case argument=ARGV.pop
  when/^\/a/
   $kaiten=argument[2..-1].to_i
  when/^\/b/
   $r=argument[2..-1].to_f
  when/^\/c/
   $dr1=argument[2..-1].to_f
  when/^\/d/
  $dr2=argument[2..-1].to_f
  when/^\/e/
   $n=argument[2..-1].to_i
 end
end
}
while ARGF.gets
xy =split

if xy[0]=="hp1"
  ax=xy[1].to_f
  ay=xy[2].to_f
end
end

printf("ci %e %e %e %e %e %e %e\n",ax,ay,$r,180,360,1,0)
$x1.push(ax-$r)
$x2.push(ax+$r)
n=0
r=$r+$dr1+$dr2/4
($n-1).times{
if $kaiten==1
  zure=$dr2/4+($dr2/2)*n
else
  zure=-$dr2/4-($dr2/2)*n
end
printf("ci %e %e %e %e %e %e %e\n",ax+zure,ay,r,180,360,1,0)
$x1.push(ax+zure-r)
$x2.push(ax+zure+r)
n+=1
r+=$dr1+$dr2/2+$dr2*n
}          #times 実行文の末尾

if $kaiten==1
  n=$x1.size-1
  m=$x1.size-2
else
  n=$x1.size-2
  m=$x1.size-1
end

($n-1).times{
x=$x1[n]+($x2[m]-$x1[n])/2
r=($x2[m]-$x1[n])/2
printf("ci %e %e %e %e %e %e %e\n",x,ay,r,0,180,1,0)
n-=1
m-=1
}


Indexへ
(22813)←【22815】→(22817)
------------------------
【タイトル】今度は上が同心円
【記事番号】 22815 (22813)
【 日時 】04/10/09 16:01
【 発言者 】コジマ

修正したつもりでしたが、上が同心円になっていますね。

半円では無理かな?


Indexへ
(22815)←【22817】→(22879)
------------------------
【タイトル】再修正
【記事番号】 22817 (22815)
【 日時 】04/10/09 16:35
【 発言者 】コジマ

数値をまちがえていました。
以下同心円はありません。

BEGIN{
$x1=Array.new
$x2=Array.new
$kaiten=0
$r=30
$dr1=8
$dr2=4
$n=10

while ARGV.length > 1
 case argument=ARGV.pop
  when/^\/a/
   $kaiten=argument[2..-1].to_i
  when/^\/b/
   $r=argument[2..-1].to_f
  when/^\/c/
   $dr1=argument[2..-1].to_f
  when/^\/d/
  $dr2=argument[2..-1].to_f
  when/^\/e/
   $n=argument[2..-1].to_i
 end
end
}
while ARGF.gets
xy =split

if xy[0]=="hp1"
  ax=xy[1].to_f
  ay=xy[2].to_f
end
end

printf("ci %e %e %e %e %e %e %e\n",ax,ay,$r,180,360,1,0)
$x1.push(ax-$r)
$x2.push(ax+$r)
n=0
r=$r+$dr1+$dr2/4
($n-1).times{
if $kaiten==1
  zure=(1+n)*$dr2/4
else
  zure=(-1-n)*$dr2/4
end
printf("ci %e %e %e %e %e %e %e\n",ax+zure,ay,r,180,360,1,0)
$x1.push(ax+zure-r)
$x2.push(ax+zure+r)
n+=1
r+=$dr1+$dr2/4+$dr2*n
}          #times 実行文の末尾

if $kaiten==1
  n=$x1.size-1
  m=$x1.size-2
else
  n=$x1.size-2
  m=$x1.size-1
end

($n-1).times{
x=$x1[n]+($x2[m]-$x1[n])/2
r=($x2[m]-$x1[n])/2
printf("ci %e %e %e %e %e %e %e\n",x,ay,r,0,180,1,0)
n-=1
m-=1
}


Indexへ
(22817)←【22879】→(22881)
------------------------
【タイトル】曲線(直線の集合)版
【記事番号】 22879 (22805)
【 日時 】04/10/11 17:17
【 発言者 】コジマ

▼99RIさん:
>▼コジマさん:
>                        by 99RI
>
> 通りがかりのものですが、少し教えてください。
>
>>($n-1).times{    #以降の{ }内の実行文を 渦巻き数-1回繰り返す。
>>x=$x1[n]+($x2[m]-$x1[n])/2  #反対側の半円の中心の x座標を求める
>>r=($x2[m]-$x1[n])/2     #反対側の半円の 半径r を求める
>>printf("ci %e %e %e %e %e %e %e\n",x,ay,r,0,180,1,0)
>>#x座標x,y座標ayを中心に半径r 始角0°終角180°扁平率1 軸角0 の半円を描く
>
> 私は、awk外変は少し判るのですが、rubyはサッパリです。
>  (この際、覚えなくては)
>
> ところで、今回のスクリプトは、上記の引用部分を見ますと、
>「始角0°終角180°」の半円を、円の中心を少しずつずらして、
>次々と描画して行き、渦状に並べているのでしょうか。
> あるいは、微細な直線で細かく近似させているのでしょうか?
>渦の中心からどの方向に見ても、渦の間隔が正確に等比級数的に
>なるためには、後者のやり方が必要なのかなと思いまして、質問
>させて頂きました。 よろしく m(__)m  (^o^)


微細な直線で細かく近似させてみました。
数学的な、渦巻き曲線に近くなったようですが、
ただ、半円に比べると、実行速度がかなり遅いです。


◎バッチファイル(渦巻曲線.bat)

@REM 渦巻き曲線(間隔増大)を作図
@echo off
REM #jww
REM #cd
REM #h0
REM #c回転方向 左廻り:1 右廻り:無指定 /_/a
REM #c最内側の半径を入力:r(mm) 無指定=30/_/b
REM #c追加する半径との数値差を入力:决1(mm) 無指定=8/_/c
REM #c数値差を順次増加させる値を入力:决2(mm) 無指定=4/_/d
REM #c渦巻き数を入力 無指定=10/_/e
REM #c曲線の円分割角度 無指定=10 /_/f
REM #1基準点を指示
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -Ks 渦巻曲線.rb temp.txt %1 %2 %3 %4 %5 %6 > jwc_temp.txt


◎スクリプトファイル(渦巻曲線.rb)

BEGIN{
$x=Array.new
$y=Array.new
$kaiten=0
$r=30
$dr1=8
$dr2=4
$n=10
$bunkatukaku=10.to_f

while ARGV.length > 1
 case argument=ARGV.pop
  when/^\/a/
   $kaiten=argument[2..-1].to_i
  when/^\/b/
   $r=argument[2..-1].to_f
  when/^\/c/
   $dr1=argument[2..-1].to_f
  when/^\/d/
  $dr2=argument[2..-1].to_f
  when/^\/e/
   $n=argument[2..-1].to_i
  when/^\/f/
   $bunkatukaku=argument[2..-1].to_f
 end
end

}
def main
$kaitensu=($n*360/$bunkatukaku).to_i
$rajian=2*Math::PI*($bunkatukaku/360)

while ARGF.gets
xy =split
if xy[0]=="hp1"
  ax=xy[1].to_f
  ay=xy[2].to_f
end
end
if $kaiten==1
  kakudo=-$rajian
else
  kakudo=$rajian
end

m=0
n=0
r=$r
$n.times{

(360/$bunkatukaku).to_i.times{
$x.push(r*Math.cos(kakudo*n))
$y.push(r*Math.sin(kakudo*n))
n+=1
r+=$dr1/(360/$bunkatukaku)+$dr2/(360/$bunkatukaku)*m
}
m+=1
}
dr=r+$dr1/(360/$bunkatukaku)+$dr2/(360/$bunkatukaku)

$x.push(dr)
$y.push(0)

n=0
($x.size-1).times{
sen(ax+$x[n],ay+$y[n],ax+$x[n+1],ay+$y[n+1])

n+=1
}
end

def sen(x1,y1,x2,y2)
print"pl\n"
printf("%e %e %e %e\n",x1,y1,x2,y2)
end
main()


Indexへ
(22879)←【22881】//(22635)
------------------------
【タイトル】曲線属性指定の変更
【記事番号】 22881 (22879)
【 日時 】04/10/11 18:09
【 発言者 】コジマ

直線が各々独立した曲線になっていました。
(実行速度が遅い原因にもなっている)

まとめて1個の曲線に変更します。

BEGIN{
$x=Array.new
$y=Array.new
$kaiten=0
$r=30
$dr1=8
$dr2=4
$n=10
$bunkatukaku=10.to_f

while ARGV.length > 1
 case argument=ARGV.pop
  when/^\/a/
   $kaiten=argument[2..-1].to_i
  when/^\/b/
   $r=argument[2..-1].to_f
  when/^\/c/
   $dr1=argument[2..-1].to_f
  when/^\/d/
  $dr2=argument[2..-1].to_f
  when/^\/e/
   $n=argument[2..-1].to_i
  when/^\/f/
   $bunkatukaku=argument[2..-1].to_f
 end
end
}
def main
$kaitensu=($n*360/$bunkatukaku).to_i
$rajian=2*Math::PI*($bunkatukaku/360)
while ARGF.gets
xy =split
if xy[0]=="hp1"
  ax=xy[1].to_f
  ay=xy[2].to_f
end
end
if $kaiten==1
  kakudo=-$rajian
else
  kakudo=$rajian
end
print"pl\n"
m=0
n=0
r=$r
$n.times{
(360/$bunkatukaku).to_i.times{
$x.push(r*Math.cos(kakudo*n))
$y.push(r*Math.sin(kakudo*n))
n+=1
r+=$dr1/(360/$bunkatukaku)+$dr2/(360/$bunkatukaku)*m
}
m+=1
}
dr=r+$dr1/(360/$bunkatukaku)+$dr2/(360/$bunkatukaku)
$x.push(dr)
$y.push(0)
n=0
($x.size-1).times{
sen(ax+$x[n],ay+$y[n],ax+$x[n+1],ay+$y[n+1])
n+=1
}
end
def sen(x1,y1,x2,y2)
printf("%e %e %e %e\n",x1,y1,x2,y2)
end
main()