Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何围绕直线的一个顶点旋转直线_C++_Algorithm_Geometry_Raycasting_Cartesian Coordinates - Fatal编程技术网

C++ 如何围绕直线的一个顶点旋转直线

C++ 如何围绕直线的一个顶点旋转直线,c++,algorithm,geometry,raycasting,cartesian-coordinates,C++,Algorithm,Geometry,Raycasting,Cartesian Coordinates,我正在制作我的第一个光线投射引擎,我想把一条线旋转一个角度θ 如何做到这一点?是否可以给我一些基本的C++代码或一些伪代码? 此图像描述了我的问题: 可选问题 我决定在graphics.h中完成这一切,因为它是C/C++最简单的图形头。一个简单的算法: 移动圆圈-P,使P位于(0,0) 将A旋转角度乘以 移动圆P以恢复其原始位置 所有这三个步骤都可以使用一个3x3矩阵乘法完成。您需要: B = P + M * (A - P) 其中M是二维旋转矩阵: M = | cos(ϴ) -sin(

我正在制作我的第一个光线投射引擎,我想把一条线旋转一个角度θ

如何做到这一点?是否可以给我一些基本的C++代码或一些伪代码? 此图像描述了我的问题:


可选问题 我决定在
graphics.h
中完成这一切,因为它是C/C++最简单的图形头。

一个简单的算法:

  • 移动圆圈
    -P
    ,使
    P
    位于(0,0)
  • A
    旋转角度乘以
  • 移动圆
    P
    以恢复其原始位置
  • 所有这三个步骤都可以使用一个3x3矩阵乘法完成。

    您需要:

    B = P + M * (A - P)
    
    其中
    M
    是二维旋转矩阵:

    M = |  cos(ϴ)  -sin(ϴ) |
        |  sin(ϴ)   cos(ϴ) |
    
    在C++中,它可以写成:

    float c = cos(theta), s = sin(theta);
    float dx = ax - px, dy = ay - py;
    float bx = px + c * dx - s * dy;
    float by = py + s * dx + c * dy;
    

    两个向量的标量积具有以下特性:

    vec(PA) . vec(PB) = rho cos theta
    
    取两个向量的定义:

    vec(PA) = (x_a-x_p, y_a-y_p)
    vec(PB) = (x_b-x_p, y_b-y_p)
    
    我们可以得到:

    (x_a-x_p)(x_b-x_p) + (y_a-y_p)(y_b-y_p) = rho cos theta (1)
    
    由于PA=PB,我们还有:

    (x_a-x_p)^2 + (y_a-y_p)^2 = (x_b-x_p)^2 + (y_b-y_p)^2 (2)
    

    (1)
    (2)
    可以通过一些算术自动驾驶仪导出
    x\u b
    y\u b

    也感兴趣,因为叉积只在三维中起作用链接不起作用,我得到的图像无法显示。它对我有效:/如果你在做线性代数,选择一个线性代数库,并使用适当类型的值表示它。然后您可以编写类似于数学
    B=P+M*(A-P)的代码可以是有效的C++此网站可以为您提供帮助: