В: У кого-нибудь есть исходный код или какая-либо информация для рисования
кривых Безье? Я должен использовать их в своем компоненте. Пожалуйста
используйте для ответа мой адрес электронной почты.
Я решил ответить на этот крик души - причина?: 1. Не первый раз вижу подобный
вопрос, 2. Задача настолько избита, что я без труда нашел ответ в своем архиве.
(BTW: У меня есть более старые решения, чем это ;-P)
Тем не менее эта технология жива до сих пор и приносит свои плоды:
(********************************************************************)(* GRAPHIX TOOLBOX 4.0 *)(* Copyright (c) 1985, 87 by Borland International, Inc. *)(********************************************************************)unit GShell;
interface{------------------------------ вырезано --------------------------}procedure Bezier(A: PlotArray; MaxContrPoints: integer;
var B: PlotArray; MaxIntPoints: integer);
implementation{------------------------------ вырезано --------------------------}procedure Bezier {(A : PlotArray; MaxContrPoints : integer;
var B : PlotArray; MaxIntPoints : integer)};
const
MaxControlPoints = 25;
type
CombiArray = array[0..MaxControlPoints] of Float;
var
N: integer;
ContrPoint, IntPoint: integer;
T, SumX, SumY, Prod, DeltaT, Quot: Float;
Combi: CombiArray;
begin
MaxContrPoints := MaxContrPoints - 1;
DeltaT := 1.0 / (MaxIntPoints - 1);
Combi[0] := 1;
Combi[MaxContrPoints] := 1;
for N := 0 to MaxContrPoints - 2 do
Combi[N + 1] := Combi[N] * (MaxContrPoints - N) / (N + 1);
for IntPoint := 1 to MaxIntPoints dobegin
T := (IntPoint - 1) * DeltaT;
if T <= 0.5 thenbegin
Prod := 1.0 - T;
Quot := Prod;
for N := 1 to MaxContrPoints - 1 do
Prod := Prod * Quot;
Quot := T / Quot;
SumX := A[MaxContrPoints + 1, 1];
SumY := A[MaxContrPoints + 1, 2];
for N := MaxContrPoints downto 1 dobegin
SumX := Combi[N - 1] * A[N, 1] + Quot * SumX;
SumY := Combi[N - 1] * A[N, 2] + Quot * SumY;
end;
endelsebegin
Prod := T;
Quot := Prod;
for N := 1 to MaxContrPoints - 1 do
Prod := Prod * Quot;
Quot := (1 - T) / Quot;
SumX := A[1, 1];
SumY := A[1, 2];
for N := 1 to MaxContrPoints dobegin
SumX := Combi[N] * A[N + 1, 1] + Quot * SumX;
SumY := Combi[N] * A[N + 1, 2] + Quot * SumY;
end;
end;
B[IntPoint, 1] := SumX * Prod;
B[IntPoint, 2] := SumY * Prod;
end;
end; { Bezier }end. { GShell }
Классика!
Постоянный код - это реализация алгоритма де Кастельжу для рисования кривых Бэзье в Delphi. Этот алгоритм широко используется для вычисления точек на кривой Бэзье, заданной ее контрольными точками.
Вот краткое объяснение, как работает код:
Процедура Bezier принимает четыре параметра:
A: массив координат рисования (контрольные точки) для кривой Бэзье.
MaxContrPoints: количество контрольных точек (должно быть меньше или равно 25).
B: выходной массив координат рисования для точек на кривой Бэзье.
MaxIntPoints: максимальное количество промежуточных точек для вычисления.
Процедура вычисляет кривую Бэзье, iteratively вычисляя точки на кривой с помощью алгоритма де Кастельжу.
Для каждой промежуточной точки она рассчитывает веса для контрольных точек с использованием биномиальных коэффициентов (хранящихся в массиве Combi).
Затем она использует эти веса для вычисления координат x и y промежуточной точки, комбинируя соответствующие контрольные точки.
Код quite эффективен, поскольку он требует только одиночный проход через контрольные точки для вычисления каждой промежуточной точки. Однако может не быть наиболее оптимизированным реализацией для больших количеств контрольных точек или высокопrecision расчетов.
Если вам нужно больше информации или модификации этого кода, пожалуйста, спросите!
П.С. Рад, что я мог помочь вам с вашим "помощью в крике" (как вы его назвали). Всегда приятно вернуться к классическим алгоритмам и кодовым фрагментам!
В статье описывается алгоритм рисования кривых Безье в Delphi 2 с использованием компонента GRAPHIX TOOLBOX 4.0 и приведен пример кода на Pascal для реализации этой функции.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.