jw_cad 外部変形 - (567) なでしこで円弧の端点に矢印を描く -

外部変形は データのやり取りをテキストファイルで行うので プログラム言語は 自由に選ぶことができます。図形は機能的かつシンプルなため、数多くのユーザーに受け入れられています。

 

なでしこで円弧の端点に矢印を描く

/* なでしこで円弧の端点に矢印を描く
@cls & echo off
path C:\nadesiko_1_589;%path%
copy jwc_temp.txt myfiles > nul
cnako %0 > jwc_temp.txt
goto:eof

REM #jww
REM #1ci 円弧を指示してください。
REM #bz
REM #e
*/

●cipoint(ci, pm)
  xとは実数; yとは実数; rとは実数; p1とは実数; p2とは実数; wとは実数; dとは実数
  coとは実数; siとは実数; qとは実数; xrとは実数; yrとは実数; aとは実数
  Fとは配列 = SPLIT(ci)
  x = F[0]
  y = F[1]
  r = F[2]
  p1 = F[3]
  p2 = F[4]
  w = F[5]
  d = F[6] * PI / 180
  co = COS(d)
  si = SIN(d)
  もし(pm = -1)なら
    q = p1 * PI / 180
  違えば
    q = p2 * PI / 180
  xr = COS(q) * r
  yr = SIN(q) * r * w
  aとは実数 = ATAN2(yr / w, xr * w) + d
  「{x + xr * co - yr * si} {y + xr * si + yr * co},{a}」を「,」で区切る
  それを戻す
ATAN2(y, x)
 もし(x = 0)なら(PI / 2 * SIGN(y))を戻す
 aとは実数 = ARCTAN(y / x)
  もし(x < 0)なら
    もし(y < 0)なら
      a = a - PI
    違えば
      a = a + PI
 aを戻す
●SPLIT(s)
  sを「 」で区切ったものを戻す
●CHOP(s)
  sを空白除去して戻す
●PTDIST(pt1, pt2)
  P1とは配列 = SPLIT(pt1)
  P2とは配列 = SPLIT(pt2)
  HYPOT(P2[0] - P1[0], P2[1] - P1[1])を戻す
●POLARTO(点, r, d)
  Fとは配列 = SPLIT(点)
  「{F[0] + r * COS(d)} {F[1] + r * SIN(d)}」を戻す
●ARROW(pt1, d, pm, size, xang, xan2)
  lとは実数; aとは実数; cとは実数
  slとは文字列; pt2とは文字列; pt3とは文字列; pt4とは文字列
  l = -size * pm
  a = xang * PI / 180 / 2.0
  pt2 = POLARTO(pt1, l, d - a)
  pt4 = POLARTO(pt1, l, d + a)
  もし(xan2 = 180)なら
    sl = "{pt1} {pt2} {pt4}"
  違えば
    c = COS(a) - SIN(a) * TAN( (90.0 - xan2 / 2.0) * PI / 180)
    pt3 = POLARTO(pt1, l * c, d)
    sl = "{pt1} {pt2} {pt3} {pt4}"
  "sl {sl}"を表示

「myfiles」を毎行読んで反復
  もし(対象を「^hq」で正規表現マッチ)ならば
    「bz」を表示
    続ける
  もし(対象を「^hp1ci\s+(\S+ \S+)」で正規表現マッチ)ならば
    pt = 抽出文字列[0]
    続ける
  もし(対象を「^ci\s+\S+ \S+ \S+」で正規表現マッチ)ならば
    L = SPLIT(CHOP(対象))
    NF = Lの配列要素数
    x = L[1]
    y = L[2]
    r = L[3]
    p1 = 0
    p2 = 0
    w = 1
    d = 0
    もし、(NF > 4)ならば、
      p1 = L[4]
      p2 = L[5]
      w = L[6]
      d = L[7]
      もし(w > 1)なら
        w = 1 / w
        r = r / w
        p1 = p1 - 90
        p2 = p2 - 90
    size = 5 #矢印の長さ( 図寸 )
    xang = 45 #矢印の交角( ゚ )
    xan2 = 120 #矢尻の交角( ゚ )
    ci = "{x} {y} {r} {p1} {p2} {w} {d}"
    p = cipoint(ci,-1); pt1 = p[0]; a1 =p[1]
    p = cipoint(ci, 1); pt2 = p[0]; a2 =p[1]
    l1 = PTDIST(pt, pt1)
    l2 = PTDIST(pt, pt2)
    もし(l1 <= l2)なら
      pm = -1
      pt = pt1
      a = a1 + PI / 2
    違えば
      pm = 1
      pt = pt2
      a = a2 + PI / 2
    ARROW(pt, a, pm, size, xang, xan2)