Определить точку на определенном расстоянии от линии

Это скорее вопрос математики, чем вопрос программирования, но так как я использую C++ а также COCOS2D-XЯ решил опубликовать это здесь.

я использую CCBezierTo создать движение Безье, что спрайт mySpriteпробеги. CCBezierConfig структура принимает три пункта (CCPoints): controlPoint_1, controlPoint_2, а также endPoint, Два controlPoints — это точки, в которых кривая Безье изгибается.

Теперь вот вопрос. controlPoints, которые мне нужны для создания кривой, неизвестны и могут быть получены только с помощью математики. Это переменные, которые известны. Пожалуйста, обратитесь к диаграмме ниже.

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: линия начинается слева направо
Случай 1: линия начинается слева направо

Случай 2: линия начинается с левого верхнего до правого нижнего
Случай 2: линия начинается с левого верхнего до правого нижнего

Случай 3: линия начинается сверху вниз справа налево
Случай 3: линия начинается сверху вниз справа налево

Заранее спасибо.

1

Решение

Шаг 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 и так далее.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]