2011-06-17 89 views
0

問題由原始的海報撤銷問題打圈計算

嘿所以運行下面的代碼我方應該周遊了一圈的時候,但有某種問題與計算功能x,y應該根據行進的速度和角度發生移動。

它成功地四處走動,但沒有正確的方式。第二和第四象限是倒轉的,向內彎曲而不是向外彎曲。

我無法弄清楚問題是什麼......任何人都想幫忙?

#include<SFML/Graphics.hpp> 
#include<SFML/System.hpp> 
#include<cmath> 
#include<vector> 
# define M_PI 3.14159265358979323846 

sf::RenderWindow Window; 

template<typename T> 
void CalculateMove(T Time, T Speed, T Angle, T& buffX, T& buffY) 
{ //Make the degrees positive 
    if(Angle<0) Angle= 360-Angle; 
    //determine what quadrant of circle we're in 
    unsigned int Quadrant= 1; 
    if(Angle>90) Quadrant= 2; 
    if(Angle>180) Quadrant= 3; 
    if(Angle>270) Quadrant= 4; 

    //anything above 90 would be impossible triangle 
    Angle= (float)(Angle-(int)Angle)+(float)((int)Angle%90); 

    // calculates x and y based on angle and Hypotenuse.02433 
    if((int)Angle!=0){ 
     buffX= sin(Angle/180 * M_PI)/ (1.f/(Speed*Time)); 
     buffY= sin((180-Angle-90)/ 180 * M_PI)/ (1.f/(Speed*Time));} 

    else{// Movement is a straight line on X or Y axis 
     if(Quadrant==0 || Quadrant==2) buffX= Speed*Time; 
     if(Quadrant==1 || Quadrant==4) buffY= Speed*Time;} 

    //Quadrant Factor (positive or negative movement on the axis) 
    switch(Quadrant){ 
    case 1: break; 
    case 2: buffX=-buffX; break; 
    case 3: buffX=-buffX; buffY=-buffY; break; 
    case 4: buffY=-buffY; break;} 
}; 

///////////////////////////////////////// Mysprite //////////////////////////////// 
class mySprite : public sf::Sprite 
{ 
private: 
    float velocity; 
    float angle; 

public: 
    // all the values needed by the base class sprite(); 
    mySprite(
     const sf::Image& Img, 
     const sf::Vector2f& Position = sf::Vector2f(0, 0), 
     const sf::Vector2f& Scale = sf::Vector2f(1, 1), 
     float Rotation = 0.f, 
     const float Angle= 0.f, 
     const float Velocity= 0.f, 
     const sf::Color& Col = sf::Color(255, 255, 255, 255)): 
     Sprite(Img, Position, Scale, Rotation, Col){ 
     angle= Angle; 
     velocity= Velocity;}; 

    float Velocity(){return velocity;}; 
    void SetVelocity(float newVelocity){velocity=newVelocity;}; 
    float Angle(){return angle;}; 
    void SetAngle(float newAngle){angle=(float)(newAngle-(int)newAngle)+(float)((int)newAngle%360);}; 

    void Update(){ 
     float frameTime= Window.GetFrameTime(); 
     float X=0,Y=0; 
     CalculateMove(frameTime,velocity,angle,X,Y); 
     Move(X,-Y); 
    }; 

    void Accelerate(float PPS){velocity+=PPS;}; 
    void Turn(float degrees){ 
     float test= (float)((angle+degrees)- (int)(angle+degrees)); //TODO: Get rid of these test 
     float test2=(float)((int)(angle+degrees)%360); 
     float test3=test+test2; 
     angle=(float)((angle+degrees)-(int)(angle+degrees))+(float)((int)(angle+degrees)%360);}; 

    void Reflect(float CollAngle){ 
     SetRotation(-GetRotation()); 
     angle=-angle; 
     //TODO: factor in the collision angle 
    }; 
}; 

int main() 
{ 
    Window.Create(sf::VideoMode(800, 600), "Pong! by Griffin Howlett"); 
    sf::Image img; 
    img.Create(30,50,sf::Color(255,0,0)); 
    mySprite box(img, sf::Vector2f(400,200), sf::Vector2f(1,1), 0, 180, 200); 
    Window.Display(); 

    for(;;){ 
     Window.Clear(); 
     box.Update(); 
     box.Turn(45.0*Window.GetFrameTime()); 
     Window.Draw(box); 
     Window.Display(); 
    } 

} 

回答

0

看來我錯在假設的三角形形成,並且用於計算以獲得於x所需的運動,y座標總是自動使用Y軸作爲側相反的「角度」的,並坐標是第2和第4象限的倒退,感謝其他反饋!

下面是更新的代碼:

if((int)Angle!=0){ 
     if(Quadrant==2 || Quadrant==4) Angle=90-Angle; //The unit circle triangle is flipped otherwise, causing x and y to be switched 
     buffY= sin(Angle/180 * M_PI)/ (1.f/(Speed*Time)); 
     buffX= sin((180-Angle-90)/ 180 * M_PI)/ (1.f/(Speed*Time));} 

通過執行90角即時切換用於尋找X,虛三角形的Y側角....

4

你的第一個錯誤:

if(Angle<0) Angle= 360-Angle; 

應該是:

if(Angle<0) Angle= 360+Angle; 

我不明白爲什麼你要分割的角度成象限的麻煩。你認爲sin函數只定義了0到90度的範圍嗎?

+0

所以我可以後來使x和y運動基於象限爲負或正位於 – Griffin 2011-06-17 03:19:03

+1

@Griffin,sin(和cos)函數將自動提供適當角度的負數。 – 2011-06-17 03:20:42

0

不知道所有的問題,但是這行代碼是錯誤的:

if(Angle<0) Angle= 360-Angle; 

如果Angle < 0然後360 - 角將> 360

你也可以清理象限設置代碼,否則當角度> 270時,您將分配4次。

int Quadrant = 1; 
if (Angle > 270) 
{ 
    Qadrant = 4; 
} 
else if (Angle > 180) 
{ 
    Quadrant = 3; 
} 
else if (Angle > 90) 
{ 
    Quadrant = 2; 
} 
+0

會清理象限設置代碼保存所有這些很多進程?我正在考慮檢查角度是否大於90°,​​180°等將花費4次。 – Griffin 2011-06-17 03:21:37

+0

它不是一個巨大的節省,但是在你的代碼中,你既做了任務,也做了比較,這將它簡化爲比較和單個任務,並減少了比較次數。在你的每一次比較中,每次都進行比較,而在這裏進一步的比較只有在前一次是錯誤的時候纔會進行。就速度而言,在一個緊密的循環中它會加起來。比較比分配要快,因此減少分配和比較將節省一些時間(可能會忽略不計),並且(對我而言)更清晰以限制分配(特別是在調試時) – pstrjds 2011-06-17 15:46:07