34.2 関数対象のウォッチポイント (watchpoint function target)

ウォッチポイントは、関数に対象値を設定できます。その関数は、グラフの各 線分の始点と終点で評価しますが、終点の値が対象値をまたいだ場合、線形補 間ののちにそのヒットした座標 [x,y] を報告します。


    plot FOO watch func(...)=targetvalue

以下の自明な例は、その曲線が直線 y = ax + b と交わる場所にラベルを置く というウォッチポイント対象を設定します。[x,y] を評価したとき、関数 Line() は、現在の y 座標から値 ax + b までの偏差を返すので、描画グラフ と直線 ax+b の交点で評価したときには、その関数は 0 を返すことになりま す。そのため我々はこれをウォッチの対象として設定します。


    Line(x,y) = (a*x + b) - y
    plot cos(x) watch Line(x,y)=0,   a*x + b

評価の際に、対応する点の x, y, z の値は、それらが名前付きパラメータで あるかどうかに係わらず、その関数に対して有効なので、以下の変種も上の例 と同じ結果を産みます。


    Line(dummy1,dummy2) = dummy1*x + dummy2 - y
    plot cos(x) watch Line(a,b)=0,   a*x + b

さらに、インライン関数の代わりの関数ブロックを使っても同じです。


   function $Line() << EOF
      return (a*x + b) - y
   EOF
   plot cos(x) watch $Line()=0,   a*x + b

\includegraphics[width=3in,keepaspectratio]{figure_watch_contours}
より興味深い使用例は、等高線描画での等高線ラベルの配置の抑制です。 gnuplot には、等高線ラベルの自動的な配置を変更するオプションがいくつか あります (以下参照: set cntrlabel (116.15))。しかしグラフが混んでいる場合はそ のラベル付けでは満足できないかもしれません。代わりに、ウォッチポイント 関数対象が満たされる場所にのみラベルを配置することができます。

以下の例は、描画領域を横断する直線を選択し、そして等高線ラベルは、等高 線がその一つの直線を横切る場所にのみ配置します。


    set style watchpoint labels center nopoint font ",9"
    set style textbox noborder opaque margins 0.5, 0.5
    line(a,b) = a*x+b - y
    a = 0.6; b = 0.5


    set contours
    set cntrparam levels incr 0, .2, 4
    set view map


    splot f(x,y) with lines nosurface watch line(a,b)=0 label \
      sprintf("%.1f",z)

各ラベルを、等高線の z 座標を使って生成します。デフォルトのウォッチポ イントラベル " x : y " は、このグラフでは有益ではないので、等高線の z 値を印字する書式関数を使用しています。

竹野茂治@新潟工科大学
2025-05-15