Geometry 围绕栅格中的点缩放:重新绘制栅格并移动;“起源”;使光标下的点保持固定

Geometry 围绕栅格中的点缩放:重新绘制栅格并移动;“起源”;使光标下的点保持固定,geometry,Geometry,我自己也无法解决这个问题,甚至阅读相关问题的答案(我已经在stackoverflow中搜索过了,但我无法理解提议的解决方案,也无法使它们适应我的情况) 这是绘制网格的代码: // global variables int cameraOffsetX = SCREEN_WIDTH / 2; //x coordinate of the "origin" int cameraOffsetY = SCREEN_HEIGHT / 2; int cameraZoomSprit

我自己也无法解决这个问题,甚至阅读相关问题的答案(我已经在stackoverflow中搜索过了,但我无法理解提议的解决方案,也无法使它们适应我的情况)

这是绘制网格的代码:

    // global variables
    int cameraOffsetX = SCREEN_WIDTH / 2; //x coordinate of the "origin"
    int cameraOffsetY = SCREEN_HEIGHT / 2;
    int cameraZoomSpriteSize = 32; //size of a square in the current zoom
    float zoomFactor = 1;

    --------------------

    //grid
    SDL_SetRenderDrawColor(renderer, 0xe6, 0xe6, 0xe6, SDL_ALPHA_OPAQUE);
    for (int i = cameraOffsetX - cameraOffsetX / cameraZoomSpriteSize * cameraZoomSpriteSize;
         i < window_width; i += cameraZoomSpriteSize)
        SDL_RenderDrawLine(renderer, i, 0, i, window_height);
    for (int i = cameraOffsetY - cameraOffsetY / cameraZoomSpriteSize * cameraZoomSpriteSize;
         i < window_height; i += cameraZoomSpriteSize)
        SDL_RenderDrawLine(renderer, 0, i, window_width, i);

    //origin
    SDL_SetRenderDrawColor(renderer, 0xff, 0, 0, SDL_ALPHA_OPAQUE);
    SDL_RenderDrawLine(renderer, cameraOffsetX, cameraOffsetY - cameraZoomSpriteSize, cameraOffsetX,
                       cameraOffsetY + cameraZoomSpriteSize);
    SDL_RenderDrawLine(renderer, cameraOffsetX - cameraZoomSpriteSize, cameraOffsetY,
                       cameraOffsetX + cameraZoomSpriteSize, cameraOffsetY);
