C++ 如何根据像素/高度确定线图的比例?

C++ 如何根据像素/高度确定线图的比例?,c++,math,graph,C++,Math,Graph,由于我糟糕的数学能力,我有一个问题,那就是我不知道如何根据最大值和最小值缩放图形,这样整个图形将适合图形区域400x420,而不会根据用户给定的等式将部分图形从屏幕上移除 假设我有这个代码,它会自动绘制正方形,然后根据这些值绘制线图。公式是什么?我应该乘以什么来缩放它,使它适合小的绘图区域 vector<int> m_x; vector<int> m_y; // gets automatically filled by user equation or values i

由于我糟糕的数学能力,我有一个问题,那就是我不知道如何根据最大值和最小值缩放图形,这样整个图形将适合图形区域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;

我所做的是确定在x和y方向上有多少个点,然后除以x和y维度,再除以3,因为我希望每个最小点是三个像素,这样就可以看到

这样做的诀窍是,您必须聚合数据,以便用一个点显示多个点,因此它可能是这些点的平均值,但这取决于您显示的内容

如果不知道你在做什么,就很难提出建议

对于这部分,减法,不加: 最佳最大值+最佳最小值,如你所愿

唯一的另一件事是将y_震级和x_震级除以3。这是我提出的一个任意数字,只是为了让用户能够看到这些点,您可以找到其他更好的数字。

您使用的是ax^2+bx+c。您将获得用户插入的X、Y值列表。 假设你得到5分 1,1 2,4 4,1 5,6 6,7

所以,这里你最好的最大值是7,最好的最小值是1。 现在你们有了总的图形面积 Dx=右侧-左侧//此处,400 710-310 Dy=底侧-顶侧//这里是420 450-30 因此,您可以使用以下公式计算x_震级和y_震级:

x_幅值=宽度像素/Dx; y_震级=高度像素/Dy;

我正在做一个简单的ax^2+bx+c方程图。用户只能更改a、b、c。我将x设置为-10到10之间的20个数据点。我还允许用户输入手动数据点。对我来说,y_幅值决定行与行之间的像素数。forint r=1;r您可能想添加此信息作为问题的更新,这可能非常有用。我正在准备工作,如果今天没有更好的答案,我会考虑今晚的答案。