缩放网格中的点:重绘网格并移动"origin",以使光标下方的点保持固定

  • 本文关键字:网格 光标 移动 origin 缩放 geometry
  • 更新时间 :
  • 英文 :


我自己无法解决问题,甚至无法阅读相关问题的答案(我已经在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);

这是尝试获取尚未完全正确的所需行为的代码:

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;

cameraOffsetX 和 cameraOffsetY 的正确公式是什么?不幸的是,我无法想象数学。

一般原则:

cameraOffsetX = mx + (cameraOffsetX - mx) * newZoomCoefficient / oldZoomCoefficient

我在这里读到的解决方案是正确的; 只是我不能立即翻译zoompointXscalechange.

我在一张纸上画了一些片段,并试图缩放它们以找出与该帖子相同的确切公式。

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;

这个问题花了我昨天和今天早上的一半时间来解决:(

最新更新