Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.11.2015, 05:44
JapanStyle JapanStyle вне форума
Прохожий
 
Регистрация: 06.11.2015
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Координаты точек на кривой Безье

Доброго времени суток! Существует проблема. На компоненте Image построил кривую Безье с помощью метода: Image.Canvas.PolyBezier(m). Теперь необходимо по построенной кривой прогнать компонент Shape (в виде круга, точки). Движение Shapе'а я думаю сделать меняя значения Top и left, но для этого необходимы координаты всех нарисованных методом PolyBezier пикселей. Как это реализовать? не могу никак добраться до координат. Буду рад, возможно, и другим подкинутым идеям реализации. Заранее благодарю.
Ответить с цитированием
  #2  
Старый 09.11.2015, 13:45
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Один из способов - самому построить кривую Безье. Имеются начальная и конечная точки (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  
Старый 09.11.2015, 13:58
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Координаты же именно пикселей можно узнать через ф-ю WinAPI LineDDA(). Правда, для этого придётся кривую Безье разбивать на отрезки.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:05.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025