gpt4 book ai didi

C++ 旋转线变短

转载 作者:行者123 更新时间:2023-11-30 02:29:21 25 4
gpt4 key购买 nike

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

    SDL_Point rotate_point(double cx, double cy, double angle, SDL_Point p)
{
double pi = acos(-1);
double rotation_angle = (double)angle / 180.0 * pi;
double s = sin(rotation_angle);
double c = cos(rotation_angle);

// translate point back to origin:
p.x -= cx;
p.y -= cy;

// rotate point
double xnew = p.x * c - p.y * s;
double ynew = p.x * s + p.y * c;

// translate point back:
p.x = xnew + cx;
p.y = ynew + cy;

return p;
}

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

下面是我使用函数的方式:

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);

}

我知道它非常困惑,但我刚刚开始使用 sdl 和 c++。在我让它工作后,我会尝试修复它。

我已经尝试过的:

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

重写代码。这是第 3 版,效果最好,但外观也最差。

最佳答案

不要重新旋转。

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

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

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

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

关于C++ 旋转线变短,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39572166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com