![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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(). Правда, для этого придётся кривую Безье разбивать на отрезки.
|