Это скорее вопрос математики, чем вопрос программирования, но так как я использую C++
а также COCOS2D-X
Я решил опубликовать это здесь.
я использую CCBezierTo
создать движение Безье, что спрайт mySprite
пробеги. CCBezierConfig
структура принимает три пункта (CCPoint
s): controlPoint_1
, controlPoint_2
, а также endPoint
, Два controlPoint
s — это точки, в которых кривая Безье изгибается.
Теперь вот вопрос. controlPoint
s, которые мне нужны для создания кривой, неизвестны и могут быть получены только с помощью математики. Это переменные, которые известны. Пожалуйста, обратитесь к диаграмме ниже.
A = The start point of the curve
B = The end point of the curve
Line AB = The line created by connecting A and B together
L = The distance between A and B/The length of Line AB
D = The distance between the line and the unknown points
Я пытаюсь найти X и Y. Я уже немного достиг этого, но только когда линия горизонтальная или вертикальная:
// From left to right:
ccBezierConfig bezierConfig;
bezierConfig.controlPoint_1 = CCPointMake( A.x + ( L * 0.25f ), A.y + aCertainHeight );
bezierConfig.controlPoint_2 = CCPointMake( A.x + ( L * 0.75f ), A.y - aCertainHeight );
bezierConfig.endPoint = B;
/** CCPointMake( x, y ) is a macro that creates a CCPoint object, which is a point on a plane.
It accepts two float values determining the X and Y position of the point.**/
// From top to bottom:
ccBezierConfig bezierConfig;
bezierConfig.controlPoint_1 = CCPointMake( A.x + aCertainWidth, A.y - ( L * 0.25f ) );
bezierConfig.controlPoint_2 = CCPointMake( A.x - aCertainWidth, A.y - ( L * 0.25f ) );
bezierConfig.endPoint = B;
Как я могу получить X и Y, если линия диагональна?
Случай 1: линия начинается слева направо
Случай 2: линия начинается с левого верхнего до правого нижнего
Случай 3: линия начинается сверху вниз справа налево
Заранее спасибо.
Шаг 1: вычислить вектор от A до B, назовите его v
,
Шаг 2: вычислить вектор, перпендикулярный этому вектору, с единичной длиной. Назови это w
, В общем (-y, x)
а также (y, -x)
оба перпендикулярны (x, y)
, Первые указывают «налево», а вторые «направо».
Шаг 3: вычислить X
как A + 0.25 * v + D_1 * w
и подобное для Y
,
Я думаю, что все это работает так:
// Using a "point" type for a vector is dodgy, but it works.
w = CCPointMake((B.y - A.y) / L, -(B.x - A.x) / L);
X = CCPointMake(
0.75 * A.x + 0.25 * B.x + D_1 * w.x,
0.75 * A.y + 0.25 * B.y + D_1 * w.y,
);
Y = CCPointMake(
0.25 * A.x + 0.75 * B.x + D_2 * w.x,
0.25 * A.y + 0.75 * B.y + D_2 * w.y,
);
или похожие.
Если у cocos2d есть отдельный тип для двумерных векторов, используйте это, вы можете обнаружить, что можете писать выражения вроде (B - A)/L
и так далее.
Других решений пока нет …