C++ C++;旋转线变短了

C++ C++;旋转线变短了,c++,rotation,trigonometry,sdl-2,C++,Rotation,Trigonometry,Sdl 2,我目前正在sdl中尝试一些简单的直线旋转,我发现了一个函数,可以围绕另一个点旋转一个点。这里是(更改为使用sdl) 现在我遇到了一个问题,那就是直线越来越短,直到它停在中心点,我旋转它。我不知道为什么 以下是im使用该功能的方式: double angle1=0.1, angle2=0,oldangle1=0,oldangle2=0; SDL_Point line11 = { 10,0 }, line12 = { 110,0 }, line21 = { 110,0 }, line22 =

我目前正在sdl中尝试一些简单的直线旋转,我发现了一个函数,可以围绕另一个点旋转一个点。这里是(更改为使用sdl)

现在我遇到了一个问题,那就是直线越来越短,直到它停在中心点,我旋转它。我不知道为什么

以下是im使用该功能的方式:

double angle1=0.1, angle2=0,oldangle1=0,oldangle2=0;
    SDL_Point line11 = { 10,0 }, line12 = { 110,0 }, line21 = { 110,0 }, line22 = { 210,0 };
    SDL_Event event;
    int mousex = 0, mousey = 0;
    while (SDL_PollEvent(NULL)) {
        SDL_GetMouseState(&mousex, &mousey);
        if (GetAsyncKeyState('W'))
            angle1 += 0.1;
        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
        SDL_RenderClear(renderer);
        if (angle1 < oldangle1-0.1||angle1 > oldangle1 + 0.1) {
            line12 = rotate_point(0, 0, (angle1-oldangle1), line12);
            line21 = rotate_point(0, 0, (angle1 - oldangle1), line21);
            oldangle1 = angle1;
        }
        if (angle2 < oldangle2 - 0.1 || angle2 > oldangle2 + 0.1) {
            line22 = rotate_point(line21.x,line21.y, (angle2 - oldangle2), line22);
            oldangle2 = angle2;
        }
        if (angle2 == 0)
            angle2 = angle1;
        printf("%f ", angle2);
        SDL_SetRenderDrawColor(renderer, 0, 255, 0, 0);
        SDL_RenderDrawLine(renderer, line11.x, line11.y, line12.x, line12.y);
        SDL_RenderDrawLine(renderer, line21.x, line21.y, line22.x, line22.y);
        //solveIK(&angle1, &angle2, false, 100, 100, mousex, mousey);
        //angle1 = get_degrees(angle1);
        //angle2 = get_degrees(angle2);
        SDL_RenderPresent(renderer);
        SDL_Delay(16);

    }
double angle1=0.1,angle2=0,oldangle1=0,oldangle2=0;
SDL_点line11={10,0},line12={110,0},line21={110,0},line22={210,0};
SDL_事件;
int mousex=0,mousey=0;
while(SDL_PollEvent(NULL)){
SDL_GetMouseState(&mousex,&mousey);
if(GetAsyncKeyState('W'))
角度1+=0.1;
SDL_SetRenderDrawColor(渲染器,0,0,0);
SDL_渲染器(渲染器);
如果(角度1oldangle1+0.1){
line12=旋转点(0,0,(角度1-oldangle1),line12);
line21=旋转点(0,0,(角度1-旧角度1),line21);
oldangle1=angle1;
}
如果(角度2oldangle2+0.1){
line22=旋转点(line21.x,line21.y,(角度2-旧角度2),line22);
oldangle2=angle2;
}
如果(角度2==0)
角度2=角度1;
printf(“%f”,角2);
SDL_SetRenderDrawColor(渲染器,0,255,0,0);
SDL_渲染绘制线(渲染器,line11.x,line11.y,line12.x,line12.y);
SDL_渲染绘制线(渲染器,line21.x,line21.y,line22.x,line22.y);
//solveIK(&angle1和&angle2,false,100100,mousex,mousey);
//角度1=获取角度(角度1);
//角度2=获得_度(角度2);
SDL_渲染器呈现(渲染器);
SDL_延迟(16);
}
<>我知道它是非常混乱的,但我刚开始用SDL和C++。等我把它修好了,我会试着把它修好

我已经尝试过的:

不同的旋转功能。就线路缩短而言,它们似乎都更糟。这很可能不是旋转函数的问题

重写代码。这是第3版,它工作得最好,但外观也最差

不要重新旋转

从初始点开始。现在应用旋转

如果有新的旋转,请从初始点开始并应用新的旋转。不要旋转第一次旋转的结果

一般来说,浮点运算会导致误差偏离理论结果。舍入到整数的错误更大(不确定您的代码是否这样做)。级联大量浮点操作有时会导致垃圾


现在,添加角度也会有舍入误差,但不是以一种明显的方式:它将旋转比它应该旋转的多/少,而不是拉伸/收缩直线。同样,如果您愿意的话,您可以用固定数量的乘法来代替重复加法,以减少这种情况。

只是一个不相关的提示:工作后清理是我一直告诉自己要做的,但我从来没有做过。事实上,如果你从一开始就保持它的清洁,那么让它工作起来就容易多了。什么是cx和cy?旋转中心坐标?耶。cx=拍摄的中心点。)您能详细解释一下吗?你的意思是,我应该将point1设置为其基本值,而不是(angle1 oldangle)并只应用angle1吗?谢谢我的朋友。我按照你的建议改变了它,问题(大部分)消失了。这仍然有点不精确,但我可以接受。
double angle1=0.1, angle2=0,oldangle1=0,oldangle2=0;
    SDL_Point line11 = { 10,0 }, line12 = { 110,0 }, line21 = { 110,0 }, line22 = { 210,0 };
    SDL_Event event;
    int mousex = 0, mousey = 0;
    while (SDL_PollEvent(NULL)) {
        SDL_GetMouseState(&mousex, &mousey);
        if (GetAsyncKeyState('W'))
            angle1 += 0.1;
        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
        SDL_RenderClear(renderer);
        if (angle1 < oldangle1-0.1||angle1 > oldangle1 + 0.1) {
            line12 = rotate_point(0, 0, (angle1-oldangle1), line12);
            line21 = rotate_point(0, 0, (angle1 - oldangle1), line21);
            oldangle1 = angle1;
        }
        if (angle2 < oldangle2 - 0.1 || angle2 > oldangle2 + 0.1) {
            line22 = rotate_point(line21.x,line21.y, (angle2 - oldangle2), line22);
            oldangle2 = angle2;
        }
        if (angle2 == 0)
            angle2 = angle1;
        printf("%f ", angle2);
        SDL_SetRenderDrawColor(renderer, 0, 255, 0, 0);
        SDL_RenderDrawLine(renderer, line11.x, line11.y, line12.x, line12.y);
        SDL_RenderDrawLine(renderer, line21.x, line21.y, line22.x, line22.y);
        //solveIK(&angle1, &angle2, false, 100, 100, mousex, mousey);
        //angle1 = get_degrees(angle1);
        //angle2 = get_degrees(angle2);
        SDL_RenderPresent(renderer);
        SDL_Delay(16);

    }