繁体   English   中英

2D旋转问题C ++ DirectX

[英]2D Rotation Issue C++ DirectX

因此,我试图将一个点围绕窗口中的另一个点旋转,并使用DirectX进行绘制。 我的问题是旋转状态很奇怪:

http://prntscr.com/iynh5f

我正在做的只是围绕窗口中心旋转一个点,并在这些点之间绘制线条。

vec2_t vecCenter1 { gui.iWindowSize[ 0 ] / 2.f, gui.iWindowSize[ 1 ] / 2.f };
for ( float i { 0.f }; i < 360.f; i += 2.f )
{
    vec2_t vecLocation { vecCenter1.x, vecCenter1.y - 100.f };
    static vec2_t vecOldLocation = vecLocation;
    vecLocation.Rotate( i, vecCenter1 );
    if ( i > 0.f )
        Line( vecOldLocation, vecLocation, 2, true, D3DCOLOR_ARGB( 255, 255, 255, 255 ) );
    vecOldLocation = vecLocation;
}

这是我的轮换:

void vec2_t::Rotate( float flDegrees, vec2_t vecSubtractVector ) 
{
    flDegrees = ToRadian( flDegrees );

    float flSin = sin( flDegrees );
    float flCos = cos( flDegrees );

    *this -= vecSubtractVector;

    x = x * flCos - y * flSin;
    y = x * flSin + y * flCos;

    *this += vecSubtractVector;
}

我尝试了几种不同的轮换方法,但似乎都没有用。 如果有人能告诉我我在做什么错,我将不胜感激。

关键线:

x = x * flCos - y * flSin;
y = x * flSin + y * flCos;  << problem 

第二行使用x修改后的值,而它应该使用原始值。 在更新之前,您必须缓存两个坐标(或至少x ):

void vec2_t::Rotate( float flDegrees, vec2_t vecSubtractVector ) 
{
    float flRadians = ToRadian( flDegrees );

    float flSin = sin( flRadians );
    float flCos = cos( flRadians );

    // cache both values + pre-subtract
    float xOld = x - vecSubtractVector.x;
    float yOld = y - vecSubtractVector.y;

    // perform the rotation and add back
    x = xOld * flCos - yOld * flSin + vecSubtractVector.x;
    y = xOld * flSin + yOld * flCos + vecSubtractVector.y;
}

  • 要摆脱for循环中的if语句,只需计算循环外的第一个点,然后从增量值而不是零开始
  • 不要使用static因为它可能会导致线程安全问题(尽管对您而言并不重要)-只需在循环外部声明即可
  • 您似乎缺少线段-条件必须为<= 360.f (理想情况下加上epsilon)

     vec2_t vecCenter1 = { gui.iWindowSize[ 0 ] / 2.f, gui.iWindowSize[ 1 ] / 2.f }; const float delta_angle = 2.f; vec2_t vecOldLocation = { vecCenter1.x, vecCenter1.y - 100.f }; for ( float i = delta_angle; i <= 360.f; i += delta_angle ) // complete cycle { vec2_t vecLocation = { vecCenter1.x, vecCenter1.y - 100.f }; vecLocation.Rotate( i, vecCenter1 ); Line( vecOldLocation, vecLocation, 2, true, // no if statement D3DCOLOR_ARGB( 255, 255, 255, 255 ) ); vecOldLocation = vecLocation; } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM