fworldperscreenwidththpixel如何用于循环绘制

How does fWorldPerScreenWidthPixel work for drawing in loop

本文关键字:循环 绘制 用于 何用于 fworldperscreenwidththpixel      更新时间:2023-10-16

此代码用功能绘制正弦波。在以下平移/缩放代码中,我试图了解如何使用fworldperscreenwidththpixel绘制行段。

WorldToScreen(fWorldLeft - fWorldPerScreenWidthPixel, -function((fWorldLeft - fWorldPerScreenWidthPixel) - 5.0f) + 5.0f, opx, opy);

它设置了OPX和OPY,但是为什么从:fworldleft

中减去

想要在绘制线路的for循环中开始fworldleft的左开始。fworldleft开始于-25。

我包含了必要的代码来解释:

// Draw Chart
    float fWorldPerScreenWidthPixel = (fWorldRight - fWorldLeft) / ScreenWidth();
    float fWorldPerScreenHeightPixel = (fWorldBottom - fWorldTop) / ScreenHeight();
    int px, py, opx = 0, opy = 0;
    WorldToScreen(fWorldLeft - fWorldPerScreenWidthPixel, -function((fWorldLeft - fWorldPerScreenWidthPixel) - 5.0f) + 5.0f, opx, opy);
    for (float x = fWorldLeft; x < fWorldRight; x += fWorldPerScreenWidthPixel)
    {
        float y = -function(x - 5.0f) + 5.0f;
        WorldToScreen(x, y, px, py);
        DrawLine(opx, opy, px, py, PIXEL_SOLID, FG_GREEN);
        opx = px;
        opy = py;
    }

致电设置fworldleft:

// Clip
    float fWorldLeft, fWorldTop, fWorldRight, fWorldBottom;
    ScreenToWorld(0, 0, fWorldLeft, fWorldTop);

设置fworldleft:

// Convert coordinates from Screen Space --> World Space
void ScreenToWorld(int nScreenX, int nScreenY, float &fWorldX, float &fWorldY)
{
    fWorldX = ((float)nScreenX / fScaleX) + fOffsetX;
    fWorldY = ((float)nScreenY / fScaleY) + fOffsetY;
}

当我在此时,要屏幕世界:

// Convert coordinates from World Space --> Screen Space
void WorldToScreen(float fWorldX, float fWorldY, int &nScreenX, int &nScreenY)
{
    nScreenX = (int)((fWorldX - fOffsetX) * fScaleX);
    nScreenY = (int)((fWorldY - fOffsetY) * fScaleY);
}

谢谢!

josh

让我们将其分解

WorldToScreen(
    fWorldLeft - fWorldPerScreenWidthPixel, 
    -function((fWorldLeft - fWorldPerScreenWidthPixel) - 5.0f) + 5.0f, 
    opx, opy);

更清晰的写作方式

x = fWorldLeft - fWorldPerScreenWidthPixel;
WorldToScreen(
    x, 
    -function((x) - 5.0f) + 5.0f, 
    opx, opy);

这将(x, f(x))的位置从世界空间转换为屏幕空间,并将结果存储在(opx, opy)中。让我们看看如何使用这两个变量:

for(...)
{
   ...
   DrawLine(opx, opy, px, py, PIXEL_SOLID, FG_GREEN);
   ...
}

这绘制了从 (opx, opy)(px, py)的行(这是函数上的当前点。(opx, opy)是函数的旧点。这正是您从上方的初始化所做的。您将(opx, opy)设置为一个点那是屏幕外面的一个像素,以确保边框没有差距。