изменение системы координат
От: Repdiablo  
Дата: 28.07.04 08:37
Оценка:
Подскажите как сделать так чтобы у(ордината) в системе координат "смотрела" на верх
Re: изменение системы координат
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.07.04 09:11
Оценка:
Здравствуйте, Repdiablo, Вы писали:

R>Подскажите как сделать так чтобы у(ордината) в системе координат "смотрела" на верх


Может Graphics.Transform подойдет?
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: изменение системы координат
От: vitz  
Дата: 28.07.04 09:25
Оценка:
Здравствуйте, 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'а есть масса разнообразных конструкторов.
Re[3]: изменение системы координат
От: vitz  
Дата: 28.07.04 10:38
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А еще лучше сразу создать Matrix с инвертирующим преобразованием и присвоить его свойству Transform в одном вызове:

Согласен, целиком и полностью .
Держать Matrix как поле класса, всегда под рукой видовое преобразование.
И не забыть сделать Disposel в конце.
... << RSDN@Home 1.1.3 stable >>
Re[2]: изменение системы координат
От: Repdiablo  
Дата: 29.07.04 16:27
Оценка:
Здравствуйте, 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>


Все прикольно, все получилось, но у меня теперь текст который я вывожу как:

e.Graphics.DrawString("Sample", drawFont, drawBrush, x, y);

выводится кверх ногами и буквы инвертированы. Как с этим бороться?
Re[3]: изменение системы координат
От: Repdiablo  
Дата: 30.07.04 07:21
Оценка:
Здравствуйте, 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>e.Graphics.DrawString("Sample", drawFont, drawBrush, x, y);
R>


Ребята подскажите ответ, нигде не могу найти.
R>выводится кверх ногами и буквы инвертированы. Как с этим бороться?
Re[3]: изменение системы координат
От: orangy Россия
Дата: 30.07.04 07:38
Оценка:
Здравствуйте, Repdiablo, Вы писали:

R>Все прикольно, все получилось, но у меня теперь текст который я вывожу как:


R>
R>e.Graphics.DrawString("Sample", drawFont, drawBrush, x, y);
R>

R>выводится кверх ногами и буквы инвертированы. Как с этим бороться?
А что ты хотел? Изучай геометрию

Представь себе, что ты нарисовал на листочке всё что надо, а потом его перевернул (отразить относительно горизонтальной оси сложно будет) — как у тебя буквы будут выглядеть? Если же тебе кое-что отражать, а кое-что нет, то придётся работать руками и головой. Магии нет
... << RSDN@Home 1.1.4 beta 2 >>
"Develop with pleasure!"
Re[4]: изменение системы координат
От: SATo Россия  
Дата: 30.07.04 09:06
Оценка:
R>>Все прикольно, все получилось, но у меня теперь текст который я вывожу как:

R>>
R>>e.Graphics.DrawString("Sample", drawFont, drawBrush, x, y);
R>>

R>>выводится кверх ногами и буквы инвертированы. Как с этим бороться?
O>А что ты хотел? Изучай геометрию

O>Представь себе, что ты нарисовал на листочке всё что надо, а потом его перевернул (отразить относительно горизонтальной оси сложно будет) — как у тебя буквы будут выглядеть? Если же тебе кое-что отражать, а кое-что нет, то придётся работать руками и головой. Магии нет


Действительно, тут ничего не поделаешь: так уж заведено, что верхний край строки текста соответствует меньшему значению Y-координаты, а нижний — большему. Единственно, если нужно и рисовать и писать текст одновременно, причем при рисовании ость Y должна быть направлена снизу вверх, а текст выводиться в тех же координатах, что и рисунок, то можно немного задачу упростить. Для этого:
0. На этом шаге рисунок уже нарисован, Graphics находится в системе координат рисунка.
1. Cконструировать Matrix с обратным преобразованием из координат рисунка в координаты клиентской области (делается одним вызовом конструктора Matrix).
2. Координаты строки текста в системе рисунка передать методу Matrix.TransformPoints().
3. Переключться в систему координат клиентской области вызовом Graphics.ResetTransform().
4. Рисовать текст, используя координаты, полученные на шаге 2.

По крайней мере, это снимает необходимость пересчитывать координаты вручную.
Re[4]: изменение системы координат
От: vitz  
Дата: 30.07.04 09:26
Оценка:
Здравствуйте, Repdiablo, Вы писали:

Почитай о матричных преобразованиях, в любой книге по компграфике.
... << RSDN@Home 1.1.3 stable >>
Re[5]: изменение системы координат
От: Repdiablo  
Дата: 02.08.04 11:08
Оценка:
Делаю так:

Matrix m = new Matrix();
m.Translate(0,this.Size.Height);
m.Scale(1,-1);
e.Graphics.Transform = m;

рисую график


В другой функции делаю так:
Point[] strPointArray;
strPointArray = new Point[6];
for (int j = 0 ; j <=5; j++) 
{
 strPointArray[j].X = j;
 strPointArray[j].Y = -10;
}
Matrix m = new Matrix();
m.TransformPoints(strPointArray);
e.Graphics.ResetTransform().

e.Graphics.DrawString("1", drawFont, drawBrush, strPointArray[0].X, strPointArray[0].Y);


1 — не вижу на экране

Что делаю не так?
Re[6]: изменение системы координат
От: SATo Россия  
Дата: 02.08.04 12:58
Оценка:
Здравствуйте, Repdiablo, Вы писали:

R>Делаю так:


R>Matrix m = new Matrix();
R>m.Translate(0,this.Size.Height);
R>m.Scale(1,-1);
R>e.Graphics.Transform = m;

R>рисую график

Более правильно:
m.Translate(0,this.ClientRectangle.Height);

(но к данному вопросу отношения не имеет)

R>В другой функции делаю так:

R>Point[] strPointArray;
R>strPointArray = new Point[6];
R>for (int j = 0 ; j <=5; j++) 
R>{
R> strPointArray[j].X = j;
R> strPointArray[j].Y = -10; // <-- (1) Измени знак!!!
R>}
R>Matrix m = new Matrix(); // <-- (2) без параметров!!!
R>m.TransformPoints(strPointArray);
R>e.Graphics.ResetTransform().
R>e.Graphics.DrawString("1", drawFont, drawBrush, strPointArray[0].X, strPointArray[0].Y);

R>1 — не вижу на экране
R>Что делаю не так?

1. Я так понял, надо рисовать в сисеме координат, где Y=0 соответствует нижней границе окна и растет вверх?
Тогда любая отрицательная координата будет вне экрана.

2. Создается единичная матрица, не выполняющая реально никакого преобразования.
Нужно использовать конструктор с параметрами, например

Matrix m = new Matrix(1, 0, 0, -1, 0, ClientRectangle.Height);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.