Кривая Безье широко используется в области компьютерной графики, например в CSS-анимации, Canvas и Photoshop, с которыми мы знакомы, можно увидеть кривую Безье.
Каталог статей
- 1. Что такое кривая Безье?
- Какие существуют типы кривых Безье?
- 3. Как строятся кривые Безье?
- 4. Как найти координаты точки кривой Безье?
- 5. Как реализовать конструктор кривой Безье третьего порядка, аналогичный свойству easing в CSS?
- 6. Как использовать кривые Безье высокого порядка для представления кривых Безье низкого порядка?
1. Что такое кривая Безье?
Кривые Безье были широко опубликованы в 1962 году французским инженером Пьером Безье, который использовал кривые Безье для проектирования кузова автомобиля.
Кривые Безье в основном используются для математических кривых в двумерных графических приложениях.Кривая состоит из начальной точки, конечной точки (также называемой опорной точкой) и контрольной точки.Путем настройки контрольных точек форма кривой Безье нарисован определенным образом. будет меняться. Метод рисования будет подробно описан позже.
Кривые Безье широко используются в компьютерной графике, например, эффект пера в Photoshop и инструмент кривой Безье в Flash 5. При разработке графического пользовательского интерфейса программного обеспечения обычно предоставляются соответствующие методы для реализации кривых Безье. Мы знакомы с функцией времени перехода анимации CSS. также получены с помощью кривых Безье (кривых Безье третьего порядка).
Какие существуют типы кривых Безье?
Кривая Безье согласноконтрольная точкаКоличество разделено на:
- Кривая Безье 1-го порядка (2 контрольные точки)
- Кривая Безье 2-го порядка (3 контрольные точки)
- Кривая Безье 3-го порядка (4 контрольные точки)
- Кривая Безье порядка n (контрольные точки)
3. Как строятся кривые Безье?
На следующем рисунке показана кривая Безье третьего порядка, включающая четыре контрольные точки соответственно..
Итак, как нам провести кривую Безье через контрольные точки?
Используя кривую Безье третьего порядка в качестве примера на рисунке выше, основные шаги заключаются в следующем:
- Четыре контрольные точки соединены последовательно, чтобы сформировать три сегмента линии, которые показаны на рисунке выше., а затем передать параметр, значение этого параметра равно длине точки на отрезке от начальной точки, деленной на длину отрезка. подобноНа отрезке есть точка,В настоящее времяЗначение,вРасположение показано ниже.
- Затем сделайте то же самое для каждого сегмента линии, чтобы получить три контрольные точки.,Как показано ниже.
- Затем повторите шаг 1 для этих трех контрольных точек, чтобы получить две контрольные точки.,Как показано ниже.
- Наконец, тот же метод можно использовать для получения конечной точки., как показано на рисунке ниже, эта точка является точкой на кривой Безье.
контролируяЗначение , увеличенное от 0 до 1, проводит линию от начальной точкик концукривая Безье.
Интуитивно ощутить процесс рисования можно благодаря следующей анимации:
4. Как найти координаты точки кривой Безье?
1. Кривая Безье первого порядка
Для кривой Безье первого порядка мы можем с помощью геометрических знаний легко согласноЗначение извлечения координат этой точки на отрезке линии:
Тогда мы можем получить:
2. Кривая Безье второго порядка
Для кривой Безье второго порядка вы можете понять это как:Используя формулу первого порядка, найти точку, затем вИспользуя формулу первого порядка, найти точку, и, наконец, вЗатем используйте формулу первого порядка, чтобы найти точку на окончательной кривой Безье.. Конкретный процесс получения выглядит следующим образом:
Сначала найдите контрольные точки на отрезке прямой.
Подставьте приведенную выше формулу в следующую формулу:
В результате получается следующая формула:
3. Кривая Безье третьего порядка
Подобно кривой Безье второго порядка, следующие формулы координат могут быть получены тем же методом:
4. Многопорядковая кривая Безье
Вот я просто поставилДана формула порядковой кривой Безье, и заинтересованные студенты могут изучить ее самостоятельно.
который:
формулаценность, связанные со статистикой, заинтересованные студенты могут взглянуть на мойэта статья.
вЗначение:
5. Как реализовать конструктор кривой Безье третьего порядка, аналогичный свойству easing в CSS?
Если мы хотим реализовать такую кривую Безье третьего порядка, нам нужно не только получить некоторые точки на кривой, но и получить координаты по оси Y через ось X.
Ослабляющая кривая Безье в CSS имеет характеристику, то есть начальная точка и конечная точка фиксированы, то есть они соответственно. Итак, есть только две неизвестные точки, то есть нужно передать четыре значения, и диапазон этих четырех значений должен быть вВнутри.
Итак, нам нужно создать класс CubicBezier со свойствамиcontrolPoints
:
class CubicBezier {
constructor(x1, y1, x2, y2) {
this.controlPoints = [x1, y1, x2, y2];
}
}
После инициализации вышеуказанного кода мы также должны быть основаны на T (диапазон стоимости)) значение для получения координат и массив набора координат на кривой. Кроме того, нужно использовать формулу Бесселя третьего порядка:
потому чтоКоординаты точки [0, 0],Координаты точкиТогда формулу можно записать так:
class CubicBezier {
constructor(x1, y1, x2, y2) {
this.controlPoints = [x1, y1, x2, y2];
}
getCoord(t) {
// 如果t取值不在0到1之间,则终止操作
if (t > 1 || t < 0) return;
const _t = 1 - t;
const [ x1, y1, x2, y2 ] = this.controlPoints;
const coefficient1 = 3 * t * Math.pow(_t, 2);
const coefficient2 = 3 * _t * Math.pow(t, 2);
const coefficient3 = Math.pow(t, 3);
const px = coefficient1 * x1 + coefficient2 * x2 + coefficient3;
const py = coefficient1 * y1 + coefficient2 * y2 + coefficient3;
// 结果只保留三位有效数字
return [parseFloat(px.toFixed(3)), parseFloat(py.toFixed(3))];
}
}
Используя приведенный выше класс Безье, мы можем построить экземпляр Безье на основе двух контрольных точек.Через этот экземпляр мы можем получить приблизительное значение точки на основе значения t.
Итак, если мы хотим получить координату по оси Y на основе значения координаты по оси X, что нам делать?
Здесь я использую приблизительный метод, а именно:
- Сначала получите две точки, ближайшие к точке, которую нужно оценить.
- Тогда через эти две точки можно получить уравнение прямой линии.
- Наконец, путем передачи координаты по оси x в уравнение прямой можно приблизительно получить значение координаты по оси y.
Итак, нам нужно дополнительно преобразовать конструктор Безье, нужно кэшировать свойства фиксированного количества массивов координатcoords
, и получитьcoords
МетодыgetCoordsArray
, и, наконец, есть способ получить координаты по оси YgetY
, конкретный метод реализации выглядит следующим образом:
class CubicBezier {
constructor(x1, y1, x2, y2) {
const precision = 100;
this.controlPoints = [x1, y1, x2, y2];
this.coords = this.getCoordsArray(precision);
}
getCoord(t) {
// 如果t取值不在0到1之间,则终止操作
if (t > 1 || t < 0) return;
const _t = 1 - t;
const [ x1, y1, x2, y2 ] = this.controlPoints;
const coefficient1 = 3 * t * Math.pow(_t, 2);
const coefficient2 = 3 * _t * Math.pow(t, 2);
const coefficient3 = Math.pow(t, 3);
const px = coefficient1 * x1 + coefficient2 * x2 + coefficient3;
const py = coefficient1 * y1 + coefficient2 * y2 + coefficient3;
// 结果只保留三位有效数字
return [parseFloat(px.toFixed(3)), parseFloat(py.toFixed(3))];
}
getCoordsArray(precision) {
const step = 1 / (precision + 1);
const result = [];
for (let t = 0; t <= precision + 1; t++) {
result.push(this.getCoord(t * step));
}
this.coords = result;
return result;
}
getY(x) {
if (x >= 1) return 1;
if (x <= 0) return 0;
let startX = 0;
for (let i = 0; i < this.coords.length; i++) {
if (this.coords[i][0] >= x) {
startX = i;
break;
}
}
const axis1 = this.coords[startX];
const axis2 = this.coords[startX - 1];
const k = (axis2[1] - axis1[1]) / (axis2[0] - axis1[0]);
const b = axis1[1] - k * axis1[0];
// 结果也只保留三位有效数字
return parseFloat((k * x + b).toFixed(3));
}
}
Тогда мы можем использовать нашCubicBezier
сейчас:
const cubicBezier = new CubicBezier(0.3, 0.1, 0.3, 1);
cubicBezier.getY(0.1); // 0.072
cubicBezier.getY(0.7); // 0.931
Я написал приложение для этого
CubicBezier
Библиотека конструкторовAnimate-Scroll, Если вам интересно, вы можете взглянуть на исходный код.
6. Как использовать кривые Безье высокого порядка для представления кривых Безье низкого порядка?
ОдинЗаказать Кривые Безье можно провести через точно такую же формуЗаказать Представление кривой Безье. Итак, что мы делаем, чтобы получить этоКак насчет кривых Безье порядка?
Процесс представления кривой более низкого порядка кривой Безье более высокого порядка, мы называем этоВосходящий порядок.
нам нужно использоватьЭто уравнение используется для масштабирования.
- Взяв в качестве примера рост второго порядка до третьего порядка, формула координат кривой Безье второго порядка будет следующей:
Подставьте следующее уравнение в приведенную выше формулу:
Тогда выводится следующая формула:
По вышеприведенным результатам можно сделать вывод, что контрольная точка определяется предыдущимстал,,а такжеЕсть четыре контрольных точки, тем самым завершая апгрейд.
- Если для любого значения n, как нам повысить порядок? (Ниже приведен процесс вывода, учащиеся, которые не заинтересованы, могут сразу перейти к формуле ниже 👇)
Здесь требуется некоторый вывод (здесь вывод требует использованияФормулу, заинтересованные студенты могут вывести самостоятельно), потому что:
Формула Бесселя может быть выражена как:
Подставляя два приведенных выше уравнения, мы получаем:
потому что когдаВремя:
Таким образом, формулу можно записать так:
и потому, что:
когдаВремя:
так:
Подставив два приведенных выше уравнения (1) и (2) в формулу (0), окончательно можно получить следующую возрастающую формулу:
Базовое содержание кривой Безье почти готово, если вы нашли что-то не так или есть что добавить, пожалуйста, укажите это в комментариях 😊.