2016-05-28 5 views
0

私は四角形の集合を描画しようとしていますが、最初は四角形の原点(0,0)が左上隅にあり、右下隅からレンダリングするように四角形を入れました。 座標をフリップするコードはありませんが、winformには何も表示されません。矩形の集合を描画するときのフリップ座標

私はTranslateTransformのHeight属性が間違っていることを知っています。私は二次元の四角形の集合を描こうとしているので、高さが必要な理由は分かりません。

まだ使用していない高さ属性をハードコーディングしようとしました。

public void ScaleTransformFloat(PaintEventArgs e,List<Square> lstSquare) 
    { 
     int Height = 10; 
     // Begin graphics container 
     GraphicsContainer containerState = e.Graphics.BeginContainer(); 

     // Flip the Y-Axis 
     e.Graphics.ScaleTransform(1.0F, -1.0F); 

     // Translate the drawing area accordingly 
     // 
     e.Graphics.TranslateTransform(0.0F, -(float)Height); 

     // Whatever you draw now (using this graphics context) will appear  as 
     // though (0,0) were at the bottom left corner 

    //User-defined function to draw a square  
     DrawSquare(e,lstSquare); 
     // End graphics container 
     e.Graphics.EndContainer(containerState); 


    } 

四角

public void DrawSquare(PaintEventArgs e,List<Square> lstSquare) 
    { 
     foreach(Square s in lstSquare){ 
     e.Graphics.DrawRectangle(Pens.Black, 0,0 ,s.m_Side, s.m_Side); 
     } 
    } 
+0

a)なぜ描画オブジェクトを変換するだけで、複雑になります。 b)DrawSquareは(0,0)ですべてを描画します。これまでに行ったことにかかわらず、すべての四角形がお互いに並んでいます。 – TaW

+0

これは実際には図形の最初の割り当てです。最初はすべての四角形が左上からレンダリングされていて、左下からレンダリングしたかったのです。私は左下から四角形をレンダリングするのに役立つ[リンク](http://stackoverflow.com/questions/1485745/flip-coordinates-when-drawing-to-control))に出くわしました。しかし、何も表示されていません。私は2d sqaureのセットを描いているので高さが必要な理由を知りたかった – dilip

+0

高さは3d高さではありません。これは、描画するターゲットコントロールの高さの合計です。 画像を左上隅に向かって一番上に紙を裏返しにします。今度はそれを下に移動する必要があります。しかし、どんな距離で?回答:用紙サイズ.. – TaW

答えて

2

通常の変換のようなは問題ありません順序を行列演算を行うための設定描画する方法。

最初に翻訳し、次にを変換するか、逆順に翻訳する必要があります。あなたのコードは正しいと思われます。

Heightは3d高さではありません。描画するターゲットコントロールの合計はHeightです。

あなたのコントロール上に紙を置くと想像してください。コントロールはビューポートです。今、紙面を左上端で反転させると想像してください。ビューポートを離れました。今度はそれを下に移動する必要があります。しかし、どんな距離で?答え:紙の高さ..

あなたのコードはHeight = 10ピクセルです。これは確かにあなたのコントロールのサイズではありませんよね?コピーしたコードから来るかもしれません。それはおそらくForm's Heightを意味していました。フォーム上に描画したい場合(通常は良い考えではありません)、単にint Height = 10;行を削除してください!

簡単な例をやってみましょう:私たちはPanel上にいくつかの長方形を描く:

enter image description here

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    if (checkBox1.Checked) 
    { 
     e.Graphics.ScaleTransform(1, -1); 
     e.Graphics.TranslateTransform(0, -panel1.Height); 
    } 
    e.Graphics.DrawRectangle(Pens.Violet, 1, 1, 33, 33); 
    e.Graphics.DrawRectangle(Pens.OrangeRed, 11, 11, 133, 55); 
    e.Graphics.DrawRectangle(Pens.Magenta, 44, 11, 233, 77); 
    e.Graphics.DrawRectangle(Pens.Olive, 55, 44, 33, 99); 
} 

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
{ 
    panel1.Invalidate(); 
} 

を結果が反転しているCheckBoxを確認した後:また

enter image description here

DrawSquareはすべての四角形を同じ場所(0,0)。それがあなたの望むものであるかどうかは分かりません。

最後の注:DrawRectangleはボトルトンと右側を1ピクセルオーバードローするという厄介な癖があります。最初のloactionを(1,1)から(0,0)に変更した後、(then)の底面が切り取られます。グラフィックスの座標を1ピクセル小さく変換することを検討するかもしれません。

+0

私はそれがどのように動作するのか理解してくれてありがとう。 – dilip

+0

x軸(パネルの下側と上側の両方)の辺を持つ四角形はレンダリングされない、つまり矩形X軸上に辺の1つが描かれています....そして、辺がx軸上にないときにレンダリングされる四角形の四辺すべてが描画されます。どのように私はこれを解決するのですか? – dilip

+0

それを避けてください。それらを1ピクセル小さくするか、エッジから1ピクセル離れたところに描画します。高さを使う+ - 1はこれを達成するための安価で透明な方法です。 – TaW

関連する問題