Здравствуйте, Repdiablo, Вы писали:
R>Подскажите как сделать так чтобы у(ордината) в системе координат "смотрела" на верх
Если для системы координат окна, то в OnPaint делаешь примерно вот так:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint (e);
Matrix m = new Matrix();
m.Translate(0,this.Size.Height);
m.Scale(1,-1);
e.Graphics.Transform = m;
// Рисуй на здоровье.
}
... << RSDN@Home 1.1.3 stable >>
Re[2]: изменение системы координат
От:
Аноним
Дата:
28.07.04 10:02
Оценка:
Здравствуйте, vitz, Вы писали:
V>Здравствуйте, Repdiablo, Вы писали:
R>>Подскажите как сделать так чтобы у(ордината) в системе координат "смотрела" на верх V>Если для системы координат окна, то в OnPaint делаешь примерно вот так: V>
V>protected override void OnPaint(PaintEventArgs e)
V> {
V> base.OnPaint (e);
V> Matrix m = new Matrix();
V> m.Translate(0,this.Size.Height);
V> m.Scale(1,-1);
V> e.Graphics.Transform = m;
V> // Рисуй на здоровье.
V> }
V>
Согласен, хотя по-моему в данном случае проще вызывать непосредственно Graphics.TranslateTransform() и Graphics.ScaleTransform() без предварительного создания временного Matrix'а и последующего его присваивания свойству Graphics.Transform.
А еще лучше сразу создать Matrix с инвертирующим преобразованием и присвоить его свойству Transform в одном вызове:
base.OnPaint (e);
e.Graphics.Transform = new Matrix(/* ... */);
// Рисуй (не менее) на здоровье.
Благо для этого у Matrix'а есть масса разнообразных конструкторов.
Здравствуйте, <Аноним>, Вы писали:
А>А еще лучше сразу создать Matrix с инвертирующим преобразованием и присвоить его свойству Transform в одном вызове:
Согласен, целиком и полностью .
Держать Matrix как поле класса, всегда под рукой видовое преобразование.
И не забыть сделать Disposel в конце.
Здравствуйте, vitz, Вы писали:
V>Здравствуйте, Repdiablo, Вы писали:
R>>Подскажите как сделать так чтобы у(ордината) в системе координат "смотрела" на верх V>Если для системы координат окна, то в OnPaint делаешь примерно вот так: V>
V>protected override void OnPaint(PaintEventArgs e)
V> {
V> base.OnPaint (e);
V> Matrix m = new Matrix();
V> m.Translate(0,this.Size.Height);
V> m.Scale(1,-1);
V> e.Graphics.Transform = m;
V> // Рисуй на здоровье.
V> }
V>
Все прикольно, все получилось, но у меня теперь текст который я вывожу как:
Здравствуйте, Repdiablo, Вы писали:
R>Здравствуйте, vitz, Вы писали:
V>>Здравствуйте, Repdiablo, Вы писали:
R>>>Подскажите как сделать так чтобы у(ордината) в системе координат "смотрела" на верх V>>Если для системы координат окна, то в OnPaint делаешь примерно вот так: V>>
V>>protected override void OnPaint(PaintEventArgs e)
V>> {
V>> base.OnPaint (e);
V>> Matrix m = new Matrix();
V>> m.Translate(0,this.Size.Height);
V>> m.Scale(1,-1);
V>> e.Graphics.Transform = m;
V>> // Рисуй на здоровье.
V>> }
V>>
R>Все прикольно, все получилось, но у меня теперь текст который я вывожу как:
R>
R>выводится кверх ногами и буквы инвертированы. Как с этим бороться?
А что ты хотел? Изучай геометрию
Представь себе, что ты нарисовал на листочке всё что надо, а потом его перевернул (отразить относительно горизонтальной оси сложно будет) — как у тебя буквы будут выглядеть? Если же тебе кое-что отражать, а кое-что нет, то придётся работать руками и головой. Магии нет
R>>выводится кверх ногами и буквы инвертированы. Как с этим бороться? O>А что ты хотел? Изучай геометрию
O>Представь себе, что ты нарисовал на листочке всё что надо, а потом его перевернул (отразить относительно горизонтальной оси сложно будет) — как у тебя буквы будут выглядеть? Если же тебе кое-что отражать, а кое-что нет, то придётся работать руками и головой. Магии нет
Действительно, тут ничего не поделаешь: так уж заведено, что верхний край строки текста соответствует меньшему значению Y-координаты, а нижний — большему. Единственно, если нужно и рисовать и писать текст одновременно, причем при рисовании ость Y должна быть направлена снизу вверх, а текст выводиться в тех же координатах, что и рисунок, то можно немного задачу упростить. Для этого:
0. На этом шаге рисунок уже нарисован, Graphics находится в системе координат рисунка.
1. Cконструировать Matrix с обратным преобразованием из координат рисунка в координаты клиентской области (делается одним вызовом конструктора Matrix).
2. Координаты строки текста в системе рисунка передать методу Matrix.TransformPoints().
3. Переключться в систему координат клиентской области вызовом Graphics.ResetTransform().
4. Рисовать текст, используя координаты, полученные на шаге 2.
По крайней мере, это снимает необходимость пересчитывать координаты вручную.
1. Я так понял, надо рисовать в сисеме координат, где Y=0 соответствует нижней границе окна и растет вверх?
Тогда любая отрицательная координата будет вне экрана.
2. Создается единичная матрица, не выполняющая реально никакого преобразования.
Нужно использовать конструктор с параметрами, например
Matrix m = new Matrix(1, 0, 0, -1, 0, ClientRectangle.Height);