Как определить масштаб линейного графика на основе пикселей / высоты? - PullRequest
1 голос
/ 03 мая 2010

У меня проблема из-за моих ужасных математических способностей, я не могу понять, как масштабировать график на основе максимальных и минимальных значений, чтобы весь график поместился в область графика (400x420) без ее частей. быть вне экрана (на основании заданного пользователем уравнения).

Допустим, у меня есть этот код, и он автоматически рисует квадраты, а затем линейный график на основе этих значений. Какова формула (которую я умножаю), чтобы масштабировать ее так, чтобы она вписывалась в небольшую графическую область?

vector<int> m_x;
vector<int> m_y; // gets automatically filled by user equation or values

int HeightInPixels = 420;// Graphing area size!!
int WidthInPixels = 400;
int best_max_y = GetMaxOfVector(m_y);
int best_min_y = GetMinOfVector(m_y);
m_row = 0;
m_col = 0;

y_magnitude = (HeightInPixels/(best_max_y+best_min_y)); // probably won't work
x_magnitude = (WidthInPixels/(int)m_x.size());
m_col = m_row = best_max_y; // number of vertical/horizontal lines to draw

////x_magnitude = (WidthInPixels/(int)m_x.size())/2; Doesn't work well
////y_magnitude = (HeightInPixels/(int)m_y.size())/2; Doesn't work well

ready = true; // we have values, graph it
Invalidate(); // uses WM_PAINT

////////////////////////////////////////////
/// Construction of Graph layout on WM_PAINT, before painting line graph
///////////////////////////////////////////
CPen pSilver(PS_SOLID, 1, RGB(150, 150, 150) ); // silver
    CPen pDarkSilver(PS_SOLID, 2, RGB(120, 120, 120) ); // dark silver
    dc.SelectObject( pSilver ); // silver color
    CPoint pt( 620, 620 ); // origin
    int left_side = 310;
    int top_side = 30;
    int bottom_side = 450;
    int right_side = 710; // create a rectangle border
    dc.Rectangle(left_side,top_side,right_side,bottom_side);
    int origin = 310;
    int xshift = 30;
    int yshift = 30;
    // draw scaled rows and columns
    for(int r = 1; r <= colrow; r++){ // draw rows
        pt.x = left_side;
        pt.y = (ymagnitude)*r+top_side;
        dc.MoveTo( pt );
        pt.x = right_side;
        dc.LineTo( pt );
        for(int c = 1; c <= colrow; c++){
            pt.x = left_side+c*(magnitude);
            pt.y = top_side;
            dc.MoveTo(pt);
            pt.y = bottom_side;
            dc.LineTo(pt);
        } // draw columns
    }
    // grab the center of the graph on x and y dimension
    int top_center = ((right_side-left_side)/2)+left_side;
    int bottom_center = ((bottom_side-top_side)/2)+top_side;

Ответы [ 2 ]

0 голосов
/ 05 мая 2010

Вы используете x ^ 2 + b x + c ( квадратное уравнение ).Вы получите список (X, Y) значений, вставленных пользователем.
Допустим, вы получите 5 баллов
(1,1) (2,4) (4,1) (5,6) (6,7)

Итак, ваш best_max_y будет 7, а best_min_y будет1.
Теперь у вас есть общая площадь графика
Dx = right_side - left_side //here, 400 (710 - 310)<br> Dy = bottom_side - top_side //here, 420 (450 - 30)
Итак, вы можете рассчитать x_magnitude и y_magnitude, используя следующее уравнение:

x_magnitude = WidthInPixels / Dx;<br> y_magnitude = HeightInPixels / Dy;

0 голосов
/ 03 мая 2010

Что я сделал, так это определил, сколько точек у меня было в направлениях x и y, а затем разделил это на размеры x и y, затем разделил это на 3, так как я хотел, чтобы каждая минимальная точка составляла три пикселя, чтобы это было видно.

Хитрость заключается в том, что вам нужно агрегировать данные так, чтобы вы показывали несколько точек с одной точкой, так что это может быть среднее их значение, но это зависит от того, что вы отображаете.

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

Для этой части вычтите, не добавляйте: best_max_y+best_min_y как хочешь разницу.

Единственное, что можно было бы разделить y_magnitude и x_magnitude на 3. Это было произвольное число, которое я придумал, просто чтобы пользователи могли видеть точки, вы можете найти другое число, которое будет работать лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...