преобразовать декартову координату в координаты Picturebox c # - PullRequest
3 голосов
/ 20 марта 2011

Вопрос, который у меня есть, больше математики!У меня есть пара значений, которые представляют точки кривой, которые я хочу нарисовать на картинке, используя fromImage (Bitmap).Моя картинная коробка имеет размеры 500х500.Я также знаю, что верхний левый угол имеет точку (0,0), а нижний правый угол имеет точки (500,500).Очевидно, происхождение должно быть (250 250).Теперь мне интересно, как я могу преобразовать свои собственные значения в этот формат?

Точки выборки, которые у меня есть, выглядят так:

Voltage: -0.175         Current: -9.930625E-06
Voltage: -0.171875      Current: -9.53375E-06
Voltage: -0.16875       Current: -9.136875E-06
Voltage: -0.16875       Current: -8.74E-06
Voltage: -0.165625      Current: -8.343125E-06
Voltage: -0.1625        Current: -7.94625E-06
Voltage: -0.1625        Current: -7.549375E-06
Voltage: -0.159375      Current: -7.152188E-06
Voltage: -0.15625       Current: -6.755312E-06

Вы видите, что есть значения Напряжения, которые должны быть на оси X, и Ток на оси Y.Я знаю, что чтобы сделать их немного лучше, я должен умножить их на большее число, а также, возможно, умножить на обратное или что-то в этом роде.но я все еще не могу понять, как изобразить их на моей картинке.Эти точки обычно начинаются с третьего квадранта и заканчиваются в первом квадранте.Пожалуйста, помогите!

Просто добавьте, что мои минимальная и максимальная ось X составляют -2 В и + 2 В, а для оси Y у меня будет от -10 мкА до + 10 мкА (то есть 10 * 10 ^ -6)

РЕДАКТИРОВАТЬ

То, что я пытаюсь сделать, это создать такую ​​кривую, поэтому те точки, которые у меня есть, используются в Graphics.DrawCurve:

enter image description here

ОБНОВЛЕНИЕ Вот так выглядит мой код:

            g.DrawLine(penAxis, 250, 0, 250, 500); // Y AXIS 
        g.DrawLine(penAxis, 0, 250, 500, 250); // X AXIS          

        PointF[] p = new PointF[pinData.GetLength(0)];   //pinData is AboutBoxForm double[,] array

        for (int i = 0; i < pinData.GetLength(0); i++)
        {
            p[i] = new PointF(250 * ((1 + (float)pinData[i, 0]) / 2), 250 * ((1 + (float)pinData[i, 1] )/ 10));  
        }

        Pen pengraph = new Pen(pinColor, 2.0F);
        g.DrawCurve(pengraph, p);

ОБНОВЛЕНИЕ ПРОГРЕССА

Хорошо, теперь используйте код нижемоя кривая выглядит так:

            g.DrawLine(penAxis, 250, 0, 250, 500); // Y AXIS 
        g.DrawLine(penAxis, 0, 250, 500, 250); // X AXIS          

        PointF[] p = new PointF[pinData.GetLength(0)];   //pinData is AboutBoxForm double[,] array

        for (int i = 0; i < pinData.GetLength(0); i++)
        {
            p[i] = new PointF(250 * (1 - ((float)pinData[i, 1] *100000) / 10), 250 * (1 + (((float)pinData[i, 0]))/ 2));  
        }

        Pen pengraph = new Pen(pinColor, 2.0F);
        g.DrawCurve(pengraph, p);

enter image description here

Я думаю, что теперь проблема заключается в ее масштабировании. решено Мне пришлось умножить на 10 ^ 6, но я сделал с ^ 5 нет, это нормально !!!Спасибо всем.

Ответы [ 2 ]

1 голос
/ 20 марта 2011

Чтобы использовать весь диапазон графического блока с отображением (V,C) = (0, 0) в центр, вы можете использовать преобразования:

X = 250 * (1 + Voltage/2)
Y = 250 * (1 - Current/10)

Обратите внимание, что это приведет к увеличению тока вверх по оси Y.Если вы хотите обратное, используйте (1 + Current/10) во втором преобразовании.

1 голос
/ 20 марта 2011

Если вы хотите, чтобы масштабирование соответствовало экрану, умножьте каждое значение напряжения и тока на 50 .

Все ваши очки лежат в third quadrant; Вы можете выбрать источник (0, 0) на своем экране и сделать все свои negative x-axis баллов положительными, т.е. пролистать y-axis.

Если вы не хотите масштабировать, сохраняйте коэффициент умножения единицей.

...