圆周运动效果不精确

Vec2& CirclingMotionBy::getPosByAngle(const Vec2& targetPos, float angleBy, Vec2 circleCenter)
{
float xLong;
targetPos.x > circleCenter.x ? xLong = targetPos.x - circleCenter.x : xLong = circleCenter.x - targetPos.x;
float yLong;
targetPos.y > circleCenter.y ? yLong = targetPos.y - circleCenter.y : yLong = circleCenter.y - targetPos.y;
double radius = sqrt(xLongxLong+yLongyLong);
double startRadian = atan2f(targetPos.x - circleCenter.x, targetPos.y - circleCenter.y);
double radian = startRadian + CC_DEGREES_TO_RADIANS(angleBy);
double x = radius * sin(radian);
double y = radius * cos(radian);
Vec2 newPos = Vec2(x+circleCenter.x, y+circleCenter.y);
return newPos;
}
旋转角度越靠近180度坐标偏差越大,不知哪里计算错误,还请指教:A圆是旋转0,B是72,C是72+72…CD离中间圆偏好多啊。

以前写的一个action不是知道是否是你需要的。
.h

#ifndef CircleAction_H
#define CircleAction_H
#include "BasicLayer.h"

// 定义一个结构来包含椭圆的参数  
class CircleConfig 
{
public:
    //中心点坐标  
    Vec2 _centerPos;
    //圆半径  
    float _radius;
    //起始弧度
    float _radian;
    //矫正角度
    float _correctDegree;
    //逆时针顺时针
    bool _isClockwise;
    //是否需要一直转圈
    bool _isRunForever;

    CircleConfig()
    {

    }

    CircleConfig(Vec2 centerPos, float radius, float radian = 0, float correctDegree = 0, bool isClockWise = true, bool isRunForever = false)
    {
        _centerPos = centerPos;
        _radius = radius;
        _radian = radian;
        _correctDegree = correctDegree;
        _isClockwise = isClockWise;
        _isRunForever = isRunForever;
    }

};

class CircleAction : public ActionInterval
{
public:
    //转一圈的时间 圆形参数 是否重复
    static CircleAction *create(float interval, const CircleConfig& c);  
    bool initWithDuration(float interval, const CircleConfig& c);
    virtual void update(float dt);//利用update函数来不断的设定坐标  
    virtual void step(float dt);
    virtual bool isDone();
    Vec2 getPositionByRadian(float radian);
protected:
    CircleConfig m_cConfig;
};
#endif

.cpp

#include "CircleAction.h"
CircleAction* CircleAction::create(float interval, const CircleConfig& c)
{
    CircleAction *cAction = new (std::nothrow) CircleAction();
    cAction->initWithDuration(interval, c);
    cAction->autorelease();
    return cAction;
}

bool CircleAction::initWithDuration(float interval, const CircleConfig& c)
{
    ActionInterval::initWithDuration(interval);
    m_cConfig = c;
    return true;
}

void CircleAction::step(float dt)
{
    ActionInterval::step(dt);
    //如果需要一直转圈 并且已经完成一圈
    if (m_cConfig._isRunForever && (_elapsed >= _duration))
    {
        float diff = _elapsed - _duration;
        if (diff > _duration)
            diff = fmodf(diff, _duration);
        startWithTarget(_target);
        // to prevent jerk. issue #390, 1247
        ActionInterval::step(0.0f);
        ActionInterval::step(diff);
    }
}

Vec2 CircleAction::getPositionByRadian(float radian)
{
    Vec2 circlePos = m_cConfig._centerPos;//中心点坐标  
    float radius = m_cConfig._radius;
    auto addPos = Vec2(radius*cos(radian), radius*sin(radian));
    auto targetPos = circlePos + addPos;
    return targetPos;
}

bool CircleAction::isDone()
{
    return false;
}

void CircleAction::update(float dt)
{
    if (_target)
    {
        Vec2 circlePos = m_cConfig._centerPos;//中心点坐标  
        float radius = m_cConfig._radius;
        bool isClockWise = m_cConfig._isClockwise;
        int clockSpeed = 1;
        if (isClockWise) clockSpeed = -1;
        float curRadian = m_cConfig._radian + dt * 2 * M_PI*clockSpeed;
        auto addPos = Vec2(radius*cos(curRadian), radius*sin(curRadian));
        auto targetPos = circlePos + addPos;
        _target->setPosition(targetPos);
        auto angel = CC_RADIANS_TO_DEGREES(curRadian);
        angel += m_cConfig._correctDegree;
        //cocos顺时针为正逆时针为负数
        angel = -angel;
        _target->setRotation(angel);
    }
}

恩,谢谢,先保留着。我暂时自己设定好坐标再全部放到一个精灵里,旋转精灵方便一些,也看看效果是否可以。