TCanvasの座標とTLine

Canvasの中に線を描けるTLineがものすごく分かりにくいのでまとめます。

まず、Canvas内の座標に関して。

Canvasは3つの座標系を持っています。

  • User : Canvasの中に描かれた絵の座標
  • NDC : 左下を(0,0), 右上を(1,1)としてX,Yそれぞれ[0,1]で表した座標
  • Pixel: Canvas左上を原点として、画像のピクセル

CanvasのPixel数はTCanvasのコンストラクタで指定出来ます。ただ、Pixel座標は使う場面はあまりありません。 これのやり取りはTPadの関数(例えばXtoPixel(Double_t)など)でやり取りが出来ます。そして、TCanvasオブジェクト上に線を描画するクラスTLineがあるのですが、これが結構とっつきにくい。

ってか、これかなり曲者で、何故か

TLine *line = new TLine();
TCanvas *c = new TCanvas();
c->Divide(1,2);
c->cd(1);
line->DrawLineNDC(0,0,1,1);

とかするとTFrame(ヒストグラムとか)の上まで線を引いてくれ、やりたいことが実装できているので良いのですが、Canvas全体に線を引いて欲しいときには

c->cd(0);
line->DrawLineNDC(0,0,1,1);

とすれば良いと思うじゃないですか。すると、分割されたそれぞれのPadの裏に線が引かれるみたいで、線がもろ隠れるんですよ。。。 でも、そういう気持ちは分からないでもありません。Divideすると4つのTVisualPadがレイヤーの上に乗ってくるのでしょう。そうしないと一生DivideしてDrawしたもの、見えなくなりますもんね。

いまのところ、複数のVirtualPadに対して複数回Drawすることで実装しております。

c->cd(1);
line->DrawLineNDC(0,0,1,1);
c->cd(2);
line->DrawLineNDC(0,0,1,1);
Shoichiro Masuoka

CNS, the Univ. of Tokyo. Dcotoral student