![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Доброго времени суток! Существует проблема. На компоненте Image построил кривую Безье с помощью метода: Image.Canvas.PolyBezier(m). Теперь необходимо по построенной кривой прогнать компонент Shape (в виде круга, точки). Движение Shapе'а я думаю сделать меняя значения Top и left, но для этого необходимы координаты всех нарисованных методом PolyBezier пикселей. Как это реализовать? не могу никак добраться до координат. Буду рад, возможно, и другим подкинутым идеям реализации. Заранее благодарю.
|
#2
|
|||
|
|||
![]() Один из способов - самому построить кривую Безье. Имеются начальная и конечная точки (P0, P3). Вы добавляете две промежуточные точки.
Bez.png Уравнение кривой: C(s) = P0 * (1 - s)^3 + P1 * 3 * s * (1 - s)^2 + P2 * 3 * s^2 * (1 - s) + P3 * s^3 где s меняется от 0 до 1. Вот процедура (писал для DirectX) - из книги Адамса Код:
procedure CubicBezierCurve(vecPoint1, vecPoint2, vecPoint3, vecPoint4: TD3DXVECTOR3; Scalar: Single; var vecOut: TD3DXVECTOR3); var v1: TD3DXVECTOR3; begin // C(s) = // P0 * (1 - s)^3 + D3DXVec3Scale(vecOut, vecPoint1, (1.0-Scalar)*(1.0-Scalar)*(1.0-Scalar)); // P1 * 3 * s * (1 - s)^2 + D3DXVec3Scale(v1, vecPoint2, 3.0*Scalar*(1.0-Scalar)*(1.0-Scalar)); D3DXVec3Add(vecOut, vecOut, v1); // P2 * 3 * s^2 * (1 - s) + D3DXVec3Scale(v1, vecPoint3, 3.0*Scalar*Scalar*(1.0-Scalar)); D3DXVec3Add(vecOut, vecOut, v1); // P3 * s^3 D3DXVec3Scale(v1, vecPoint4, Scalar*Scalar*Scalar); D3DXVec3Add(vecOut, vecOut, v1); end; |
#3
|
|||
|
|||
![]() Координаты же именно пикселей можно узнать через ф-ю WinAPI LineDDA(). Правда, для этого придётся кривую Безье разбивать на отрезки.
|