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