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);