diff --git a/InstallerSamples/WhatsNew/3_11_1/Lerp_Remap.pas b/InstallerSamples/WhatsNew/3_11_1/Lerp_Remap.pas new file mode 100644 index 000000000..d8131695e --- /dev/null +++ b/InstallerSamples/WhatsNew/3_11_1/Lerp_Remap.pas @@ -0,0 +1,13 @@ +begin + // Примеры использования Lerp: + var x := Lerp(10, 20, 0.5); // x = 15 (середина между 10 и 20) + var y := Lerp(0, 100, 0.25); // y = 25 (четверть пути от 0 до 100) + var z := Lerp(5, 15, 0.0); // z = 5 (начало отрезка) + Println(x,y,z); + + // Примеры использования Remap: + var a := Remap(0.5, 0, 1, 0, 100); // a = 50 (0.5 → 50%) + var b := Remap(75, 0, 100, 0, 1); // b = 0.75 (75% → 0.75) + var c := Remap(15, 10, 20, 0, 200); // c = 100 (15 посередине между 10 и 20 → 100 посередине между 0 и 200) + Println(a,b,c); +end. \ No newline at end of file diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index dfee62427..c5797d916 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -1896,6 +1896,11 @@ function DegToRad(x: real): real; function Atan2(y, x: real): real; /// Возвращает гипотенузу треугольника с катетами x,y function Hypot(x, y: real): real; +/// Возвращает значение на отрезке [a, b] в позиции t ∈ [0, 1] +///При t=0 — a, при t=1 — b, при t=0.5 — середина между ними +function Lerp(a, b, t: real): real; +/// Преобразует x из диапазона [a1,b1] в диапазон [a2,b2] с сохранением относительной позиции +function Remap(x, a1, b1, a2, b2: real): real; /// Инициализирует датчик псевдослучайных чисел procedure Randomize; @@ -1911,7 +1916,7 @@ function Random(maxValue: real): real; function Random(a, b: integer): integer; /// Возвращает случайное вещественное в диапазоне [a,b) function Random(a, b: real): real; -/// Возвращает случайное вещественное в диапазоне [a,b] c количеством значащих цифр после точки, равным digits +/// Возвращает случайное вещественное в диапазоне [a,b], округленное до digits знаков после десятичной точки function RandomReal(a, b: real; digits: integer := 2): real; /// Возвращает случайный символ в диапазоне от a до b function Random(a, b: char): char; @@ -2066,8 +2071,6 @@ function Sqrt(c: Complex): Complex; function Abs(c: Complex): real; /// Возвращает комплексно сопряженное число function Conjugate(c: Complex): Complex; -/// Возвращает косинус комплексного числа -function Cos(c: Complex): Complex; /// Возвращает экспоненту комплексного числа function Exp(c: Complex): Complex; /// Возвращает натуральный логарифм комплексного числа @@ -2080,6 +2083,8 @@ function Log10(c: Complex): Complex; function Power(c, power: Complex): Complex; /// Возвращает синус комплексного числа function Sin(c: Complex): Complex; +/// Возвращает косинус комплексного числа +function Cos(c: Complex): Complex; // ----------------------------------------------------- //>> Подпрограммы для работы со стандартными множествами # Subroutines for set of T @@ -2402,10 +2407,11 @@ function Pred(x: boolean): boolean; function InRange(val, a, b: T): boolean; where T: IComparable; /// Возвращает True, если значение val находится между a и b независимо от порядка a и b function Between(val, a, b: T; inclusive: boolean := true): boolean; where T: IComparable; -/// Возвращает значение, ограниченное диапазоном от bottom до top включительно +/// Ограничивает значение x диапазоном [bottom, top] function Clamp(x,bottom,top: T): T; where T: IComparable; -/// Меняет местами значения двух переменных +/// Обменивает местами значения двух переменных procedure Swap(var a, b: T); + /// Возвращает True, если достигнут конец строки function Eoln: boolean; /// Возвращает True, если достигнут конец потока ввода @@ -2414,7 +2420,7 @@ function Eof: boolean; function SeekEof: boolean; /// Пропускает пробельные символы, после чего возвращает True, если достигнут конец строки function SeekEoln: boolean; -/// Возвращает аргумены командой строки, с которыми была запущена программа +/// Возвращает список аргументов командой строки, с которыми была запущена программа function CommandLineArgs: array of string; /// Преобразует объект в строковое представление @@ -2427,35 +2433,35 @@ function ObjectToString(obj: object): string; /// Возвращает 0 function Low(i: System.Array): integer; ///- function High(a: array of T): integer; -/// Возвращает верхнюю границу динамического массива +/// Возвращает верхнюю границу массива function High(i: System.Array): integer; ///- function Length(a: array of T): integer; -/// Возвращает длину динамического массива +/// Возвращает длину массива function Length(a: System.Array): integer; ///- function Length(a: array of T; dim: integer): integer; -/// Возвращает длину динамического массива по размерности dim +/// Возвращает длину массива по размерности dim function Length(a: System.Array; dim: integer): integer; ///- procedure SetLength(var a: array of T; n: integer); -/// Устанавливает длину одномерного динамического массива. Старое содержимое сохраняется +/// Устанавливает длину одномерного массива. Старое содержимое сохраняется //procedure SetLength(var a: array of T; n: integer); ///- procedure SetLength(var a: array [,...,] of T; n1,n2,...: integer); -/// Устанавливает размеры n-мерного динамического массива. Старое содержимое сохраняется +/// Устанавливает размеры n-мерного массива. Старое содержимое сохраняется //procedure SetLength(var a: array[,...,] of T; n: integer); ///- function Copy(a: array of T): array of T; -/// Создаёт копию динамического массива +/// Создаёт копию массива function Copy(a: System.Array): System.Array; -/// Сортирует динамический массив по возрастанию +/// Сортирует массив по возрастанию procedure Sort(a: array of T); -/// Сортирует динамический массив по возрастанию +/// Сортирует массив по возрастанию procedure Sort(a: array of string); -/// Сортирует динамический массив по критерию сортировки, задаваемому функцией сравнения cmp +/// Сортирует массив по критерию сортировки, задаваемому функцией сравнения cmp procedure Sort(a: array of T; cmp: (T,T)->integer); -/// Сортирует динамический массив по критерию сортировки, задаваемому функцией сравнения less +/// Сортирует массив по критерию сортировки, задаваемому функцией сравнения less procedure Sort(a: array of T; less: (T,T)->boolean); -/// Сортирует динамический массив по ключу +/// Сортирует массив по ключу procedure Sort(a: array of T; keySelector: T->TKey); -/// Сортирует динамический массив по ключу +/// Сортирует массив по ключу procedure Sort(a: array of T; keySelector: T->string); /// Сортирует список по возрастанию @@ -2471,13 +2477,13 @@ procedure Sort(var l: List; keySelector: T->T1); /// Сортирует список по возрастанию по ключу procedure Sort(var l: List; keySelector: T->string); -/// Сортирует динамический массив по убыванию +/// Сортирует массив по убыванию procedure SortDescending(a: array of T); -/// Сортирует динамический массив по убыванию +/// Сортирует массив по убыванию procedure SortDescending(a: array of string); -/// Сортирует динамический массив по убыванию по ключу +/// Сортирует массив по убыванию по ключу procedure SortDescending(var a: array of T; keySelector: T->T1); -/// Сортирует динамический массив по убыванию по ключу +/// Сортирует массив по убыванию по ключу procedure SortDescending(var a: array of T; keySelector: T->string); /// Сортирует список по убыванию procedure SortDescending(l: List); @@ -2487,9 +2493,9 @@ procedure SortDescending(var l: List); procedure SortDescending(var l: List; keySelector: T->T1); /// Сортирует список по убыванию по ключу procedure SortDescending(var l: List; keySelector: T->string); -/// Изменяет порядок элементов в динамическом массиве на противоположный +/// Изменяет порядок элементов в массиве на противоположный procedure Reverse(a: array of T); -/// Изменяет порядок элементов на противоположный в диапазоне динамического массива длины count, начиная с индекса index +/// Изменяет порядок элементов на противоположный в диапазоне массива длины count, начиная с индекса index procedure Reverse(a: array of T; index, count: integer); /// Изменяет порядок элементов в списке на противоположный procedure Reverse(a: List); @@ -2499,17 +2505,18 @@ procedure Reverse(a: List; index, count: integer); procedure Reverse(var s: string); /// Изменяет порядок символов в части строки длины count на противоположный, начиная с индекса index procedure Reverse(var s: string; index, count: integer); -/// Перемешивает динамический массив случайным образом +/// Случайно перемешивает элементы массива procedure Shuffle(a: array of T); -/// Возвращает, совпадают ли массивы -function ArrEqual(a, b: array of T): boolean; - -/// Сравнивает матрицы на равенство -function MatrEqual(a, b: array [,] of T): boolean; -/// Перемешивает список случайным образом +/// Случайно перемешивает элементы списка procedure Shuffle(l: List); -/// Возвращает следующую перестановку в массиве +/// Проверяет равенство двух массивов +function ArrEqual(a, b: array of T): boolean; +/// Проверяет равенство двух матриц +function MatrEqual(a, b: array [,] of T): boolean; + + +/// Возвращает следующую перестановку в массиве; возвращает False, если это последняя function NextPermutation(a: array of integer): boolean; @@ -2532,7 +2539,9 @@ function Range(c1, c2: char; step: integer): sequence of char; function Range(a, b, step: real): sequence of real; /// Возвращает последовательность вещественных в точках разбиения отрезка [a,b] на n равных частей function PartitionPoints(a, b: real; n: integer): sequence of real; -/// Возвращает последовательность указанных элементов +/// Возвращает n равномерно распределённых точек между a и b включительно (аналог numpy.linspace) +function Linspace(a, b: real; n: integer): sequence of real; +/// Возвращает последовательность из указанных элементов function Seq(params a: array of T): sequence of T; /// Возвращает последовательность из n случайных целых элементов function SeqRandom(n: integer := 10; a: integer := 0; b: integer := 100): sequence of integer; @@ -2576,21 +2585,21 @@ function Zip(a: sequence of T; b: sequence of T1; c: sequen /// Применяет указанную функцию к соответствующим элементам кортежей, возвращает последовательность результатов function Zip(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4; fun: (T,T1,T2,T3,T4) -> TRes): sequence of TRes; -/// Возвращает декартово произведение последовательностей, проектируя каждую пару на значение +/// Возвращает все комбинации элементов двух последовательностей, проектируя каждую пару на значение function Cartesian(a: sequence of T; b: sequence of T1; func: (T,T1)->TRes): sequence of TRes; -/// Возвращает декартово произведение последовательностей, проектируя каждую тройку на значение +/// Возвращает все комбинации элементов последовательностей, проектируя каждую тройку на значение function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; func: (T,T1,T2)->TRes): sequence of TRes; -/// Возвращает декартово произведение последовательностей, проектируя каждую четвёрку на значение +/// Возвращает все комбинации элементов последовательностей, проектируя каждую четвёрку на значение function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; func: (T,T1,T2,T3)->TRes): sequence of TRes; -/// Возвращает декартово произведение последовательностей, проектируя каждую пятёрку на значение +/// Возвращает все комбинации элементов последовательностей, проектируя каждую пятёрку на значение function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4; func: (T,T1,T2,T3,T4)->TRes): sequence of TRes; -/// Возвращает декартово произведение последовательностей в виде последовательности пар +/// Возвращает все комбинации элементов последовательностей в виде последовательности пар function Cartesian(a: sequence of T; b: sequence of T1): sequence of (T, T1); -/// Возвращает декартово произведение последовательностей в виде последовательности троек +/// Возвращает все комбинации элементов последовательностей в виде последовательности троек function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2): sequence of (T, T1, T2); -/// Возвращает декартово произведение последовательностей в виде последовательности четвёрок +/// Возвращает все комбинации элементов последовательностей в виде последовательности четвёрок function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3): sequence of (T, T1, T2, T3); -/// Возвращает декартово произведение последовательностей в виде последовательности пятёрок +/// Возвращает все комбинации элементов последовательностей в виде последовательности пятёрок function Cartesian(a: sequence of T; b: sequence of T1; c: sequence of T2; d: sequence of T3; e: sequence of T4): sequence of (T, T1, T2, T3, T4); @@ -2623,11 +2632,11 @@ function ReadSeqRealWhile(prompt: string; cond: real->boolean): sequence of real function ReadSeqStringWhile(prompt: string; cond: string->boolean): sequence of string; // ----------------------------------------------------- -//>> Подпрограммы для создания динамических массивов # Subroutines for array of T generation +//>> Подпрограммы для создания одномерных массивов # Subroutines for array of T generation // ----------------------------------------------------- /// Возвращает массив, заполненный указанными значениями function Arr(params a: array of T): array of T; -/// Возвращает массив, заполненный значениями из последовательнсти +/// Возвращает массив, заполненный значениями из последовательности function Arr(a: sequence of T): array of T; /// Возвращает массив, заполненный диапазоном значений function Arr(a: IntRange): array of integer; @@ -2687,7 +2696,7 @@ function ReadArrString(prompt: string; n: integer): array of string; // ----------------------------------------------------- -//>> Подпрограммы для создания двумерных динамических массивов # Subroutines for matrixes +//>> Подпрограммы для создания двумерных массивов # Subroutines for matrixes // ----------------------------------------------------- /// Возвращает двумерный массив размера m x n, заполненный указанными значениями по строкам function Matr(m,n: integer; params data: array of T): array [,] of T; @@ -2712,9 +2721,9 @@ function MatrByCol(a: sequence of sequence of T): array [,] of T; /// Генерирует двумерный массив по столбцам из последовательности function MatrByCol(m,n: integer; a: sequence of T): array [,] of T; -/// Возвращает матрицу m на n целых, введенных с клавиатуры +/// Возвращает двумерный массив размера m x n из целых, введенных с клавиатуры function ReadMatrInteger(m, n: integer): array [,] of integer; -/// Возвращает матрицу m на n вещественных, введенных с клавиатуры +/// Возвращает двумерный массив размера m x n из вещественных, введенных с клавиатуры function ReadMatrReal(m, n: integer): array [,] of real; /// Возвращает двумерный массив размера m x n, заполненный случайными целыми значениями function MatrRandom(m: integer := 5; n: integer := 5; a: integer := 0; b: integer := 100): array [,] of integer; @@ -2796,25 +2805,25 @@ function SSetInt(params a: array of integer): SortedSet; function SSetStr(params a: array of string): SortedSet; -/// Возвращает словарь пар элементов (ключ, значение) +/// Возвращает словарь из набора пар элементов (ключ, значение) function Dict(params pairs: array of KeyValuePair): Dictionary; -/// Возвращает словарь пар элементов (ключ, значение) +/// Возвращает словарь из набора пар элементов (ключ, значение), заданных как кортежи function Dict(params pairs: array of (TKey, TVal)): Dictionary; -/// Возвращает словарь пар элементов (ключ, значение), построенный по последовательности пар +/// Возвращает словарь из последовательности пар элементов (ключ, значение) function Dict(pairs: sequence of KeyValuePair): Dictionary; -/// Возвращает словарь пар элементов (ключ, значение), построенный по последовательности пар +/// Возвращает словарь из последовательности пар элементов (ключ, значение), заданных как кортежи function Dict(pairs: sequence of (TKey, TVal)): Dictionary; -/// Возвращает словарь пар элементов (ключ, значение), построенный по последовательностям ключей и значений +/// Возвращает словарь словарь из двух последовательностей — ключей и значений function Dict(keys: sequence of TKey; values: sequence of TVal): Dictionary; /// Возвращает пару элементов (ключ, значение) function KV(key: TKey; value: TVal): KeyValuePair; /// Возвращает пару элементов (ключ, значение) function Pair(key: TKey; value: TVal): KeyValuePair; -/// Возвращает словарь пар элементов (строка, строка) +/// Возвращает словарь из набора пар элементов (строка, строка) function DictStr(params pairs: array of (string, string)): Dictionary; -/// Возвращает словарь пар элементов (строка, целое) +/// Возвращает словарь из набора пар элементов (строка, целое) function DictStrInt(params pairs: array of (string, integer)): Dictionary; -/// Возвращает словарь пар элементов (целое, целое) +/// Возвращает словарь из набора пар элементов (целое, целое) function DictInt(params pairs: array of (integer, integer)): Dictionary; @@ -3268,10 +3277,10 @@ const COUNT_PARAMS_MINFUN_MUSTBE_GREATER0 = 'Количество параметров функции Min должно быть > 1!!Min function must have more than one parameter'; Format_InvalidString = 'Входная строка имела неверный формат!!Input string was not in a valid format'; Overflow_Int32 = 'Целочисленное переполнение!!Integer overflow'; - FOR_STEP_CANNOT_BE_EQUAL0 = 'Шаг цикла for не может быт равен 0!!The step of a for loop cannot be 0'; + FOR_STEP_CANNOT_BE_EQUAL0 = 'Шаг цикла for не может быть равен 0!!The step of a for loop cannot be 0'; SEQUENCE_CANNOT_BE_EMPTY = 'Последовательность не может быть пустой!!Sequence cannot be empty'; ARRAY_CANNOT_BE_EMPTY = 'Массив не может быть пустым!!Array cannot be empty'; - MIN_CANNOT_BE_GREATER_THAN_MAX = 'CLamp: min не может быть больше чем max!!CLamp: min cannot be greater than max'; + MIN_CANNOT_BE_GREATER_THAN_MAX = 'Clamp: min не может быть больше чем max!!Clamp: min cannot be greater than max'; // ----------------------------------------------------- // WINAPI // ----------------------------------------------------- @@ -3854,17 +3863,6 @@ begin Result := ts; end; -///-- -{class function TypedSet.operator implicit(s: array of T): TypedSet; -begin - var ts := new TypedSet(); - foreach key: T in s do - begin - ts.ht[key] := key; - end; - Result := ts; -end;} - ///-- function TypedSet.ToString: string; var @@ -3922,13 +3920,6 @@ begin result := '[' + result + ']'; end; -{class function TypedSet.operator implicit(hset: HashSet): TypedSet; -begin - Result := new TypedSet(); - foreach var x in hset do - Result.ht[x] := x; -end;} - ///-- function TypedSet.CompareEquals(s: TypedSet): boolean; begin @@ -4121,15 +4112,7 @@ end; [System.Diagnostics.DebuggerStepThrough] function InSet(obj: object; s: TypedSet): boolean; begin - {if obj.GetType().IsEnum then - Result := s.ht[obj] <> nil - else} Result := (obj <> nil) and s.Contains(obj); - {Result := (obj <> nil) and (s.ht[obj] <> nil); - if not Result and (obj is TypedSet) then - Result := s.Contains(obj as TypedSet);} - //if Result = true then - // Result := s.IsInDiapason(obj); end; [System.Diagnostics.DebuggerStepThrough] @@ -5525,6 +5508,9 @@ begin end; end; +function Linspace(a, b: real; n: integer): sequence of real := PartitionPoints(a, b, n - 1); + + function Range(c1, c2: char): sequence of char; begin Result := Range(integer(c1), integer(c2)).Select(x -> Chr(x)); @@ -9535,6 +9521,10 @@ begin else Result := 0; end; +function Lerp(a, b, t: real): real := a + (b - a) * t; + +function Remap(x, a1, b1, a2, b2: real): real := a2 + (x - a1) * (b2 - a2) / (b1 - a1); + procedure Randomize; begin