June 20, 2005

なでしこその2

[CAD]

_やってみた、プログラムは楽しい。

------------devidesc.bat----------------
@REM 円ソリッド分割
@echo off
goto exe
REM #jww
REM #cd
REM #h1
REM #g1
REM #hc円ソリッド図形を選択してください
REM #e
:exe
cnako ソリッド分割.nako
ren jwc_temp.txt jwc_ttt.txt
ren _temp.txt jwc_temp.txt
del jwc_ttt.txt
:end
rem pause

------------ソリッド分割.nako----------
# 円ソリッドを三角形ソリッドに分割する
#       秋天越が2005年06月19(日)に書いて
#              06月20(月)に修正した なでしこスクリプト
#!cnako

■円ソリッドとは
 # 角度単位:ラジアン
 # 円フラグ:円「100」弓形「5」扇形「0」円外「-1」
 ・X
 ・Y
 ・横半径
 ・扁平率
 ・傾角
 ・始角
 ・円弧角
 ・円フラグ
 ・認証(行)〜
  構成は行を「 」で区切ったもの。
   Xは   構成¥1。
   Yは   構成¥2 。
   横半径は 構成¥3。
   扁平率は 構成¥4。
   傾角は  構成¥5。
   始角は  構成¥6。
   円弧角は 構成¥7。
   円フラグは構成¥8。
#

●円ソリッド三角化(X、Y、横半径、扁平率、傾角、始角、円弧角、円フラグ)
 # 角度単位:ラジアン
 # 円フラグ:円「100」弓形「5」扇形「0」円外「-1」
 縦半径 = 横半径 * 扁平率
 円割数は96。
 もし横半径が5000未満ならば、円割数は48。
 もし横半径が2500未満ならば、円割数は24。
 もし横半径が1250未満ならば、円割数は12。
 円割角 = 2.0 * 3.1415926 / 円割数。
 分割数 = (円弧角 / 円割角)の整数部分
 もし分割数が0ならば、分割数は1。
 分割角 = 円弧角 / 分割数
 分割数に1を足して、繰返数に代入。

 もし円フラグが5ならば
  点1は「」。
  点0は「」。
  # 三角ソリッドに分割して出力
  #「pl」と一行出力。
  繰返数 回
   点2は円上点(X、Y、横半径、縦半径、傾角、始角 + (回数-1) * 分割角)。
   もし回数が1以下ならば
    点0は点2。 # 始点を原点にする
   もし回数が1超ならば
    # 出力
    「sl {点0} {点1} {点2}」と一行出力。
   ここまで
   点1は点2。
  ここまで
  #「#」と一行出力。

 違えば
  点1は「」。
  もし円フラグが0未満ならば
   点0は円外原点(X、Y、横半径、扁平率、傾角、始角、円弧角)。
  違えば
   点0は「{X} {Y}」。
  ここまで
  # 三角ソリッドに分割して出力
  #「pl」と一行出力。
  繰返数 回
   点2は円上点(X、Y、横半径、縦半径、傾角、始角 + (回数-1) * 分割角)。
   もし回数が1超ならば
    # 出力
    「sl {点0} {点1} {点2}」と一行出力。
   ここまで
   点1は点2。
  ここまで
  #「#」と一行出力。
 ここまで

●円外原点(X、Y、横半径、扁平率、傾角、始角、円弧角)
 # 角度単位:ラジアン
 # ここの関数数式表現を日本語的にするのは難しい
 # というか作業用の仮変数に和名つけたりすると返ってわかり難い
 xa = 横半径 * COS(始角)
 ya = 横半径 * SIN(始角)
 xb = 横半径 * COS(始角 + 円弧角)
 yb = 横半径 * SIN(始角 + 円弧角)
 px = (ya*yb*(yb-ya) - xa*yb*xa + xb*ya*xb)/(xb*ya - xa*yb)
 もしyaが0ならば
  py = (xb-xa) * xb/yb + yb
 違えば
  py = xa/ya * xa - xa/ya * px + ya
 ここまで
 # 楕円は扁平率で補正する
 py = py * 扁平率
 原点X= X + px * COS(傾角) - py * SIN(傾角)
 原点Y= Y + py * COS(傾角) + px * SIN(傾角)
 それは「{原点X} {原点Y}」。

●円上点(X、Y、横半径、縦半径、傾角、中心角)
 # 角度単位:ラジアン
 点X = X + 横半径 * COS(中心角) * COS(傾角) - 縦半径 * SIN(中心角) * SIN(傾角)
 点Y = Y + 縦半径 * SIN(中心角) * COS(傾角) + 横半径 * COS(中心角) * SIN(傾角)
 それは「{点X} {点Y}」。

# メイン
「はじまり」という。
外変印は   「^hq」。
円ソリッド印は「^sc」。
「_temp.txt」に出力先設定。
出力先初期化。

 「jwc_temp.txt」を毎行読んで反復
  もし対象が「{外変印}」で正規表現マッチするならば
   「hd」と一行出力。
  違えば
   もし対象が「{円ソリッド印}」で正規表現マッチするならば
    要素とは円ソリッド。要素の認証(対象)。
    円ソリッド三角化(要素@X、要素@Y、要素@横半径、要素@扁平率、要素@傾角、要素@始角、要素@円弧角、要素@円フラグ)。
   違えば
    「{対象}」を一行出力。
   ここまで
  ここまで
 ここまで
おわり。

投稿者 秋天越 : 10:47 AM | トラックバック (1)

このエントリーのトラックバックURL:

http://akitenh.s55.xrea.com/mt/mt-tb.cgi/100

コメント

すごいな、なんでもすぐ出来ちゃうんですねー。
見た目が証明問題みたいなのと、ちょっと間違っててもミスの発見が異様に難しそうなことに大変抵抗があります。

Posted by: : June 20, 2005 10:25 PM

卯さんこんにちは
原典を翻訳してみたのですが、和文的に書いていても頭の中では「if then」、「(..).each」、「puts」なんてね、笑えますな。

Posted by: 秋天越 : June 20, 2005 11:56 PM

すごいです!何ヶ国語も話せる人を見てるよう。
私は母国語も話せない状態です。
1行ずつ(いや一語ずつですね)
にらめっこして、参考にさせていただきます。

日本語記述なので取っ付き易いかと思いましたが、やはり難しい。
プログラムの知識が無い私には、まだまだ遠い道のりになりそうです。

Posted by: kisa : June 21, 2005 11:13 AM

kisaさんこんにちは
いやお恥ずかしい、ほぼ数式の変数を和名にしただけの様な気がします、外変的処理はメインからの数行のみで。

Posted by: 秋天越 : June 21, 2005 12:52 PM

コメントする









名前、アドレスを登録しますか?