//全局变量
int cameraOffsetX=屏幕宽度/2//“原点”的x坐标
int CAMERAOFSETY=屏幕高度/2;
int cameraZoomSpriteSize=32//当前缩放中正方形的大小
float zoomFactor=1;
--------------------
//网格
SDL_SetRenderDrawColor(渲染器,0xe6,0xe6,0xe6,SDL_ALPHA_不透明);
对于(int i=cameraOffsetX-cameraOffsetX/cameraZoomSpriteSize*cameraZoomSpriteSize;
i
这是试图获得想要的行为的代码,目前还不太正确:

    case SDL_MOUSEWHEEL:
    int mx, my;
    SDL_GetMouseState(&mx, &my);
    if (event.wheel.y > 0) // scroll up
    {
        if (cameraZoomSpriteSize < 64) {

            cameraOffsetX-=(mx-cameraOffsetX)*4/cameraZoomSpriteSize+(mx-cameraOffsetX)%cameraZoomSpriteSize*4/cameraZoomSpriteSize;
            cameraOffsetY-=(my-cameraOffsetY)*4/cameraZoomSpriteSize+(my-cameraOffsetY)%cameraZoomSpriteSize*4/cameraZoomSpriteSize;

            cameraZoomSpriteSize += 4;
            zoomFactor += 0.125;
        }
    } else if (event.wheel.y < 0) // scroll down
    {
        if (cameraZoomSpriteSize > 4) {

            cameraOffsetX+=(mx-cameraOffsetX)*4/cameraZoomSpriteSize+(mx-cameraOffsetX)%cameraZoomSpriteSize*4/cameraZoomSpriteSize;
            cameraOffsetY+=(my-cameraOffsetY)*4/cameraZoomSpriteSize+(my-cameraOffsetY)%cameraZoomSpriteSize*4/cameraZoomSpriteSize;

            cameraZoomSpriteSize -= 4;
            zoomFactor -= 0.125;

        }
    }
    break;
case SDL\u鼠标滚轮:
intmx,我的;
SDL_GetMouseState(&mx,&my);
如果(event.wheel.y>0)//向上滚动
{
如果(cameraZoomSpriteSize<64){
cameraOffsetX-=(mx cameraOffsetX)*4/CamerazoomPriteSize+(mx cameraOffsetX)%CamerazoomPriteSize*4/CamerazoomPriteSize;
cameraOffsetY-=(我的cameraOffsetY)*4/cameraZoomSpriteSize+(我的cameraOffsetY)%cameraZoomSpriteSize*4/cameraZoomSpriteSize;
cameraZoomSpriteSize+=4;
zoomFactor+=0.125;
}
}else if(event.wheel.y<0)//向下滚动
{
如果(cameraZoomSpriteSize>4){
cameraOffsetX+=(mx cameraOffsetX)*4/CamerazoomPriteSize+(mx cameraOffsetX)%CamerazoomPriteSize*4/CamerazoomPriteSize;
cameraOffsetY+=(我的cameraOffsetY)*4/cameraZoomSpriteSize+(我的cameraOffsetY)%cameraZoomSpriteSize*4/cameraZoomSpriteSize;
cameraZoomSpriteSize-=4;
动物因子-=0.125;
}
}
打破
cameraOffsetX和cameraOffsetY的正确公式是什么。不幸的是,我无法将数学形象化。

一般原则:

 cameraOffsetX = mx + (cameraOffsetX - mx) * newZoomCoefficient / oldZoomCoefficient
我读到的解决方案是正确的;只是我不能马上翻译
zoompointX
scalechange

我在一张纸上画了几段,并尝试缩放它们,以得出与那篇文章相同的精确公式

case SDL_MOUSEWHEEL:
int mx, my;
SDL_GetMouseState(&mx, &my);
if (event.wheel.y > 0) // scroll up
{
    if (cameraZoomSpriteSize < 64) {

        cameraOffsetX-=(mx-cameraOffsetX)*4/cameraZoomSpriteSize;
        cameraOffsetY-=(my-cameraOffsetY)*4/cameraZoomSpriteSize;

        cameraZoomSpriteSize += 4;
        zoomFactor += 0.125;
    }
} else if (event.wheel.y < 0) // scroll down
{
    if (cameraZoomSpriteSize > 4) {

        cameraOffsetX+=(mx-cameraOffsetX)*4/cameraZoomSpriteSize;
        cameraOffsetY+=(my-cameraOffsetY)*4/cameraZoomSpriteSize;

        cameraZoomSpriteSize -= 4;
        zoomFactor -= 0.125;

    }
}
break;
case SDL\u鼠标滚轮:
intmx,我的;
SDL_GetMouseState(&mx,&my);
如果(event.wheel.y>0)//向上滚动
{
如果(cameraZoomSpriteSize<64){
cameraOffsetX-=(mx cameraOffsetX)*4/cameraZoomSpriteSize;
cameraOffsetY-=(我的cameraOffsetY)*4/cameraZoomSpriteSize;
cameraZoomSpriteSize+=4;
zoomFactor+=0.125;
}
}else if(event.wheel.y<0)//向下滚动
{
如果(cameraZoomSpriteSize>4){
cameraOffsetX+=(mx cameraOffsetX)*4/cameraZoomSpriteSize;
cameraOffsetY+=(我的cameraOffsetY)*4/cameraZoomSpriteSize;
cameraZoomSpriteSize-=4;
动物因子-=0.125;
}
}
打破
这个问题昨天和今天早上花了我半个小时才解决:(