Curve
Кубическая функция Y от X с касательными и кэшем выборки.
Curve хранит точки (X, Y) и касательные dy/dx. Sample вычисляет исходную кривую; SampleBaked использует равномерный кэш с линейной интерполяцией. Это не траектория Curve2D/Curve3D. Координата выборки задаётся в единицах домена, который по умолчанию равен 0…1.
Для прямого перехода задайте Linear: нулевые касательные Free по умолчанию дают плавную кубическую кривую. Полный пример:
using Reckfell;
public static class UnitRamp
{
public static Curve Create()
{
var curve = new Curve { BakeResolution = 128 };
curve.AddPoint(Vector2.Zero,
leftMode: Curve.TangentMode.Linear, rightMode: Curve.TangentMode.Linear);
curve.AddPoint(Vector2.One,
leftMode: Curve.TangentMode.Linear, rightMode: Curve.TangentMode.Linear);
return curve;
}
}AddPoint ограничивает позицию границами, SetPointValue не ограничивает Y, а SetPointOffset повторно ограничивает обе координаты и возвращает новый индекс. Не храните индексы как постоянные идентификаторы. Границы значений не ограничивают выбросы кубической интерполяции.
BakeResolution меняет точность кэша, но не испускает Changed. После его изменения вызовите EmitChanged(), если связанная CurveTexture должна обновиться. При разрешении 1 кэш постоянен и равен последнему Y.
Известный дефект текущей версии: CleanDupes удаляет даже точки с разными X. Не вызывайте его на рабочих данных. Следующий проверенный помощник сохраняет различные позиции и удаляет правую точку только при точном равенстве соседних X; он не объединяет близкие значения и не исправляет нативный метод:
using System;
using Reckfell;
public static class CurveTools
{
// Removes the right-hand point only when adjacent X values are exactly equal.
public static int RemoveExactDuplicateOffsets(Curve curve)
{
ArgumentNullException.ThrowIfNull(curve);
int removed = 0;
for (int i = curve.GetPointCount() - 1; i > 0; i--)
{
if (curve.GetPointPosition(i).X == curve.GetPointPosition(i - 1).X)
{
curve.RemovePoint(i);
removed++;
}
}
return removed;
}
}Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
CurveКонструктор
public Curve();Создаёт пустую кривую с доменом и диапазоном 0…1 и BakeResolution=100.
Свойства8
BakeResolutionСвойство
public int BakeResolution { get; set; }Число отсчётов запечённого кэша, 1…1000, по умолчанию 100. Используйте минимум 2 для переменного значения. Setter помечает кэш устаревшим, но не испускает Changed: для обновления связанной CurveTexture после этой настройки вызовите EmitChanged().
MaxDomainСвойство
public float MaxDomain { get; set; }Верхняя граница X, изначально 1. Setter сохраняет последнюю точку и зазор не меньше 0.01 до MinDomain; не масштабирует точки. Помечает кэш устаревшим и испускает Changed и DomainChanged.
MaxValueСвойство
public float MaxValue { get; set; }Верхняя граница добавляемых Y, изначально 1. Setter сохраняет существующий максимум точек и зазор не меньше 0.01 до MinValue. Касательные могут дать результат выше границы; вызывает RangeChanged без Changed.
MinDomainСвойство
public float MinDomain { get; set; }Нижняя граница X, изначально 0. Setter сохраняет первую точку и зазор не меньше 0.01 до MaxDomain; не переносит точки. Помечает кэш устаревшим и испускает Changed и DomainChanged.
MinValueСвойство
public float MinValue { get; set; }Нижняя граница добавляемых Y, изначально 0. Setter сохраняет существующий минимум точек и зазор не меньше 0.01 до MaxValue. Не ограничивает результат кубической интерполяции; вызывает RangeChanged без Changed.
PointCountСвойство
public int PointCount { get; set; }Число точек, изначально 0. Уменьшение отбрасывает конец массива. Увеличение не распределяет X равномерно: для пустой кривой новые X равны ограниченному доменом нулю, иначе MaxDomain. Для осмысленного распределения добавляйте точки через AddPoint.
_DataСвойство
public Reckfell.Collections.Array _Data { get; set; }Внутреннее свойство сериализации: по пять элементов на точку — Vector2, левая и правая касательные, левый и правый режимы. Getter возвращает отдельный контейнер. Setter не сортирует и не ограничивает позиции; для пользовательского кода используйте методы точек, не редактируйте формат хранения.
_LimitsСвойство
public Reckfell.Collections.Array _Limits { get; set; }Внутреннее свойство сериализации: [MinValue, MaxValue, MinDomain, MaxDomain]. Getter возвращает отдельный контейнер. Setter загрузки обходит публичные ограничения и уведомления; меняйте границы через публичные свойства.
Методы32
AddPointint
public int AddPoint(Vector2 position, float leftTangent = 0f, float rightTangent = 0f, Curve.TangentMode leftMode = Curve.TangentMode.Free, Curve.TangentMode rightMode = Curve.TangentMode.Free);Ограничивает X доменом, Y диапазоном значений и вставляет точку по X. Возвращает её текущий индекс. Нулевые касательные Free по умолчанию дают плавный кубический переход, а не прямую линию; для прямой задайте Linear с обеих сторон.
| Имя | Тип | По умолчанию |
|---|---|---|
position | Vector2 | — |
leftTangent | float | 0f |
rightTangent | float | 0f |
leftMode | Curve.TangentMode | Curve.TangentMode.Free |
rightMode | Curve.TangentMode | Curve.TangentMode.Free |
positionКонечные X и Y; AddPoint ограничивает их текущими границами.
leftTangentНаклон dy/dx левой касательной; по умолчанию 0.
rightTangentНаклон dy/dx правой касательной; по умолчанию 0.
leftModeFree или Linear для левой стороны.
rightModeFree или Linear для правой стороны.
intНовый индекс точки после вставки; другие индексы могут измениться.
Bakevoid
public void Bake();Пересоздаёт равномерный кэш по текущему домену и BakeResolution. SampleBaked также пересоздаёт устаревший кэш при обращении; Sample использует исходную кривую.
CleanDupesvoid
public void CleanDupes();Не используйте в текущей версии: проверка на трёх точках с разными X оставила одну. Нативное сравнение ошибочно удаляет и различные соседние позиции. Дефект движка не исправлен; пример RemoveExactDuplicateOffsets в описании класса удаляет только точно равные X.
ClearPointsvoid
public void ClearPoints();Удаляет все точки. После очистки Sample и SampleBaked возвращают 0.
GetBakeResolutionint
public int GetBakeResolution();Число отсчётов запечённого кэша, 1…1000, по умолчанию 100. Используйте минимум 2 для переменного значения. Setter помечает кэш устаревшим, но не испускает Changed: для обновления связанной CurveTexture после этой настройки вызовите EmitChanged().
intЧисло отсчётов запечённого кэша, 1…1000, по умолчанию 100. Используйте минимум 2 для переменного значения. Setter помечает кэш устаревшим, но не испускает Changed: для обновления связанной CurveTexture после этой настройки вызовите EmitChanged().
GetDomainRangefloat
public float GetDomainRange();Возвращает MaxDomain − MinDomain в единицах координаты X.
floatВозвращает MaxDomain − MinDomain в единицах координаты X.
GetMaxDomainfloat
public float GetMaxDomain();Верхняя граница X, изначально 1. Setter сохраняет последнюю точку и зазор не меньше 0.01 до MinDomain; не масштабирует точки. Помечает кэш устаревшим и испускает Changed и DomainChanged.
floatВерхняя граница X, изначально 1. Setter сохраняет последнюю точку и зазор не меньше 0.01 до MinDomain; не масштабирует точки. Помечает кэш устаревшим и испускает Changed и DomainChanged.
GetMaxValuefloat
public float GetMaxValue();Верхняя граница добавляемых Y, изначально 1. Setter сохраняет существующий максимум точек и зазор не меньше 0.01 до MinValue. Касательные могут дать результат выше границы; вызывает RangeChanged без Changed.
floatВерхняя граница добавляемых Y, изначально 1. Setter сохраняет существующий максимум точек и зазор не меньше 0.01 до MinValue. Касательные могут дать результат выше границы; вызывает RangeChanged без Changed.
GetMinDomainfloat
public float GetMinDomain();Нижняя граница X, изначально 0. Setter сохраняет первую точку и зазор не меньше 0.01 до MaxDomain; не переносит точки. Помечает кэш устаревшим и испускает Changed и DomainChanged.
floatНижняя граница X, изначально 0. Setter сохраняет первую точку и зазор не меньше 0.01 до MaxDomain; не переносит точки. Помечает кэш устаревшим и испускает Changed и DomainChanged.
GetMinValuefloat
public float GetMinValue();Нижняя граница добавляемых Y, изначально 0. Setter сохраняет существующий минимум точек и зазор не меньше 0.01 до MaxValue. Не ограничивает результат кубической интерполяции; вызывает RangeChanged без Changed.
floatНижняя граница добавляемых Y, изначально 0. Setter сохраняет существующий минимум точек и зазор не меньше 0.01 до MaxValue. Не ограничивает результат кубической интерполяции; вызывает RangeChanged без Changed.
GetPointCountint
public int GetPointCount();Число точек, изначально 0. Уменьшение отбрасывает конец массива. Увеличение не распределяет X равномерно: для пустой кривой новые X равны ограниченному доменом нулю, иначе MaxDomain. Для осмысленного распределения добавляйте точки через AddPoint.
intЧисло точек, изначально 0. Уменьшение отбрасывает конец массива. Увеличение не распределяет X равномерно: для пустой кривой новые X равны ограниченному доменом нулю, иначе MaxDomain. Для осмысленного распределения добавляйте точки через AddPoint.
GetPointLeftModeCurve.TangentMode
public Curve.TangentMode GetPointLeftMode(int index);Возвращает режим касательной существующей точки: Free или Linear.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
indexИндекс существующей точки: 0 ≤ index < PointCount.
Curve.TangentModeВозвращает режим касательной существующей точки: Free или Linear.
GetPointLeftTangentfloat
public float GetPointLeftTangent(int index);Возвращает наклон dy/dx касательной существующей точки, не угол в градусах.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
indexИндекс существующей точки: 0 ≤ index < PointCount.
floatВозвращает наклон dy/dx касательной существующей точки, не угол в градусах.
GetPointPositionVector2
public Vector2 GetPointPosition(int index);Возвращает (X, Y) существующей точки. Индексы могут измениться после вставки, удаления и SetPointOffset.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
indexИндекс существующей точки: 0 ≤ index < PointCount.
Vector2Возвращает (X, Y) существующей точки. Индексы могут измениться после вставки, удаления и SetPointOffset.
GetPointRightModeCurve.TangentMode
public Curve.TangentMode GetPointRightMode(int index);Возвращает режим касательной существующей точки: Free или Linear.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
indexИндекс существующей точки: 0 ≤ index < PointCount.
Curve.TangentModeВозвращает режим касательной существующей точки: Free или Linear.
GetPointRightTangentfloat
public float GetPointRightTangent(int index);Возвращает наклон dy/dx касательной существующей точки, не угол в градусах.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
indexИндекс существующей точки: 0 ≤ index < PointCount.
floatВозвращает наклон dy/dx касательной существующей точки, не угол в градусах.
GetValueRangefloat
public float GetValueRange();Возвращает MaxValue − MinValue; это не фактическая амплитуда интерполированной кривой.
floatВозвращает MaxValue − MinValue; это не фактическая амплитуда интерполированной кривой.
RemovePointvoid
public void RemovePoint(int index);Удаляет существующую точку по индексу и обновляет соседние автоматические касательные. Допускает удаление последней точки.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
indexИндекс существующей точки: 0 ≤ index < PointCount.
Samplefloat
public float Sample(float offset);Вычисляет кубическую кривую в конечной координате домена, не обязательно 0…1. До первой и после последней точки возвращает крайний Y; пустая кривая даёт 0, одна точка — постоянный Y. Касательные могут вывести результат за MinValue/MaxValue.
| Имя | Тип | По умолчанию |
|---|---|---|
offset | float | — |
offsetКонечная координата X в единицах домена.
floatВычисляет кубическую кривую в конечной координате домена, не обязательно 0…1. До первой и после последней точки возвращает крайний Y; пустая кривая даёт 0, одна точка — постоянный Y. Касательные могут вывести результат за MinValue/MaxValue.
SampleBakedfloat
public float SampleBaked(float offset);При необходимости запекает кэш и линейно интерполирует его отсчёты в координатах домена. Это приближение Sample. При BakeResolution=1 весь кэш равен последнему Y; используйте минимум 2 для переменной кривой.
| Имя | Тип | По умолчанию |
|---|---|---|
offset | float | — |
offsetКонечная координата X в единицах домена.
floatПри необходимости запекает кэш и линейно интерполирует его отсчёты в координатах домена. Это приближение Sample. При BakeResolution=1 весь кэш равен последнему Y; используйте минимум 2 для переменной кривой.
SetBakeResolutionvoid
public void SetBakeResolution(int resolution);Число отсчётов запечённого кэша, 1…1000, по умолчанию 100. Используйте минимум 2 для переменного значения. Setter помечает кэш устаревшим, но не испускает Changed: для обновления связанной CurveTexture после этой настройки вызовите EmitChanged().
| Имя | Тип | По умолчанию |
|---|---|---|
resolution | int | — |
resolutionЧисло отсчётов 1…1000; для переменной кривой минимум 2.
SetMaxDomainvoid
public void SetMaxDomain(float max);Верхняя граница X, изначально 1. Setter сохраняет последнюю точку и зазор не меньше 0.01 до MinDomain; не масштабирует точки. Помечает кэш устаревшим и испускает Changed и DomainChanged.
| Имя | Тип | По умолчанию |
|---|---|---|
max | float | — |
maxЗапрошенная конечная верхняя граница; setter сохраняет существующие точки и минимальный зазор.
SetMaxValuevoid
public void SetMaxValue(float max);Верхняя граница добавляемых Y, изначально 1. Setter сохраняет существующий максимум точек и зазор не меньше 0.01 до MinValue. Касательные могут дать результат выше границы; вызывает RangeChanged без Changed.
| Имя | Тип | По умолчанию |
|---|---|---|
max | float | — |
maxЗапрошенная конечная верхняя граница; setter сохраняет существующие точки и минимальный зазор.
SetMinDomainvoid
public void SetMinDomain(float min);Нижняя граница X, изначально 0. Setter сохраняет первую точку и зазор не меньше 0.01 до MaxDomain; не переносит точки. Помечает кэш устаревшим и испускает Changed и DomainChanged.
| Имя | Тип | По умолчанию |
|---|---|---|
min | float | — |
minЗапрошенная конечная нижняя граница; setter сохраняет существующие точки и минимальный зазор.
SetMinValuevoid
public void SetMinValue(float min);Нижняя граница добавляемых Y, изначально 0. Setter сохраняет существующий минимум точек и зазор не меньше 0.01 до MaxValue. Не ограничивает результат кубической интерполяции; вызывает RangeChanged без Changed.
| Имя | Тип | По умолчанию |
|---|---|---|
min | float | — |
minЗапрошенная конечная нижняя граница; setter сохраняет существующие точки и минимальный зазор.
SetPointCountvoid
public void SetPointCount(int count);Число точек, изначально 0. Уменьшение отбрасывает конец массива. Увеличение не распределяет X равномерно: для пустой кривой новые X равны ограниченному доменом нулю, иначе MaxDomain. Для осмысленного распределения добавляйте точки через AddPoint.
| Имя | Тип | По умолчанию |
|---|---|---|
count | int | — |
countНовое неотрицательное число точек; рост не распределяет X равномерно.
SetPointLeftModevoid
public void SetPointLeftMode(int index, Curve.TangentMode mode);Меняет левую касательную: Free использует заданный наклон, Linear вычисляет наклон по соседней точке. ModeCount — служебное значение, не режим.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
mode | Curve.TangentMode | — |
indexИндекс существующей точки: 0 ≤ index < PointCount.
modeFree или Linear; не ModeCount.
SetPointLeftTangentvoid
public void SetPointLeftTangent(int index, float tangent);Задаёт левую касательную как dy/dx и переводит её в Free. Большой наклон может вызвать выход Y за диапазон значений.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
tangent | float | — |
indexИндекс существующей точки: 0 ≤ index < PointCount.
tangentКонечный наклон dy/dx, не угол.
SetPointOffsetint
public int SetPointOffset(int index, float offset);Перевставляет точку с новым X, ограничивает X доменом и также повторно ограничивает её Y диапазоном значений. Возвращает новый индекс; прежний индекс нельзя считать постоянным идентификатором.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
offset | float | — |
indexИндекс существующей точки: 0 ≤ index < PointCount.
offsetКонечная координата X в единицах домена.
intНовый индекс точки после вставки; другие индексы могут измениться.
SetPointRightModevoid
public void SetPointRightMode(int index, Curve.TangentMode mode);Меняет правую касательную: Free использует заданный наклон, Linear вычисляет наклон по соседней точке. ModeCount — служебное значение, не режим.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
mode | Curve.TangentMode | — |
indexИндекс существующей точки: 0 ≤ index < PointCount.
modeFree или Linear; не ModeCount.
SetPointRightTangentvoid
public void SetPointRightTangent(int index, float tangent);Задаёт правую касательную как dy/dx и переводит её в Free. Большой наклон может вызвать выход Y за диапазон значений.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
tangent | float | — |
indexИндекс существующей точки: 0 ≤ index < PointCount.
tangentКонечный наклон dy/dx, не угол.
SetPointValuevoid
public void SetPointValue(int index, float y);Заменяет Y существующей точки без ограничения MinValue/MaxValue и обновляет автоматические касательные. Последующая перевставка через SetPointOffset снова ограничит Y.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
y | float | — |
indexИндекс существующей точки: 0 ≤ index < PointCount.
yКонечное значение Y; этим setter не ограничивается диапазоном.
Сигналы и события2
DomainChangedСобытие
public event Action DomainChanged;Уведомление из setter границ домена; сопровождается Changed и обновлением кэша при следующей выборке. Не означает, что точки были перемещены.
RangeChangedСобытие
public event Action RangeChanged;Уведомление из setter границ значений. Само по себе не испускает Changed и не обновляет связанные текстуры.
Curve.TangentMode
| Значение | Описание |
|---|---|
Free = 0 | Касательная по эту сторону точки определяется пользователем. |
Linear = 1 | Кривая вычисляет касательную по эту сторону от точки как наклон на полпути к соседней точке. |
ModeCount = 2 | Общее количество доступных касательных мод. |