2016-05-28 6 views
0

Я пытаюсь нарисовать множество квадратов, но изначальные квадраты (0,0) изначально были в верхнем левом углу, и мне нужны квадраты для рендеринга из нижнего правого угла, , и я нашел это код для перевода координат, но ничего не оказывает на winform.Отразить координаты при рисовании набора прямоугольников

Я знаю, что я ошибся в атрибуте Height TranslateTransform. Я не понимаю, почему требуется высота, поскольку я пытаюсь нарисовать набор из 2d квадратов.

Я пробовал hardcoding атрибут высоты, который все еще не используется.

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) Не знаете, почему так сложно (и, возможно, так же неправильно) сделать вещи с преобразованием объекта Graphics, когда вы могли бы просто адаптировать код чертежа. б) DrawSquare рисует все на (0,0), независимо от того, что вы делали раньше, все квадраты сидят друг на друга. c) 10 пикселей для общей высоты, действительно? – TaW

+0

На самом деле это мое первое задание в рисовании фигур. Первоначально все квадраты были визуализированы в левом верхнем углу, и я хотел, чтобы они отображались слева внизу.Я наткнулся на [link] (http://stackoverflow.com/questions/1485745/flip-coordinates-when-drawing-to-control)), который поможет мне отображать квадраты слева внизу. Но ничего не появляется. Я хотел знать, почему требуется высота, поскольку я рисую набор из 2d sqaure. – dilip

+0

Высота не является высотой 3d. Это общая высота целевого элемента управления, на который вы хотите нарисовать. Изображение, переворачивающее лист бумаги сверху в верхнем левом углу. Теперь вам нужно переместить его. Но на каком расстоянии? Ответ: Размер бумаги .. – TaW

ответ

2

При выполнении операции матрицы, как преобразования обычно порядка имеет значение.

В вашем случае вам нужно либо перевести сначала, затем масштаб/флип или изменить направление перевода. Кажется, что ваш код правильно.

Height не является 3-й высотой. Это сумма 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,1) до (0,0) нижняя сторона (тогда) будет обрезана. Вы можете подумать о переводе графических процессоров на 1 пиксель меньше.

+0

Благодарим вас за то, что вы поняли, как это работает. – dilip

+0

Как вы сказали, прямоугольники со сторонами по оси x (как нижняя, так и верхняя сторона панели) не отображаются, т. Е. Только 3 стороны прямоугольника вытягиваются там, где одна из сторон находится по оси x .... и все четыре стороны прямоугольника получают, когда ни одна сторона не находится на оси x. как я могу это решить? – dilip

+0

Никоим образом не вокруг. Либо сделайте их на 1 пиксель меньше, либо нарисуйте их на один пиксель дальше по краям. Использование высоты + - 1 - это дешевый и прозрачный способ достижения этого. – TaW

Смежные вопросы