diff --git a/!MainFeatures/01_First/Amp.pas b/!MainFeatures/01_First/Amp.pas new file mode 100644 index 0000000..5cec0dd --- /dev/null +++ b/!MainFeatures/01_First/Amp.pas @@ -0,0 +1,11 @@ +// Пример иллюстрирует использование знака "&" для снятия атрибута ключевого слова + +var + &begin,&end: integer; + +begin + &begin := 1; + &end := 2; + var t: System.Type := &begin.GetType; // в System.Type использовать & не надо + write(&begin,' ',&end,' ',t); +end. \ No newline at end of file diff --git a/!MainFeatures/01_First/Amp2.pas b/!MainFeatures/01_First/Amp2.pas new file mode 100644 index 0000000..7f63a7d --- /dev/null +++ b/!MainFeatures/01_First/Amp2.pas @@ -0,0 +1,29 @@ +// Пример иллюстрирует использование знака "&" для явного указания шаблонного типа подпрограммы + +function GetDefault: T := +default(T); + +type + GenericType = class + constructor := exit; + static procedure p1 := writeln(typeof(T)); + end; + +begin + +// var o := GetDefault; //Ошибка: Встречено ';', а ожидалось выражение + // компилятор не отличает знак сравнения < от открытия угловой скобки + // и поэтому видит эту строчку как "(GetDefault < byte) > ;" + // ";" там оказывается неожиданно, потому что компилятор ожидал ещё какое то выражение для сравнения + + // но, знаком "&" можно экранировать "<" + // то есть переключить значение "<" со знака сравнения на открывающуюся скобочку: + var o := GetDefault&; + + // в случае с шаблонными типами - обычно "&" не нужен + var a := new GenericType; + + // однако для вызова статичного метода - его так же надо поставить + GenericType&.p1; + +end. \ No newline at end of file diff --git a/!MainFeatures/01_First/AssignExt.pas b/!MainFeatures/01_First/AssignExt.pas new file mode 100644 index 0000000..3ba2187 --- /dev/null +++ b/!MainFeatures/01_First/AssignExt.pas @@ -0,0 +1,18 @@ +// Присваивания += -= *= /= +var + i: integer; + r: real; + +begin + i := 1; + writeln('i := 1; i = ',i); + i += 2; // Увеличение на 2 + writeln('i += 2; i = ',i); + i *= 3; // Умножение на 3 + writeln('i *= 3; i = ',i); + writeln; + r := 6; + writeln('r := 6; r = ',r); + r /= 2; + writeln('r /= 2; r = ',r); +end. \ No newline at end of file diff --git a/!MainFeatures/01_First/AutoVars.pas b/!MainFeatures/01_First/AutoVars.pas new file mode 100644 index 0000000..25797a7 --- /dev/null +++ b/!MainFeatures/01_First/AutoVars.pas @@ -0,0 +1,10 @@ +// Автоопределение типа переменной +// Описание переменной в заголовке цикла for +begin + var x := 2; + for var i:=1 to 10 do + begin + write(x,' '); + x += 2; + end; +end. \ No newline at end of file diff --git a/!MainFeatures/01_First/BlockVar.pas b/!MainFeatures/01_First/BlockVar.pas new file mode 100644 index 0000000..d1257db --- /dev/null +++ b/!MainFeatures/01_First/BlockVar.pas @@ -0,0 +1,11 @@ +// Перемена местами значений двух переменных с использованием третьей +var x,y: real; + +begin + write('Введите x,y: '); + readln(x,y); + var v: real := x; // вспомогательная переменная + x := y; + y := v; + writeln('Новые значения x,y: ',x,' ',y); +end. \ No newline at end of file diff --git a/!MainFeatures/01_First/Foreach.pas b/!MainFeatures/01_First/Foreach.pas new file mode 100644 index 0000000..2f2f811 --- /dev/null +++ b/!MainFeatures/01_First/Foreach.pas @@ -0,0 +1,24 @@ +// Пример иллюстрирует возможности оператора foreach +var + a: array [1..5] of integer := (1,3,5,7,9); + s: set of integer; + l: List; + +begin + write('foreach по обычному массиву: ':35); + foreach x: integer in a do + Print(x); + writeln; + + s := [2..5,10..14]; + write('foreach по множеству: ':35); + foreach var x in s do + Print(x); + writeln; + + l := new List; + l.Add(7); l.Add(2); l.Add(5); + write('foreach по динамическому массиву: ':35); + foreach var x in l do + Print(x); +end. \ No newline at end of file diff --git a/!MainFeatures/01_First/Print.pas b/!MainFeatures/01_First/Print.pas new file mode 100644 index 0000000..3d61f65 --- /dev/null +++ b/!MainFeatures/01_First/Print.pas @@ -0,0 +1,4 @@ +/// Вывод с помощью Print +begin + Print(1,2,3) +end. \ No newline at end of file diff --git a/!MainFeatures/01_First/RandomDiap.pas b/!MainFeatures/01_First/RandomDiap.pas new file mode 100644 index 0000000..7bea343 --- /dev/null +++ b/!MainFeatures/01_First/RandomDiap.pas @@ -0,0 +1,5 @@ +// Генерация случайного числа в заданном диапазоне +begin + var i := Random(2,5); + writeln('Случайное целое в диапазоне 2..5: ',i); +end. \ No newline at end of file diff --git a/!MainFeatures/01_First/RealExtNums.pas b/!MainFeatures/01_First/RealExtNums.pas new file mode 100644 index 0000000..5e099f6 --- /dev/null +++ b/!MainFeatures/01_First/RealExtNums.pas @@ -0,0 +1,5 @@ +// При работе с вещественными числами невозможно получить ошибку выполнения +begin + writeln(1/0); + writeln(sqrt(-1)); +end. \ No newline at end of file diff --git a/!MainFeatures/01_First/SimpleNewFeatures.pas b/!MainFeatures/01_First/SimpleNewFeatures.pas new file mode 100644 index 0000000..60cef0d --- /dev/null +++ b/!MainFeatures/01_First/SimpleNewFeatures.pas @@ -0,0 +1,27 @@ +// Простейшие новые возможности языка PascalABC.NET + +// Инициализация переменной при описании +var i: integer := 1; + +// Автоопределение типа переменной при инициализации +var r := 2.5; + +begin + // Внутриблочные описания переменных + var s: real := 1.0; + + // Описание переменной в заголовке цикла (время жизни переменной - до конца тела цикла) + for j: integer := 1 to 10 do + s += j; // Операция += для чисел + + var p := 1; + + // Описание переменной в заголовке цикла с автоопределением типа + for var j := 1 to 10 do + p *= j; // Операция *= + + var str := ''; + for c: char := 'a' to 'z' do + str += c; // Операция += для строк + +end. \ No newline at end of file diff --git a/!MainFeatures/01_First/StandardTypes.pas b/!MainFeatures/01_First/StandardTypes.pas new file mode 100644 index 0000000..6eb0c2b --- /dev/null +++ b/!MainFeatures/01_First/StandardTypes.pas @@ -0,0 +1,33 @@ +/// Стандартные размерные типы данных и их размер +var + i: integer; + j: shortint; + k: smallint; + l: longint; // синоним integer + i64: int64; + b: byte; + w: word; + lw: longword; + car: cardinal; // синоним longword + ui64: uint64; + r: real; + d: double; // синоним real + sn: single; + c: char; + +begin + writeln('sizeof(integer) = ':20, sizeof(integer)); + writeln('sizeof(shortint) = ':20,sizeof(shortint)); + writeln('sizeof(smallint) = ':20,sizeof(smallint)); + writeln('sizeof(longint) = ':20, sizeof(longint)); + writeln('sizeof(int64) = ':20, sizeof(int64)); + writeln('sizeof(byte) = ':20, sizeof(byte)); + writeln('sizeof(word) = ':20, sizeof(word)); + writeln('sizeof(longword) = ':20,sizeof(longword)); + writeln('sizeof(cardinal) = ':20,sizeof(cardinal)); + writeln('sizeof(uint64) = ':20, sizeof(uint64)); + writeln('sizeof(real) = ':20, sizeof(real)); + writeln('sizeof(double) = ':20, sizeof(double)); + writeln('sizeof(single) = ':20, sizeof(single)); + writeln('sizeof(char) = ':20, sizeof(char)); +end. \ No newline at end of file diff --git a/!MainFeatures/01_First/WriteAll.pas b/!MainFeatures/01_First/WriteAll.pas new file mode 100644 index 0000000..c0a6160 --- /dev/null +++ b/!MainFeatures/01_First/WriteAll.pas @@ -0,0 +1,16 @@ +/// Вывод различных типов процедурой write +begin + // Вывод, целого, строки, вещественного + Writeln(1,' ',2.5); + // Вывод множества + Writeln([1..10]); + // Вывод логического + Writeln(True); + var a: array [1..10] of integer; + // Вывод статического массива + Writeln(a); + // Вывод динамического массива + Writeln(Arr(2,3,5)); + // Вывод кортежа + Writeln(('Иванов',16)); +end. \ No newline at end of file diff --git a/!MainFeatures/01_First/WriteFormat.pas b/!MainFeatures/01_First/WriteFormat.pas new file mode 100644 index 0000000..a6ea0c1 --- /dev/null +++ b/!MainFeatures/01_First/WriteFormat.pas @@ -0,0 +1,11 @@ +/// Использование процедуры WritelnFormat +begin + // Вывод в обратном порядке + WritelnFormat('{2},{1},{0}',1,2,3); + // Вывод фигурных скобочек + WritelnFormat('{{}}{0}','Вывод фигурных скобочек в форматной строке'); + // Задание ширины поля вывода + WritelnFormat('{0,10:f}',3.1415); + // Задание количества знаков после запятой для вещественного числа + WritelnFormat('{0:f3}',3.1415); +end. \ No newline at end of file diff --git a/!MainFeatures/02_Types/CharFunc.pas b/!MainFeatures/02_Types/CharFunc.pas new file mode 100644 index 0000000..2c214d8 --- /dev/null +++ b/!MainFeatures/02_Types/CharFunc.pas @@ -0,0 +1,19 @@ +// Стандартные функции Ord, Chr, OrdAnsi, ChrAnsi +var + c: char; + i: integer; + +begin + writeln('sizeof(char) = ',sizeof(char)); + writeln; + c := 'Ж'; + i := Ord(c); + writelnFormat('Код символа {0} в кодировке Unicode равен {1}',c,i); + c := Chr(i); + writelnFormat('Символ с кодом {0} в кодировке Unicode - это {1}',i,c); + writeln; + i := OrdAnsi(c); + writelnFormat('Код символа {0} в кодировке Windows равен {1}',c,i); + c := ChrAnsi(i); + writelnFormat('Символ с кодом {0} в кодировке Windows - это {1}',i,c); +end. \ No newline at end of file diff --git a/!MainFeatures/02_Types/Dynarray.pas b/!MainFeatures/02_Types/Dynarray.pas new file mode 100644 index 0000000..3514a6c --- /dev/null +++ b/!MainFeatures/02_Types/Dynarray.pas @@ -0,0 +1,24 @@ +// Процедуры и методы работы с динамическим массивом + +begin + var a := ArrRandom(10); + + // Вывод всех элементов массива + a.Println; + + // Сортировка массива + a.Sort; + a.Println; + + // Обращение массива + a.Reverse; + a.Println; + + // Изменение размерамассиав с сохранением элементов. То же делает SetLength + a.Resize(a.Length+2); + a.Println; + + // Поиск вхождения элемента в массив + var i := a.IndexOf(50); + Writeln(i); +end. \ No newline at end of file diff --git a/!MainFeatures/02_Types/Enum.pas b/!MainFeatures/02_Types/Enum.pas new file mode 100644 index 0000000..db92312 --- /dev/null +++ b/!MainFeatures/02_Types/Enum.pas @@ -0,0 +1,25 @@ +// Перечислимый тип +type Months = (January,February,March,April,May,June,July,August,September,October,November,December); + +var m: Months; + +begin + m := February; + writeln(m); + // Использование констант перечислимого типа после имени типа удобно: после точки intellisense показывает список констант + m := Months.April; + writeln('Следующий месяц: ',m); + Inc(m); + writeln('Следующий месяц: ',m); + m := Succ(m); + writeln('Следующий месяц: ',m); + m := Pred(m); + writeln('Предыдующий месяц: ',m); + Dec(m); + writeln('Предыдующий месяц: ',m); + writeln('Его порядковый номер (нумерация - с нуля): ',Ord(m)); + // Ошибки нет + writeln('Месяц перед январем - выход за границы: ',pred(Months.January)); + // Ошибки нет + writeln('Месяц после декабря - выход за границы: ',succ(Months.December)); +end. \ No newline at end of file diff --git a/!MainFeatures/02_Types/InitRecords.pas b/!MainFeatures/02_Types/InitRecords.pas new file mode 100644 index 0000000..5befeb8 --- /dev/null +++ b/!MainFeatures/02_Types/InitRecords.pas @@ -0,0 +1,15 @@ +// Инициализаторы полей записи +type + Frac = record + num: integer := 0; + denom := 1; // автоопределеине типа - denom: integer + end; + +var + f: Frac; + f1: Frac := (num: 2; denom: 3); + +begin + writeln(f.num,'/',f.denom); + writeln(f1.num,'/',f1.denom); +end. \ No newline at end of file diff --git a/!MainFeatures/02_Types/PointerToRef.pas b/!MainFeatures/02_Types/PointerToRef.pas new file mode 100644 index 0000000..8a07a43 --- /dev/null +++ b/!MainFeatures/02_Types/PointerToRef.pas @@ -0,0 +1,10 @@ +// Указатели на ссылочные типы запрещены. Исключение: указатели на строки и динамические массивы +type + A = class + i: integer; + end; + +var p: ^record field: A; end; + +begin +end. \ No newline at end of file diff --git a/!MainFeatures/02_Types/PointersVsRef/Pointers.pas b/!MainFeatures/02_Types/PointersVsRef/Pointers.pas new file mode 100644 index 0000000..42aa2fc --- /dev/null +++ b/!MainFeatures/02_Types/PointersVsRef/Pointers.pas @@ -0,0 +1,43 @@ +// Выделение динамической памяти +// Использование указателей для создания односвязного списка +type + PNode = ^TNode; + TNode = record + data: integer; + next: PNode; + end; + +function NewNode(d: integer; n: PNode): PNode; +begin + New(Result); + Result^.data := d; + Result^.next := n; +end; + +var first: PNode; + +begin + first := nil; + // Добавляем в начало односвязного списка + first := NewNode(3,first); + first := NewNode(7,first); + first := NewNode(5,first); + + // Вывод односвязного списка + writeln('Содержимое односвязного списка: '); + var p := first; + while p<>nil do + begin + write(p^.data,' '); + p := p^.next; + end; + + // Разрушение односвязного списка + p := first; + while p<>nil do + begin + var p1 := p; + p := p^.next; + Dispose(p1); // Память обязательно возвращать + end; +end. \ No newline at end of file diff --git a/!MainFeatures/02_Types/PointersVsRef/References.pas b/!MainFeatures/02_Types/PointersVsRef/References.pas new file mode 100644 index 0000000..fabbe9d --- /dev/null +++ b/!MainFeatures/02_Types/PointersVsRef/References.pas @@ -0,0 +1,35 @@ +// Использование ссылок вместо указателей для создания односвязного списка +// Мы рекомендуем именно этот способ +type + Node = class + data: integer; + next: Node; + constructor (d: integer; n: Node); + begin + data := d; + next := n; + end; + end; + +// Переменная типа "класс" представляет собой ссылку на объект, выделяемый конструктором +var first: Node; + +begin + first := nil; + // Добавляем в начало односвязного списка + first := new Node(3,first); + first := new Node(7,first); + first := new Node(5,first); + + // Вывод односвязного списка. ^ отсутствуют + writeln('Содержимое односвязного списка (использование ссылок вместо указателей): '); + var p := first; + while p<>nil do + begin + write(p.data,' '); + p := p.next; + end; + + // Разрушение односвязного списка + first := nil; // Сборщик мусора соберет память, на которую никто больше не указывает +end. \ No newline at end of file diff --git a/!MainFeatures/02_Types/Sets.pas b/!MainFeatures/02_Types/Sets.pas new file mode 100644 index 0000000..a404ba7 --- /dev/null +++ b/!MainFeatures/02_Types/Sets.pas @@ -0,0 +1,15 @@ +// Работа с множествами +// Базовый тип для множества может быть произвольным +var + s1: set of string := ['Иванов','Попов','Сидорова','Петров']; + s2: set of string := ['Козлов','Петров','Иванов']; +begin + writeln('Множество s1: ',s1); + writeln('Множество s2: ',s2); + writeln('Объединение множеств s1 и s2: ',s1+s2); + writeln('Пересечение множеств s1 и s2: ',s1*s2); + writeln('Разность множеств s1 и s2: ',s1-s2); + Include(s1,'Умнов'); + Exclude(s1,'Иванов'); + writeln('Множество s1: ',s1); +end. \ No newline at end of file diff --git a/!MainFeatures/02_Types/StringInteger.pas b/!MainFeatures/02_Types/StringInteger.pas new file mode 100644 index 0000000..ce86a50 --- /dev/null +++ b/!MainFeatures/02_Types/StringInteger.pas @@ -0,0 +1,16 @@ +// Преобразование целое <-> строка в новом стиле +var + s: string; + i: integer; + +begin + // Преобразование целого в строку + i := 234; + s := i.ToString; + writelnFormat('Целое: {0}. После преобразования к строке: ''{1}''',i,s); + + // Преобразование строки в целое + s := '567'; + if integer.TryParse(s,i) then + writelnFormat('Строка: ''{0}''. После преобразования к целому: {1}',s,i); +end. \ No newline at end of file diff --git a/!MainFeatures/02_Types/StringMethods.pas b/!MainFeatures/02_Types/StringMethods.pas new file mode 100644 index 0000000..609eb82 --- /dev/null +++ b/!MainFeatures/02_Types/StringMethods.pas @@ -0,0 +1,18 @@ +// Строки. Методы класса string +var + s: string := ' Pascal__NET '; + s1: string := 'NET'; + +begin + writeln('Исходная строка: ''',s,''''); + s := s.Trim; + writeln('После вызова s.Trim: ''',s,''''); + var p := s.IndexOf(s1); // Индексация - с нуля + writelnFormat('Позиция подстроки ''{0}'' в строке ''{1}'' равна {2}',s1,s,p); + s := s.Remove(6,2); + writeln('После удаления символов __: ',s); + s := s.Insert(6,'ABC.'); + writeln('После вставки подстроки ''ABC.'': ',s); + writeln('Первая часть строки: ',s.Substring(0,9)); + writeln('Последняя часть строки: ',s.Substring(10,3)); +end. \ No newline at end of file diff --git a/!MainFeatures/02_Types/StringTypes.pas b/!MainFeatures/02_Types/StringTypes.pas new file mode 100644 index 0000000..7e89b95 --- /dev/null +++ b/!MainFeatures/02_Types/StringTypes.pas @@ -0,0 +1,17 @@ +// Строки string, string[n], shortstring +var + s: string; // память, занимаемая s, зависит от ее длины + s10: string[10]; // память под ss фиксирована + ss: shortstring := s; + f: file of string[10]; + // f: file of string; - ошибка + +begin + s := '12345678901234567890'; + s10 := s; // обрезание + writeln(s10); + s += s; s += s; + s += s; s += s; + writeln(s); + writeln('Длина строки = ',s.Length); +end. \ No newline at end of file diff --git a/!MainFeatures/02_Types/StructTypeEquiv.pas b/!MainFeatures/02_Types/StructTypeEquiv.pas new file mode 100644 index 0000000..8648f73 --- /dev/null +++ b/!MainFeatures/02_Types/StructTypeEquiv.pas @@ -0,0 +1,23 @@ +// Иллюстрация структурной эквивалентности для некоторых типов. В Delphi - именная эквивалентность +var + a: array of integer; + a1: array of integer; + s: set of real; + s1: set of real; + p: procedure (i: integer); + p1: procedure (i: integer); + r: ^integer; + r1: ^integer; + +procedure proc(aa: array of integer; ss: set of real; pp: procedure (i: integer); rr: ^integer); +begin + +end; + +begin + a := a1; + s := s1; + p := p1; + r := r1; // В Delphi ни одно из этих присваиваний не сработает + proc(a,s,p,r); // Этот вызов - тоже +end. \ No newline at end of file diff --git a/!MainFeatures/02_Types/UntypedFile.pas b/!MainFeatures/02_Types/UntypedFile.pas new file mode 100644 index 0000000..24bb11d --- /dev/null +++ b/!MainFeatures/02_Types/UntypedFile.pas @@ -0,0 +1,19 @@ +// Бестиповые файлы +var + f: file; + i: integer; + r: real; + s: string; + +begin + assign(f,'a.dat'); + rewrite(f); + // Записываем в файл данные любых типов + write(f,1,2.5,'Hello'); + close(f); + reset(f); + // Считываем эти данные из файла + read(f,i,r,s); + write(i,' ',r,' ',s); + close(f); +end. \ No newline at end of file diff --git a/!MainFeatures/03_Subroutines/FuncParams.pas b/!MainFeatures/03_Subroutines/FuncParams.pas new file mode 100644 index 0000000..ceb59ba --- /dev/null +++ b/!MainFeatures/03_Subroutines/FuncParams.pas @@ -0,0 +1,12 @@ +// Переменное число параметров +function Sum(params arg: array of integer): integer; +begin + Result := 0; + foreach var x in arg do + Result += x; +end; + +begin + writeln(Sum(1,2,3)); + writeln(Sum(4,5,6,7)); +end. \ No newline at end of file diff --git a/!MainFeatures/03_Subroutines/Overload.pas b/!MainFeatures/03_Subroutines/Overload.pas new file mode 100644 index 0000000..f3b5eae --- /dev/null +++ b/!MainFeatures/03_Subroutines/Overload.pas @@ -0,0 +1,21 @@ +// Перегрузка имен подпрограмм +procedure proc(i: integer); +begin + writeln('integer'); +end; + +procedure proc(c: char); +begin + writeln('char'); +end; + +procedure proc(r: real); +begin + writeln('real'); +end; + +begin + proc(1); + proc(2.5); + proc('d'); +end. \ No newline at end of file diff --git a/!MainFeatures/03_Subroutines/ProcVars.pas b/!MainFeatures/03_Subroutines/ProcVars.pas new file mode 100644 index 0000000..073617a --- /dev/null +++ b/!MainFeatures/03_Subroutines/ProcVars.pas @@ -0,0 +1,39 @@ +// Все возможные способы инициализации поцедурной переменной +// Процедурный тип реализован через делегаты .NET, для него доступны операции +=, -= + +procedure pp; +begin + writeln('Вызов обычной процедуры'); +end; + +type + A = class + private + x: integer; + public + constructor Create(xx: integer); + begin + x := xx; + end; + procedure pp; + begin + writeln('Вызов метода класса, значение поля равно ',x); + end; + class procedure ppstatic; + begin + writeln('Вызов классового метода класса'); + end; + end; + +var p: procedure; + +begin + p := pp; + var a1: A := new A(5); + p += a1.pp; + p += A.ppstatic; + p; + writeln; + p -= pp; + p; +end. \ No newline at end of file diff --git a/!MainFeatures/03_Subroutines/SwapT.pas b/!MainFeatures/03_Subroutines/SwapT.pas new file mode 100644 index 0000000..645e791 --- /dev/null +++ b/!MainFeatures/03_Subroutines/SwapT.pas @@ -0,0 +1,23 @@ +// Обобщенные функции +// Выведение типа T по типам параметров + +procedure Swap(var a,b: T); +begin + var v := a; + a := b; + b := v; +end; + +begin + var a := 2; + var b := 3; + writelnFormat('До Swap a={0}, b={1}',a,b); + Swap(a,b); + writelnFormat('После Swap a={0}, b={1}',a,b); + var c := 2.5; + var d := 3.3; + writeln; + writelnFormat('До Swap c={0}, d={1}',c,d); + Swap(c,d); + writelnFormat('После Swap c={0}, d={1}',c,d); +end. \ No newline at end of file diff --git a/!MainFeatures/04_Units/CallC#/CallCS.pas b/!MainFeatures/04_Units/CallC#/CallCS.pas new file mode 100644 index 0000000..d118c77 --- /dev/null +++ b/!MainFeatures/04_Units/CallC#/CallCS.pas @@ -0,0 +1,9 @@ +// Вызов статического метода add класса Class1, помещенного в пространство имен ClassLibrary1 +// Класс Class1 помещен в библиотеку ClassLibrary1.dll, откомпилированную на C# + +{$reference ClassLibrary1.dll} +uses ClassLibrary1; + +begin + writeln(Class1.add(2,3)); +end. \ No newline at end of file diff --git a/!MainFeatures/04_Units/CallC#/ClassLibrary1.dll b/!MainFeatures/04_Units/CallC#/ClassLibrary1.dll new file mode 100644 index 0000000..efed75e Binary files /dev/null and b/!MainFeatures/04_Units/CallC#/ClassLibrary1.dll differ diff --git a/!MainFeatures/04_Units/DllTest/MyDll.dll b/!MainFeatures/04_Units/DllTest/MyDll.dll new file mode 100644 index 0000000..9a9c8f8 Binary files /dev/null and b/!MainFeatures/04_Units/DllTest/MyDll.dll differ diff --git a/!MainFeatures/04_Units/DllTest/MyDll.pas b/!MainFeatures/04_Units/DllTest/MyDll.pas new file mode 100644 index 0000000..8d59741 --- /dev/null +++ b/!MainFeatures/04_Units/DllTest/MyDll.pas @@ -0,0 +1,16 @@ +// Dll-библиотека +library MyDll; + +const n = 10; + +function add(a,b: integer): integer; +begin + Result := a + b; +end; + +procedure PrintPascalABCNET; +begin + writeln('PascalABC.NET'); +end; + +end. \ No newline at end of file diff --git a/!MainFeatures/04_Units/DllTest/main.pas b/!MainFeatures/04_Units/DllTest/main.pas new file mode 100644 index 0000000..42e9893 --- /dev/null +++ b/!MainFeatures/04_Units/DllTest/main.pas @@ -0,0 +1,10 @@ +// Это - главная программа +// Именами из dll-библиотеки, написанной на PascalABC.NET, можно пользоваться, +// не подключая пространства имен +{$reference mydll.dll} + +begin + PrintPascalABCNET; + writeln(n); + writeln(add(2,3)); +end. \ No newline at end of file diff --git a/!MainFeatures/04_Units/NativeDll/CallNative.pas b/!MainFeatures/04_Units/NativeDll/CallNative.pas new file mode 100644 index 0000000..937a707 --- /dev/null +++ b/!MainFeatures/04_Units/NativeDll/CallNative.pas @@ -0,0 +1,7 @@ +{$platformtarget x86} +// Вызов функции из обычной dll +function add(a,b: integer): integer; external 'NativeDll.dll' name 'add'; // объявление внешней функции + +begin // основная программа + writeln(add(2,3)); +end. diff --git a/!MainFeatures/04_Units/NativeDll/NativeDll.dll b/!MainFeatures/04_Units/NativeDll/NativeDll.dll new file mode 100644 index 0000000..6b15dfe Binary files /dev/null and b/!MainFeatures/04_Units/NativeDll/NativeDll.dll differ diff --git a/!MainFeatures/04_Units/NativeDll/NativeDll.dpr b/!MainFeatures/04_Units/NativeDll/NativeDll.dpr new file mode 100644 index 0000000..b050bdd --- /dev/null +++ b/!MainFeatures/04_Units/NativeDll/NativeDll.dpr @@ -0,0 +1,13 @@ +// Delphi +library NativeDll; + +function add(a,b: integer): integer; stdcall; +begin + Result := a+b; +end; + +exports + add; +begin +end. + \ No newline at end of file diff --git a/!MainFeatures/04_Units/SimpleUnit/MainProgram.pas b/!MainFeatures/04_Units/SimpleUnit/MainProgram.pas new file mode 100644 index 0000000..98617cd --- /dev/null +++ b/!MainFeatures/04_Units/SimpleUnit/MainProgram.pas @@ -0,0 +1,7 @@ +uses MyUnit; // подключили модуль + +var a: array of integer := (1,5,3,7,3,6,4,5,1,8,3,5,6); + +begin + writeln('Максимальный элемент в массиве = ',Max(a)); +end. diff --git a/!MainFeatures/04_Units/SimpleUnit/MyUnit.pas b/!MainFeatures/04_Units/SimpleUnit/MyUnit.pas new file mode 100644 index 0000000..70fb761 --- /dev/null +++ b/!MainFeatures/04_Units/SimpleUnit/MyUnit.pas @@ -0,0 +1,14 @@ +/// Модуль упрощенной структуры +unit MyUnit; // имя модуля должно совпадать с именем файла + +// Документирующие комментарии отображаются при наведении на имя курсора мыши +/// Возвращает максимальный элемент в массиве +function Max(a: array of integer): integer; +begin + Result := integer.MinValue; + foreach x: integer in a do + if x>Result then + Result := x; +end; + +end. diff --git a/!MainFeatures/04_Units/SystemUnitTest.pas b/!MainFeatures/04_Units/SystemUnitTest.pas new file mode 100644 index 0000000..262e7f0 --- /dev/null +++ b/!MainFeatures/04_Units/SystemUnitTest.pas @@ -0,0 +1,12 @@ +// Иллюстрация поиска имен вначале справа налево в секции uses, а затем в системном модуле PABCSystem +uses System; + +begin + // Имя Random, определенное в пространстве имен System, перекрывает имя Random + // в модуле PABCSystem, который неявно подключается первым + var r: Random := new Random(); + writeln(r.Next(10)); + // Именно поэтому перед данным Random необходимо явно указывать имя модуля, в котором он находится + var i: integer := PABCSystem.Random(10); + writeln(i); +end. \ No newline at end of file diff --git a/!MainFeatures/05_Graph/ABC.pas b/!MainFeatures/05_Graph/ABC.pas new file mode 100644 index 0000000..de94d7a --- /dev/null +++ b/!MainFeatures/05_Graph/ABC.pas @@ -0,0 +1,41 @@ +// Модуль ABCObjects. Изменение свойств объекта +uses ABCObjects,GraphABC; + +const delay = 300; + +procedure Pause; +begin + Sleep(delay); +end; + +var + r: RectangleABC; + z: StarABC; + +begin + z := new StarABC(Window.Center.X,Window.Center.Y,70,30,6,Color.Green); + r := new RectangleABC(100,100,200,100,Color.Gold); + Pause; + r.Center := Window.Center; + Pause; + r.Height := 70; + Pause; + r.Width := 220; + Pause; + z.Radius := 150; + Pause; + z.Color := Color.LightCoral; + Pause; + z.Count := 5; + Pause; + + r.Text := 'PascalABC.NET'; + r.Color := Color.Gainsboro; + Pause; + r.BorderWidth := 3; + r.BorderColor := Color.Blue; + Pause; + r.Center := Window.Center; + Pause; +// r.Bordered := False; +end. diff --git a/!MainFeatures/05_Graph/GraphABCTest.pas b/!MainFeatures/05_Graph/GraphABCTest.pas new file mode 100644 index 0000000..cd8f125 --- /dev/null +++ b/!MainFeatures/05_Graph/GraphABCTest.pas @@ -0,0 +1,19 @@ +// Иллюстрация простейших возможностей GraphABC +uses GraphABC; + +begin + Coordinate.Origin := Window.Center; + Coordinate.SetMathematic; + Brush.Color := Color.LightSkyBlue; + while True do + begin + LockDrawing; + ClearWindow; + Ellipse(-120,-70,120,70); + Line(0,0,200,0); + Line(0,0,0,200); + Redraw; + Coordinate.Angle := Coordinate.Angle + 1; + Sleep(100); + end; +end. diff --git a/!MainFeatures/05_Graph/MouseEvents.pas b/!MainFeatures/05_Graph/MouseEvents.pas new file mode 100644 index 0000000..f48183e --- /dev/null +++ b/!MainFeatures/05_Graph/MouseEvents.pas @@ -0,0 +1,19 @@ +// Иллюстрация обработки событий мыши +uses GraphABC; + +procedure MouseDown(x,y,mb: integer); +begin + MoveTo(x,y); +end; + +procedure MouseMove(x,y,mb: integer); +begin + if mb=1 then LineTo(x,y); +end; + +begin + // Привязка обработчиков к событиям + OnMouseDown := MouseDown; + OnMouseMove := MouseMove +end. + diff --git a/!MainFeatures/06_Classes/AllFromObject.pas b/!MainFeatures/06_Classes/AllFromObject.pas new file mode 100644 index 0000000..ffa81bc --- /dev/null +++ b/!MainFeatures/06_Classes/AllFromObject.pas @@ -0,0 +1,14 @@ +// Все типы кроме указателей - производные от Object +var + i: integer; + r: real; + o: object; + +begin + o := i; + writeln(o.GetType); + o := r; + writeln(o.GetType); + if o.GetType=typeof(real) then + writeln('В переменной o - вещественный тип'); +end. \ No newline at end of file diff --git a/!MainFeatures/06_Classes/Boxing.pas b/!MainFeatures/06_Classes/Boxing.pas new file mode 100644 index 0000000..8f7eec8 --- /dev/null +++ b/!MainFeatures/06_Classes/Boxing.pas @@ -0,0 +1,22 @@ +// Упаковка-распаковка размерных типов +var + i: integer := 2; + r: real := 3.14; + o: object; + +begin + o := i; // Упаковка: объект размерного типа integer упаковывается в объект ссылочного типа, + // котрый и присваивается переменной o + // Преобразование типов при упаковке - неявное + writeln(integer(o)); // Распаковка: из упакованного объекта извлекается значение + // Преобразование типов при распаковке - явное + o := r; + writeln(real(o)); + + try // При неверном преобразовании типов генерируется исключение InvalidCastException + writeln(shortint(o)); + except + on e: Exception do + writeln(e.GetType); + end; +end. \ No newline at end of file diff --git a/!MainFeatures/06_Classes/ClassConstructor.pas b/!MainFeatures/06_Classes/ClassConstructor.pas new file mode 100644 index 0000000..11679be --- /dev/null +++ b/!MainFeatures/06_Classes/ClassConstructor.pas @@ -0,0 +1,36 @@ +// Пример использования классового (статического) конструктора +type + Person = class + private + class arr: array of Person; // Классовое поле. Связано не с переменной класса, а с классом. + name: string; + age: integer; + public + class constructor; // Конструктор класса. Вызывается до создания первого объекта класса и до вызова любого классового метода + begin + writeln(' Вызван классовый конструктор'); + SetLength(arr,3); + arr[0] := new Person('Иванов',20); + arr[1] := new Person('Петрова',19); + arr[2] := new Person('Попов',35); + end; + constructor (n: string; a: integer); + begin + name := n; + age := a; + end; + function ToString: string; override; + begin + Result := Format('Имя: {0} Возраст: {1}',name,age); + end; + class function RandomPerson: Person; // Классовый метод. Может обращаться только к классовым полям + begin + Result := arr[Random(3)]; + end; + end; + +begin + writeln('Случайные персоны'); + for var i:=1 to 5 do + writeln(Person.RandomPerson); // Вызов классового метода +end. \ No newline at end of file diff --git a/!MainFeatures/06_Classes/GarbageCollection.pas b/!MainFeatures/06_Classes/GarbageCollection.pas new file mode 100644 index 0000000..1295460 --- /dev/null +++ b/!MainFeatures/06_Classes/GarbageCollection.pas @@ -0,0 +1,11 @@ +// Сборка мусора: для освобождения объекта присвойте переменной nil +var l := new List; + +begin + l.Add(3); + l.Add(5); + l.Add(2); + foreach var x in l do + Print(x); + l := nil; // после этого память, занимаемая динамическим массивом, будет собрана сборщиком мусора +end. \ No newline at end of file diff --git a/!MainFeatures/06_Classes/Interf.pas b/!MainFeatures/06_Classes/Interf.pas new file mode 100644 index 0000000..0652513 --- /dev/null +++ b/!MainFeatures/06_Classes/Interf.pas @@ -0,0 +1,42 @@ +// Иллюстрация использования интерфейсов +type + IShape = interface + procedure Draw; + property X: integer read; + property Y: integer read; + end; + + ICloneable = interface + function Clone: Object; + end; + + Point = class(IShape,ICloneable) + private + xx,yy: integer; + public + constructor Create(x,y: integer); + begin + xx := x; yy := y; + end; + procedure Draw; begin end; + property X: integer read xx; + property Y: integer read yy; + function Clone: Object; + begin + Result := new Point(xx,yy); + end; + end; + +var + p: Point := new Point(2,3); + ish: IShape := p; + icl: ICloneable := p; + +begin + Println(ish.X,ish.Y); + var p1: Point := Point(icl.Clone); + p := nil; + Println(p1.X,p1.Y); + Println(ish is Point); + Println(ish is ICloneable); // Cross cast! +end. \ No newline at end of file diff --git a/!MainFeatures/06_Classes/OperatorOverloading.pas b/!MainFeatures/06_Classes/OperatorOverloading.pas new file mode 100644 index 0000000..0fe1ee6 --- /dev/null +++ b/!MainFeatures/06_Classes/OperatorOverloading.pas @@ -0,0 +1,82 @@ +// Перегрузка операций +type + Frac = record + private + num,denom: integer; + public + constructor (n,d: integer); + begin + num := n; + denom := d; + end; + class function operator+(a,b: Frac): Frac; + begin + Result := new Frac(a.num*b.denom+b.num*a.denom,a.denom*b.denom); + end; + class function operator-(a,b: Frac): Frac; + begin + Result := new Frac(a.num*b.denom-b.num*a.denom,a.denom*b.denom); + end; + class function operator*(a,b: Frac): Frac; + begin + Result := new Frac(a.num*b.num,a.denom*b.denom); + end; + class function operator/(a,b: Frac): Frac; + begin + Result := new Frac(a.num*b.denom,a.denom*b.num); + end; + class function operator=(a,b: Frac): boolean; + begin + Result := (a.num = b.num) and (a.denom = b.denom); + end; + class function operator<>(a,b: Frac): boolean; + begin + Result := not (a=b); + end; + class function operator<(a,b: Frac): boolean; + begin + Result := a.num/real(a.denom)(a,b: Frac): boolean; + begin + Result := a.num/real(a.denom)>b.num/real(b.denom); + end; + class function operator>=(a,b: Frac): boolean; + begin + Result := a.num/real(a.denom)>=b.num/real(b.denom); + end; + class procedure operator+=(var a: Frac; b: Frac); + begin + a := a + b; + end; + class function operator-(a: Frac): Frac; + begin + Result := new Frac(-a.num,a.denom); + end; + class function operator+(a: Frac): Frac; + begin + Result := a; + end; + function ToString: string; override; + begin + Result := Format('{0}/{1}',num,denom); + end; + end; + +var + f := new Frac(1,2); + f1 := new Frac(3,5); + +begin + writelnFormat('{0} + {1} = {2}',f,f1,f+f1); + writelnFormat('{0} - {1} = {2}',f,f1,f-f1); + writelnFormat('{0} * {1} = {2}',f,f1,f*f1); + writelnFormat('{0} / {1} = {2}',f,f1,f/f1); + writeln(f1=f); + f += f1; + writeln(-f); +end. \ No newline at end of file diff --git a/!MainFeatures/06_Classes/PersonInternal.pas b/!MainFeatures/06_Classes/PersonInternal.pas new file mode 100644 index 0000000..e146f93 --- /dev/null +++ b/!MainFeatures/06_Classes/PersonInternal.pas @@ -0,0 +1,30 @@ +// Описание методов внутри интерфейса класса +// Удобство: методы можно реализовывать сразу после объявления +// Неудобство: для больших классов интерфейс трудно читается +type + Person = class + private + // Поля класса, как правило, приватны. Доступ к ним - через методы и свойства + name: string; + age: integer; + public + // Конструктор неявно имеет имя Create + constructor (n: string; a: integer); + begin + name := n; age := a; + end; + procedure Print; + begin + writeln('Имя: ',name,' Возраст: ',age); + end; + end; + +var p,p1: Person; + +begin + p := new Person('Иванов',20); // Новый синтаксис вызова конструктора (рекомендуется) + p.Print; + p1 := Person.Create('Попов',19); // Старый синтаксис вызова конструктора (не рекомендуется) + p1.Print; + // Деструкторы отсутствуют, вместо них - автоматическая сборка мусора +end. \ No newline at end of file diff --git a/!MainFeatures/06_Classes/Records.pas b/!MainFeatures/06_Classes/Records.pas new file mode 100644 index 0000000..e95d97a --- /dev/null +++ b/!MainFeatures/06_Classes/Records.pas @@ -0,0 +1,26 @@ +// Иллюстрация конструкторов и методов в записях +// Если переопределен метод ToString, то он вызывается при выводе объекта этого типа процедурой writeln +type + SexType = (Male, Female); + Person = record + Name: string; + Age, Weight: integer; + Sex: SexType; + constructor (Name: string; Age, Weight: integer; Sex: SexType); + begin + Self.Name := Name; + Self.Age := Age; + Self.Sex := Sex; + Self.Weight := Weight; + end; + function ToString: string; override; + begin + Result := Format('Имя: {0} Пол: {1} Возраст: {2} Вес: {3}', Name, Sex, Age, Weight); + end; + end; + +var p: Person := new Person('Иванов',20,70,SexType.Male); + +begin + writeln(p); +end. diff --git a/!MainFeatures/06_Classes/Stack.pas b/!MainFeatures/06_Classes/Stack.pas new file mode 100644 index 0000000..d818e96 --- /dev/null +++ b/!MainFeatures/06_Classes/Stack.pas @@ -0,0 +1,56 @@ +// Демонстрация создания простого класса стека на базе массива +type + Stack = class + private + a: array of T; + last: integer; + public + constructor Create(sz: integer); + begin + SetLength(a,sz); + last := 0; + end; + constructor Create; + begin + Create(100); + end; + procedure push(i: T); + begin + a[last] := i; + Inc(last); + end; + function pop: T; + begin + Dec(last); + pop := a[last]; + end; + function top: T; + begin + top := a[last-1]; + end; + function empty: boolean; + begin + Result := (last=0); + end; + function ToString: string; override; + begin + Result := ''; + for var i:=0 to last-1 do + Result += a[i]+' '; + end; + end; + +var s: Stack; + +begin + s := new Stack; + s.push(7); + s.push(2); + s.push(5); + s.push(4); + writeln(s); + while not s.empty do + write(s.pop,' '); +end. + + diff --git a/!MainFeatures/06_Classes/Where.pas b/!MainFeatures/06_Classes/Where.pas new file mode 100644 index 0000000..4b932d3 --- /dev/null +++ b/!MainFeatures/06_Classes/Where.pas @@ -0,0 +1,21 @@ +// Секция Where - ограничение на типы параметров +uses System,System.Collections.Generic; + +type + MyClass = class + where T: System.Array,ICloneable; + where T1: constructor; + procedure p(obj1: T; var obj2: T1); + begin + obj1.Clone(); + obj2 := new T1; + end; + end; + IntArr = array of integer; + +var + m: MyClass; + //m1: MyClass; // ошибка + +begin +end. \ No newline at end of file diff --git a/!MainFeatures/06_Classes/WriteRecord.pas b/!MainFeatures/06_Classes/WriteRecord.pas new file mode 100644 index 0000000..d35db74 --- /dev/null +++ b/!MainFeatures/06_Classes/WriteRecord.pas @@ -0,0 +1,26 @@ +// Иллюстрация конструкторов и методов в записях +// Если переопределен метод ToString, то он вызывается при выводе объекта этого типа процедурой writeln +type + SexType = (Male, Female); + Person = record + Name: string; + Age, Weight: integer; + Sex: SexType; + constructor (Name: string; Age, Weight: integer; Sex: SexType); + begin + Self.Name := Name; + Self.Age := Age; + Self.Sex := Sex; + Self.Weight := Weight; + end; + function ToString: string; override; + begin + Result := string.Format('Имя: {0} Возраст: {1} Вес: {2} Пол: {3}', Name, Age, Weight, Sex); + end; + end; + +var p: Person := new Person('Иванов',20,70,SexType.Male); + +begin + writeln(p); +end. diff --git a/!MainFeatures/07_NetLibs/DateTime.pas b/!MainFeatures/07_NetLibs/DateTime.pas new file mode 100644 index 0000000..01e72e3 --- /dev/null +++ b/!MainFeatures/07_NetLibs/DateTime.pas @@ -0,0 +1,31 @@ +Uses System; + +var d1, d2, d3: DateTime; // Объекты для хранения даты и времени + ts: TimeSpan; // Объект для хранения промежутков времени + +begin + // Получение текущей даты - вызов статического метода + d1 := DateTime.Now; + Writeln(d1); + + // Дата и время через один месяц + d2 := d1.AddMonths(1); + Writeln(d2); + + // Дата и время на 12 часов раньше + d2 := d1.AddHours(-12); + Writeln(d2); + + // Формирование даты - вызов конструктора объекта (год, месяц,число) + d3 := new DateTime(2001, 1, 1); + Writeln(d3); + + // Определение времени, прошедшего с начала тысячелетия (разность дат) + ts := d1.Subtract(d3); + + // Промежуток времени в днях (результат - вещественное число) + Writeln(ts.TotalDays); + + // Промежуток времени в днях, часах, минутах и секундах + Writeln(ts.Days, ' ', ts.Hours, ':', ts.Minutes, ':', ts.Seconds); +end. \ No newline at end of file diff --git a/!MainFeatures/07_NetLibs/FormWebBrowser.pas b/!MainFeatures/07_NetLibs/FormWebBrowser.pas new file mode 100644 index 0000000..c69b9e7 --- /dev/null +++ b/!MainFeatures/07_NetLibs/FormWebBrowser.pas @@ -0,0 +1,17 @@ +// Иллюстрация использования компонента WebBrowser +{$apptype windows} +{$reference System.Windows.Forms.dll} + +uses + System.Windows.Forms, + System.Net; + +begin + var myForm := new Form; + var w := new WebBrowser; + w.Url := new System.Uri('http://pascalabc.net'); + w.Dock := Dockstyle.Fill; + myForm.Controls.Add(w); + myForm.WindowState := FormWindowState.Maximized; + Application.Run(myForm); +end. diff --git a/!MainFeatures/07_NetLibs/LinkedList.pas b/!MainFeatures/07_NetLibs/LinkedList.pas new file mode 100644 index 0000000..dd1474e --- /dev/null +++ b/!MainFeatures/07_NetLibs/LinkedList.pas @@ -0,0 +1,27 @@ +// Использование LinkedList - двусвязного списка стандартной библиотеки - и его итератора +uses System.Collections,System.Collections.Generic; + +procedure print(l: ICollection); +begin + foreach x: integer in l do + write(x,' '); + writeln; +end; + +var l: LinkedList := new LinkedList; + +begin + l.AddLast(3); + l.AddLast(5); + l.AddLast(7); + l.AddFirst(2); + print(l); + + var a := new integer[10]; + l.CopyTo(a,0); + print(a); + + var lit: LinkedListNode := l.Find(5); + l.AddBefore(lit,777); + print(l); +end. \ No newline at end of file diff --git a/!MainFeatures/07_NetLibs/Reflection.pas b/!MainFeatures/07_NetLibs/Reflection.pas new file mode 100644 index 0000000..99deddb --- /dev/null +++ b/!MainFeatures/07_NetLibs/Reflection.pas @@ -0,0 +1,11 @@ +// Отражение типов. Выводятся все члены типа DateTime +uses System,System.Reflection; + +begin + var bf := BindingFlags.Public or BindingFlags.NonPublic or BindingFlags.Instance or BindingFlags.Static; + var t: &Type := typeof(DateTime); + var mi := t.GetMembers(bf); + foreach m: MemberInfo in mi do + writeln(m); +end. + diff --git a/!MainFeatures/07_NetLibs/WinFormWithButton.pas b/!MainFeatures/07_NetLibs/WinFormWithButton.pas new file mode 100644 index 0000000..a0f0c2c --- /dev/null +++ b/!MainFeatures/07_NetLibs/WinFormWithButton.pas @@ -0,0 +1,29 @@ +// Создание оконного приложения +{$apptype windows} +{$reference System.Windows.Forms.dll} + +uses + System, + System.Windows.Forms; + +var + myForm: Form; + myButton: Button; + +procedure MyButtonClick(sender: Object; e: EventArgs); +begin + myForm.Close; +end; + +begin + myForm := new Form; + myForm.Text := 'Оконное приложение'; + myButton := new Button; + myButton.Text := ' Закрыть окно '; + myButton.AutoSize := True; + myButton.Left := 90; + myButton.Top := 110; + myForm.Controls.Add(myButton); + myButton.Click += MyButtonClick; + Application.Run(myForm); +end. diff --git a/!NewExecutors/p1.pas b/!NewExecutors/p1.pas new file mode 100644 index 0000000..15e5757 --- /dev/null +++ b/!NewExecutors/p1.pas @@ -0,0 +1,5 @@ +uses ; + +begin + . +end. \ No newline at end of file diff --git a/!NewExecutors/p4.pas b/!NewExecutors/p4.pas new file mode 100644 index 0000000..42db1dd --- /dev/null +++ b/!NewExecutors/p4.pas @@ -0,0 +1,15 @@ +uses ; + +begin + var := (10); + .; + + .( -> >4).; + + var := 0; + foreach var in do + if >4 then + += 1; + . + +end. \ No newline at end of file diff --git a/!NewExecutors/ГрафическиеИсполнители.pas b/!NewExecutors/ГрафическиеИсполнители.pas new file mode 100644 index 0000000..cad4c33 --- /dev/null +++ b/!NewExecutors/ГрафическиеИсполнители.pas @@ -0,0 +1,106 @@ +unit ГрафическиеИсполнители; + +uses FormsABC; + +type + WebBrowser2 = class(WebBrowser) + public + procedure Отобразить(адрес: string) := Navigate(адрес); + function ОтобразитьСайт(адрес: string): () -> () := + () -> Self.Отобразить(адрес); + end; + + Button2 = class(Button) + private + procedure ppp(sender: Object; e: System.EventArgs); + public + event ПриНажатии: procedure; + constructor Create(text: string); + begin + inherited Create(text); + b.Click += ppp; + end; + property Текст: string read GetText write SetText; + end; + + ListBox2 = class(ListBox) + private + procedure ppp(sender: Object; e: System.EventArgs); + function GetHeight := lb.Height; + procedure SetHeight(h: integer) := lb.Height := h; + public + event ПриНажатии: procedure; + constructor Create; + begin + inherited Create; + lb.Click += ppp; + {lb.AutoSize := False; + lb.Width := 160;} + lb.Width := 190; + end; + procedure Добавить(name: string) := Items.Add(name); + procedure Очистить := Items.Clear; + procedure ДобавитьМного(m: sequence of string); + begin + foreach var x in m do + Items.Add(x); + end; + function ТекущаяСтрока := Items[Selectedindex] as string; + property Высота: integer read GetHeight write SetHeight; + end; + TextLabel2 = class(TextLabel) + public + property Текст: string read GetT write SetT; + + end; + + +procedure Button2.ppp(sender: Object; e: System.EventArgs); +begin + if ПриНажатии<>nil then + ПриНажатии +end; + +procedure ListBox2.ppp(sender: Object; e: System.EventArgs); +begin + if ПриНажатии<>nil then + ПриНажатии +end; + +procedure Init(); +begin + MainForm.SetSize(1024,768); +end; + +function СоздатьКнопку(Заголовок: string): Button2; +begin + ParentControl := MainPanel; + Result := new Button2(Заголовок); +end; + +function СоздатьСписок: ListBox2; +begin + ParentControl := MainPanel; + Result := new ListBox2; +end; + +function СоздатьТекст(txt: string := ''): TextLabel2; +begin + ParentControl := MainPanel; + Result := new TextLabel2(txt); +end; + +function СоздатьБраузер: WebBrowser2; +begin + MainPanel.Dock := Dockstyle.Left; + MainPanel.Width := 200; + ParentControl := MainForm; + Result := new WebBrowser2; + Result.Dock := DockStyle.Fill; +end; + +procedure НоваяСтрока := LineBreak; + +begin + Init(); +end. \ No newline at end of file diff --git a/!NewExecutors/Исполнители.pas b/!NewExecutors/Исполнители.pas new file mode 100644 index 0000000..416b555 --- /dev/null +++ b/!NewExecutors/Исполнители.pas @@ -0,0 +1,661 @@ +///- +/// , +unit ; + +type + ///!# + = integer; + = real; + = boolean; + = string; + +///- () +/// +procedure (params args: array of object) := Println(args); +/// +procedure := Println; + +///- . +/// +procedure (Self: ); extensionmethod := Println(Self); +///- . +/// +procedure (Self: real); extensionmethod := Println(Self); +///- . +/// +procedure (Self: string); extensionmethod := Println(Self); + +type + ///!# + Seq = interface(IEnumerable) + + end; + + ///!# + = class + public + ///- .() + /// , + procedure (params args: array of object) := Println(args); + ///- . + /// + procedure := Println; + end; + + = class + + end; + +// + +function DeleteEnd(Self: string; s: string): string; extensionmethod; +begin + if Self.EndsWith(s) then + begin + var i := Self.LastIndexOf(s); + if (i>=0) and (is.ToString.Replace('Void ','') + .Replace('Int32','') + .Replace('Boolean','') + .Replace('System.String','') + .Replace('Double','')) + .Select(s->' '+s.DeleteEnd('()')) + .Where(s->not s.ToString.Contains('$Init$')) + .Println(NewLine); +end; + +// +type + ///!# + = class + private + s := new SortedSet; + public + constructor; + begin end; + ///- .(: ) + /// . , + procedure (params a: array of integer); + begin + a.ForEach(x->begin s.Add(x) end); + //s.Add(); + end; + ///- .(: ) + /// . , + procedure (: ); + begin + s.Remove(); + end; + ///- . + /// + procedure ; + begin + s.Println; + end; + ///- .(: ): + /// , + function (: ): ; + begin + Result := s.Contains() + end; + ///- . + /// + procedure ; + begin + if Random(2)=1 then + PrintAllMethods(Self) + else + begin + WritelnFormat(' {0}:',Self.GetType.Name.DeleteEnd('')); + Writeln(' (: )'); + Writeln(' (: )'); + Writeln(' '); + Writeln(' (: ): '); + Writeln(' '); + end; + end; + ///- . + /// + procedure ; + begin + s.Clear + end; + ///- . + /// + function (params a: array of integer): ; + begin + Result := new (); + Result.(a) + end; + ///- .(1) + /// + function (s1: ): ; + begin + Result := new (); + var ss := SSet(s.AsEnumerable&); + ss.IntersectWith(s1.s); + Result.s := ss; + end; + end; + +type + ///!# + = class + private + s := new SortedSet; + public + constructor; + begin end; + ///- .(: ) + /// . , + procedure (: string); + begin + s.Add(); + end; + ///- .(: ) + /// . , + procedure (: string); + begin + s.Remove(); + end; + ///- . + /// + procedure ; + begin + s.Println; + end; + ///- .(: ): + /// , + function (: string): ; + begin + Result := s.Contains() + end; + ///- . + /// + procedure ; + begin + if Random(2)=1 then + PrintAllMethods(Self) + else + begin + WritelnFormat(' {0}:',Self.GetType.Name.DeleteEnd('')); + Writeln(' (: )'); + Writeln(' (: )'); + Writeln(' '); + Writeln(' (: ): '); + Writeln(' '); + end; + end; + ///- . + /// + procedure ; + begin + s.Clear + end; + ///- . + /// + function := new ; + ///- .(1) + /// + function (1: ): ; + begin + var ss: SortedSet; + ss := (1 as ).s; + + var m := new ; + m.s := s.ZipTuple(ss).Select(x -> x.ToString()).ToSortedSet; + Result := m + end; + end; + +type +///!# + = class + public + ///- .(a,b,c: ) + /// + procedure (a,b,c: real); + begin + writelnFormat(' : {0}*x*x+{1}*x+{2}=0',a,b,c); + var D := b*b-4*a*c; + if D<0 then + writeln(' ') + else + begin + var x1 := (-b-sqrt(D))/2/a; + var x2 := (-b+sqrt(D))/2/a; + writelnFormat(': x1={0} x2={1}',x1,x2) + end; + end; + ///- .(a0,d: ) + /// + procedure (a0,d: integer); + begin + writelnFormat(' : a0={0} d={1}',a0,d); + SeqGen(10,a0,x->x+d).Println; // ! + end; + procedure ; + begin + PrintAllMethods(Self); + end; + end; + + FileState = (Closed,OpenedForRead,OpenedForWrite); + ///!# + = class + private + f: Text; + State := FileState.Closed; + public + constructor ; + begin + end; + ///- .() + /// + procedure (: ); + begin + if State<>FileState.Closed then + f.Close; + f := OpenRead(); + State := FileState.OpenedForRead + end; + ///- .() + /// + procedure (: ); + begin + if State<>FileState.Closed then + f.Close; + f := OpenWrite(); + State := FileState.OpenedForWrite + end; + ///- . + /// + procedure ; + begin + if State=FileState.Closed then + Println(': ') + else f.Close; + State := FileState.Closed; + end; + ///- .() + /// + procedure (: ); + begin + if State=FileState.Closed then + Println(': ') + else f.Writeln() + end; + ///- . + /// , + function : ; + begin + if State=FileState.Closed then + begin + Println(': '); + Result := ''; + end + else + begin + Result := f.ReadlnString; + Println(Result); + end; + end; + ///- . + /// , + function : ; + begin + if State=FileState.Closed then + begin + Println(': '); + Result := 0; + end + else + begin + Result := f.ReadInteger; + Print(Result); + end; + end; + ///- . + /// , + function : ; + begin + if State=FileState.Closed then + begin + Println(': '); + Result := 0; + end + else + begin + Result := f.ReadReal; + Print(Result); + end; + end; + ///- . + /// , + function : ; + begin + Result := f.Eof; + end; + ///- . + /// + function : ; + begin + if State=FileState.Closed then + begin + Println(': , '); + Result := ''; + end + else + begin + Println(' : ',f.Name); + Result := f.Name; + end + end; + ///- . + /// + procedure (: ); + begin + if (State<>FileState.Closed) and (f.Name.ToLower=.ToLower) then + Println(': ') + else + begin + WritelnFormat(' {0}:',); + try + ReadLines().Println(NewLine); + except + WritelnFormat(' {0}: ',); + end; + end; + + end; + ///- . + /// + procedure ; + begin + PrintAllMethods(Self); + end; + ///- . + /// + function := new ; + ///- . + /// + function (: ): sequence of ; + begin + if (State<>FileState.Closed) and (f.Name.ToLower=.ToLower) then + begin + Println(': '); + Result := nil; + exit; + end; + Result := ReadLines().ToArray; + end; + end; + +const dbname = 'countries.db'; + +var coun: array of string := nil; + +function : sequence of string; +begin + if coun = nil then + coun := ReadLines(dbname).ToArray(); + Result := coun; +end; + +///- . +/// , +function (Self: sequence of T): sequence of T; extensionmethod; +begin + Self.Println; + Result := Self; +end; + +///- . +/// - +function (Self: sequence of T): sequence of T; extensionmethod; +begin + Self.Println(NewLine); + Result := Self; +end; + +///- .() +/// , +function (Self: sequence of T; cond: T -> boolean): sequence of T; extensionmethod; +begin + Result := Self.Where(cond); +end; + +///- .(n) +/// n +function (Self: sequence of T; n: integer): sequence of T; extensionmethod; +begin + Result := Self.Take(n); +end; + +///- .() +/// , +function (Self: sequence of T; cond: T -> boolean := nil): ; extensionmethod; +begin + if cond = nil then + Result := Self.Count() + else Result := Self.Count(cond) +end; + +///- . +/// +function (Self: sequence of integer): integer; extensionmethod; +begin + Result := Self.Sum(); +end; + +///- . +/// +function (Self: sequence of integer): real; extensionmethod; +begin + Result := Self.Average; +end; + +///- . +/// +function (Self: sequence of integer): integer; extensionmethod; +begin + Result := Self.Min; +end; + +///- . +/// +function (Self: sequence of integer): integer; extensionmethod; +begin + Result := Self.Max; +end; + +///- .( ) +/// +function (Self: sequence of T; conv: T -> Key): sequence of Key; extensionmethod; +begin + Result := Self.Select(conv); +end; + +///- .( ) +/// +function (Self: sequence of T; cond: T -> Key): sequence of T; extensionmethod; +begin + Result := Self.OrderBy(cond); +end; + +///- .( ) +/// +function (Self: sequence of T): sequence of T; extensionmethod; +begin + Result := Self.OrderBy(x->x); +end; + +///- .( ) +/// +function (Self: sequence of T; cond: T -> Key): sequence of T; extensionmethod; +begin + Result := Self.OrderByDescending(cond); +end; + +///- .() +/// +procedure (Self: sequence of T; act: T -> ()); extensionmethod; +begin + Self.Foreach(act); +end; + +function (c: char): string -> boolean; +begin + Result := -> [1] = c; +end; + +function (s: string): string -> boolean; +begin + Result := -> [1] = s[1]; +end; + +function (Self: string; s: string): boolean; extensionmethod; +begin + Result := Self.StartsWith(s); +end; + +///- () +/// , +function (x: integer): boolean; +begin + Result := x mod 2 = 0; +end; + +///- () +/// , +function (x: integer): boolean; +begin + Result := x mod 2 <> 0; +end; + +type +///!# + = class +public + ///- + /// + : ; + ///- + /// + : ; + ///- + /// + : ; + ///- + /// + : ; + ///- + /// + : ; + ///- + /// + procedure ; + begin + Println(''); + Println(''); + Println(''); + Println(''); + Println(''); + end; +end; + +type + ///!# + Country = auto class + nm,cap: string; + inh: integer; + cont: string; + public + property : string read nm; + property : string read cap; + property : integer read inh; + property : string read cont; + end; + +var : sequence of Country; + +procedure InitCountries(); +begin + := ReadLines('.csv') + .Select(s->s.ToWords(';')) + .Select(w->new Country(w[0],w[1],w[2].ToInteger,w[3])).ToArray; +end; + +// + +///- (,,) +/// , +function (a,d: integer; n: integer := 20): sequence of integer; +begin + Result := SeqGen(n,a,a->a+d) +end; + +///- (,,) +/// , +function (a,d: real; n: integer := 20): sequence of real; +begin + Result := SeqGen(n,a,a->a+d) +end; + +///- (,,) +/// , +function (a,d: integer; n: integer := 10): sequence of integer; +begin + Result := SeqGen(n,a,a->a*d) +end; + +///- (,,) +/// , +function (a,d: real; n: integer := 10): sequence of real; +begin + Result := SeqGen(n,a,a->a*d) +end; + +///- (,,) +/// [, ] +function (n: integer := 10; a: integer := 0; b: integer := 10): sequence of integer; +begin + Result := ArrRandom(n,a,b) +end; + +function := new ; + +var + ///- . + := new ; + ///- . + := new ; + ///- . + := new ; + ///- . + := new ; + ///- . + := new ; + ///- . + := new ; +begin + . := ; + . := ; + . := ; + . := ; + . := ; + InitCountries; +end. + \ No newline at end of file diff --git a/!NewExecutors/Множество1.pas b/!NewExecutors/Множество1.pas new file mode 100644 index 0000000..7c14c68 --- /dev/null +++ b/!NewExecutors/Множество1.pas @@ -0,0 +1,12 @@ +uses ; + +begin + var 1 := .(3,5,4,5); + 1.; + + var 2 := .(7,5,3,9); + 2.; + + 1.(2).; +end. + \ No newline at end of file diff --git a/!NewExecutors/Окна.pas b/!NewExecutors/Окна.pas new file mode 100644 index 0000000..132c352 --- /dev/null +++ b/!NewExecutors/Окна.pas @@ -0,0 +1,107 @@ +unit ; + +{$reference 'PresentationFramework.dll'} +{$reference 'WindowsBase.dll'} +{$reference 'PresentationCore.dll'} + +{$apptype windows} + +uses System.Windows.Controls; +uses System.Windows; +uses System.Windows.Data; +uses System.Reflection; +uses System.Collections.ObjectModel; + + +var app := new Application(); +var MainWindow := new Window; + +procedure InitWPF; +begin + MainWindow.Title := 'WPF'; + MainWindow.WindowStartupLocation := WindowStartupLocation.CenterScreen; + MainWindow.Width := 800; + MainWindow.Height := 600; + MainWindow.Show; +end; + +function GetFields(t1: T): sequence of string; +begin + Result := t1.GetType.GetProperties.Select(f->f.Name); +end; + +procedure (Self: ListView; data: sequence of T); extensionmethod; +begin + var gv := Self.View as GridView; + var fields := GetFields(data.First); + gv.Columns.Clear; + foreach var fld in fields do + begin + var col := new GridViewColumn; + col.Header := fld; + col.Width := 150; + col.DisplayMemberBinding := new Binding(fld); + gv.Columns.Add(col); + end; + Self.ItemsSource := data.Skip(1); +end; + +var + LeftPanel: StackPanel; + RightPanel: DockPanel; + +procedure Init(); +begin + var dp := new DockPanel; + MainWindow.Content := dp; + + LeftPanel := new StackPanel(); + LeftPanel.Width := 150; + dp.Children.Add(LeftPanel); + + RightPanel := new DockPanel(); + dp.Children.Add(RightPanel); +end; + +function CreateListView(): ListView; +begin + var list := new ListView; + var gv := new GridView; + list.View := gv; + RightPanel.Children.Add(list); + Result := list; +end; + +function : ListView; +begin + Result := CreateListView; +end; + + +function CreateButton(Content: string; p: procedure): Button; +begin + var btn := new Button; + LeftPanel.Children.Add(btn); + btn.HorizontalAlignment := HorizontalAlignment.Stretch; + btn.Margin := new Thickness(5); + btn.Content := Content; + btn.Click += procedure (sender: object; args: RoutedEventArgs) -> + begin + p; + end; + Result := btn; +end; + +function (Content: string; p: procedure): Button; +begin + Result := CreateButton(Content,p); +end; + + + +initialization + InitWPF; + Init; +finalization + app.Run(); +end. \ No newline at end of file diff --git a/!NewExecutors/Последовательности1.pas b/!NewExecutors/Последовательности1.pas new file mode 100644 index 0000000..44e9d79 --- /dev/null +++ b/!NewExecutors/Последовательности1.pas @@ -0,0 +1,14 @@ +uses ; + +begin + var := (10); + .; + + ..; + + var := 0; + foreach var in do + += ; + . +end. + \ No newline at end of file diff --git a/!NewExecutors/Последовательности2.pas b/!NewExecutors/Последовательности2.pas new file mode 100644 index 0000000..0e2bcf6 --- /dev/null +++ b/!NewExecutors/Последовательности2.pas @@ -0,0 +1,15 @@ +uses ; + +begin + var := (10); + .; + + .( -> ()).; + + var := 0; + foreach var in do + if () then + += 1; + . +end. + \ No newline at end of file diff --git a/!NewExecutors/Пример1.pas b/!NewExecutors/Пример1.pas new file mode 100644 index 0000000..172b342 --- /dev/null +++ b/!NewExecutors/Пример1.pas @@ -0,0 +1,15 @@ +uses ; + +begin + .(5); + .(3); + .(5); + .(4); + .; + .(3); + .; + (.(3)); + .; + .; +end. + \ No newline at end of file diff --git a/!NewExecutors/Пример2.pas b/!NewExecutors/Пример2.pas new file mode 100644 index 0000000..eae612b --- /dev/null +++ b/!NewExecutors/Пример2.pas @@ -0,0 +1,11 @@ +uses ; + +begin + .(1,3,2); + .; + .(1,2,2); + .; + .(1,2); + .; + .; +end. \ No newline at end of file diff --git a/!NewExecutors/Прогрессии1.pas b/!NewExecutors/Прогрессии1.pas new file mode 100644 index 0000000..ebf4558 --- /dev/null +++ b/!NewExecutors/Прогрессии1.pas @@ -0,0 +1,14 @@ +uses ; + +begin + var := (1,2,20); + .; + ..; + var := (1,2,10); + .; + ..; + var := (10,1,100); + .; + (.,.); +end. + \ No newline at end of file diff --git a/!NewExecutors/Прогрессии2.pas b/!NewExecutors/Прогрессии2.pas new file mode 100644 index 0000000..1165637 --- /dev/null +++ b/!NewExecutors/Прогрессии2.pas @@ -0,0 +1,13 @@ +uses ; + + +begin + var 1 := (1,2,20); + 1.; + 1..; + var 2 := 1.(x->x*x); + 2.; + var 3 := 2.(x -> x mod 10 = 5); + 3.; +end. + \ No newline at end of file diff --git a/!NewExecutors/Страны.csv b/!NewExecutors/Страны.csv new file mode 100644 index 0000000..8df7ee8 --- /dev/null +++ b/!NewExecutors/Страны.csv @@ -0,0 +1,196 @@ +;;240705; +;;25028000; +;;8579747; +;;9730500; +;;2886026; +;;40375954; +;;25830958; +;--;76098; + ;-;92738; +;-;43131966; +;;2998600; +;;33369945; + ;;392718; +;;160991563; +;;285006; +;;1316500; +;;9498400; +;;360838; +;;11250659; +;-;10315244; +;;7202198; +;;11410651; + ;;3791622; +;;2303820; +;;205738331; +;--;428874; + ;;18450494; +;;11552561; +;;784103; +;-;270470; +;;842; +;;65341183; +;;9823000; +;;31109000; + p;;1212107; +;;92700000; +;;1763142; +;--;10911819; +;;801623; +;;2054986; +;;28033375; +;;16176133; +;;12947122; +-;;1888429; +;;82162000; +;;8725111; +;-;107327; +;;10846979; +;;3720400; +;;5668743; + ;;79722624; +;;899598; +;;73016; + ;-;10648613; +;;91545000; +;;16717332; +;;15966810; +;;8522000; +;-;1294186000; +;;260581100; +;;6879300; +;;37547686; +;;79003827; +;;4635400; +;;332529; +;;46423064; +;;60665551; +;;27477600; +-;;526993; +;;17753200; +;;15827241; +;;23924407; +;;34988000; +;;2269672; +;;47251449; +;;848319; +;;6008600; +; ;114405; +;;1379022000; +;---;48803000; + ;;806153; +-;-;4773130; +-;;23254184; +;;11392889; +;-;4007146; +;;6693300; +;;1959900; +;;2160309; +;;4503438; +;;5988153; +;;6330159; +;;2869690; +;;37622; +;;576249; +;-;1261208; +;;3631775; +;;24915822; +;;2069172; +;;16310431; +;-;31700000; +;;18134835; +;;341256; +;;434403; +;;33996000; + ;;53069; +;;122273473; +;;28751362; +;;3553100; +;;37863; +;-;2966294; +;;54363426; +;;2513981; +;;28850717; +;;20715285; +;;186987563; +;;16985621; +;;6198154; + ;;4602900; +;;5275100; +;-;9266971; +;;4088690; +;;194521264; +;;21501; +;;3764166; +- ;-;7776115; +;;7003404; +;;31488625; +;;38437239; +;;10374822; + ;;4740992; +;;146544710; +;;11262564; +;;19759968; +;-;6146419; +;;194523; +-;-;31950; +- ;-;194390; + ;-;32248200; +;;1304063; + ;;25281327; + ;;55389; +;;97026; +;;15589485; +- ;;109644; +- ;;56183; +-;;186383; +;;7114393; +;;5469724; +;;18563595; +;;5421349; +;;2086300; + ;;324085000; + ;;594934; +;;11079013; +;;41175541; +;;547610; +-;;6592102; +;;8593600; +;;65323000; +;;55155473; +;;7496833; +;;106915; + ;--;1364973; +;;9943; +;;10982754; +;;5438670; +;;78741053; +;;40322768; +;;31807000; +;;42504274; +;;3415866; + ;;104966; +;;897537; +;;102921200; +;;5471753; +;;64513242; +;;4190669; + ;;4998493; +;;14496739; +;;622218; +;;10546120; +;;18006407; +;;8236600; +;;9838480; +-;;20810816; +;;15427000; + ;;845060; +;;5351680; +;;1315944; +;-;92206005; + ;;51431100; + ;;53532; +- ;;54956900; + ;;12733427; +;;2930050; +;;126960000; diff --git a/!NewExecutors/Страны1.pas b/!NewExecutors/Страны1.pas new file mode 100644 index 0000000..58bf4e3 --- /dev/null +++ b/!NewExecutors/Страны1.pas @@ -0,0 +1,11 @@ +uses ; + +begin + .; + + foreach var in do + (); + + .( -> .). +end. + \ No newline at end of file diff --git a/!NewExecutors/Страны2.pas b/!NewExecutors/Страны2.pas new file mode 100644 index 0000000..971484e --- /dev/null +++ b/!NewExecutors/Страны2.pas @@ -0,0 +1,17 @@ +uses ; + +begin + var := 0; + foreach var in do + if ..('') then + begin + (); + += 1; + end; + .; + + var := .( -> ..('')); + .; + ..; +end. + \ No newline at end of file diff --git a/!NewExecutors/Страны2a.pas b/!NewExecutors/Страны2a.pas new file mode 100644 index 0000000..fb4c4f7 --- /dev/null +++ b/!NewExecutors/Страны2a.pas @@ -0,0 +1,13 @@ +uses ; + +begin + var := 0; + foreach var in do + if .[1] = '' then + begin + (); + += 1; + end; + . +end. + \ No newline at end of file diff --git a/!NewExecutors/Страны2b.pas b/!NewExecutors/Страны2b.pas new file mode 100644 index 0000000..5591347 --- /dev/null +++ b/!NewExecutors/Страны2b.pas @@ -0,0 +1,7 @@ +uses ; + +begin + var := .( -> ..('')); + Println() +end. + \ No newline at end of file diff --git a/!NewExecutors/Страны2c.pas b/!NewExecutors/Страны2c.pas new file mode 100644 index 0000000..e281a02 --- /dev/null +++ b/!NewExecutors/Страны2c.pas @@ -0,0 +1,13 @@ +uses ; + +begin + var := .( -> ..('')); + var := 0; + foreach var in do + begin + (); + += 1; + end; + . +end. + \ No newline at end of file diff --git a/!NewExecutors/Страны3.pas b/!NewExecutors/Страны3.pas new file mode 100644 index 0000000..c2284b2 --- /dev/null +++ b/!NewExecutors/Страны3.pas @@ -0,0 +1,10 @@ +uses ; + +begin + var 0 := .( -> . = ''); + var 1 := 0.( -> .); + var 2 := 1.(10); + var 3 := 2.( -> (.,.)); + 3. +end. + \ No newline at end of file diff --git a/!NewExecutors/Страны4.pas b/!NewExecutors/Страны4.pas new file mode 100644 index 0000000..b3ea82a --- /dev/null +++ b/!NewExecutors/Страны4.pas @@ -0,0 +1,10 @@ +uses ; + +begin + .( -> . = '') + .( -> .) + .(10) + .( -> (.,.)) + . +end. + \ No newline at end of file diff --git a/!NewExecutors/СтраныGUI.pas b/!NewExecutors/СтраныGUI.pas new file mode 100644 index 0000000..43551ff --- /dev/null +++ b/!NewExecutors/СтраныGUI.pas @@ -0,0 +1,20 @@ +uses ,; + +begin + + // + var := .( -> ..('')); + + var := .( -> . = ''); + + var := .( -> . < 100000); + + // + var := ; + .(); + + CreateButton('', () -> .()); + CreateButton(' ', () -> .()); + CreateButton(' ', () -> .()); + CreateButton(' ', () -> .()); +end. \ No newline at end of file diff --git a/!NewExecutors/Файлы1.pas b/!NewExecutors/Файлы1.pas new file mode 100644 index 0000000..e45e020 --- /dev/null +++ b/!NewExecutors/Файлы1.pas @@ -0,0 +1,18 @@ +uses ; + +begin + var 1 := .; + var 2 := .; + 1.('.txt'); + 2.('2.txt'); + while not 1. do + begin + var := 1.; + 2.(); + end; + 1.; + 2.; + + 2.; +end. + \ No newline at end of file diff --git a/!NewExecutors/Файлы2.pas b/!NewExecutors/Файлы2.pas new file mode 100644 index 0000000..1c670e9 --- /dev/null +++ b/!NewExecutors/Файлы2.pas @@ -0,0 +1,14 @@ +uses ; + +begin + .('.txt'); + .(''); + .(''); + .(''); + .(''); + .(''); + .(''); + .; + .('.txt'); +end. + \ No newline at end of file diff --git a/!Tutorial/01_First/Assign1.pas b/!Tutorial/01_First/Assign1.pas new file mode 100644 index 0000000..282c2e6 --- /dev/null +++ b/!Tutorial/01_First/Assign1.pas @@ -0,0 +1,10 @@ +// Использование вспомогательных переменных + +begin + var r := ReadlnReal('Введите r: '); + var r2,r4,r8: real; // вспомогательные переменные + r2 := r * r; + r4 := r2 * r2; + r8 := r4 * r4; + Println(r,'в степени 8 =',r8); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/Assign2.pas b/!Tutorial/01_First/Assign2.pas new file mode 100644 index 0000000..21e8e0b --- /dev/null +++ b/!Tutorial/01_First/Assign2.pas @@ -0,0 +1,12 @@ +// Перемена местами значений двух переменных с использованием третьей +var x,y: real; + +begin + Write('Введите x,y: '); + Readln(x,y); + var v: real; // вспомогательная переменная + v := x; + x := y; + y := v; + Writeln('Новые значения x,y: ',x,' ',y); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/AssignExt.pas b/!Tutorial/01_First/AssignExt.pas new file mode 100644 index 0000000..5373b73 --- /dev/null +++ b/!Tutorial/01_First/AssignExt.pas @@ -0,0 +1,18 @@ +// Присваивания += -= *= /= +var + i: integer; + r: real; + +begin + i := 1; + Writeln('i := 1; i = ',i); + i += 2; // Увеличение на 2 + Writeln('i += 2; i = ',i); + i *= 3; // Увеличение в 3 раза + Writeln('i *= 3; i = ',i); + Writeln; + r := 6; + Writeln('r := 6; r = ',r); + r /= 2; + Writeln('r /= 2; r = ',r); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/Boolean1.pas b/!Tutorial/01_First/Boolean1.pas new file mode 100644 index 0000000..98dec6a --- /dev/null +++ b/!Tutorial/01_First/Boolean1.pas @@ -0,0 +1,16 @@ +// Логический тип. Логические выражения с and, or и not +var + b: boolean; + x: integer; +begin + Write('Введите x (от 1 до 9): '); + Readln(x); + b := x=5; + Writeln('x=5? ',b); + b := (x>=3) and (x<=5); + Writeln('x=3,4 или 5? ',b); + b := (x=3) or (x=4) or (x=5); + Writeln('x=3,4 или 5? ',b); + b := not Odd(x); + Writeln('x - четное? ',b); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/Calculations1.pas b/!Tutorial/01_First/Calculations1.pas new file mode 100644 index 0000000..91e984a --- /dev/null +++ b/!Tutorial/01_First/Calculations1.pas @@ -0,0 +1,10 @@ +// Вывод результатов вычислений +begin + Writeln('Вычисления:'); +// Вывод пустой строки + Writeln; + Writeln('121 + 363 = ',121+363); + Writeln('121 - 363 = ',121-363); + Writeln('121 * 363 = ',121*363); + Writeln('121 / 363 = ',121/363); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/Calculations2.pas b/!Tutorial/01_First/Calculations2.pas new file mode 100644 index 0000000..0889633 --- /dev/null +++ b/!Tutorial/01_First/Calculations2.pas @@ -0,0 +1,13 @@ +// Вывод результатов вычислений. Используются именованные константы +const + a = 121; + b = 363; + +begin + Writeln('Вычисления:'); + Writeln; + Writeln(a,' + ',b,' = ',a+b); + Writeln(a,' - ',b,' = ',a-b); + Writeln(a,' * ',b,' = ',a*b); + Writeln(a,' / ',b,' = ',a/b); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/Calculations3.pas b/!Tutorial/01_First/Calculations3.pas new file mode 100644 index 0000000..ce72b12 --- /dev/null +++ b/!Tutorial/01_First/Calculations3.pas @@ -0,0 +1,10 @@ +// Вывод результатов вычислений. Используются переменные и процедура ввода + +begin + var (a,b) := ReadlnInteger2('Введите a и b:'); + Writeln; + Writeln(a,' + ',b,' = ',a+b); + Writeln(a,' - ',b,' = ',a-b); + Writeln(a,' * ',b,' = ',a*b); + Writeln(a,' / ',b,' = ',a/b); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/DivMod1.pas b/!Tutorial/01_First/DivMod1.pas new file mode 100644 index 0000000..6f47206 --- /dev/null +++ b/!Tutorial/01_First/DivMod1.pas @@ -0,0 +1,10 @@ +// Операции div и mod +var a: integer; + +begin + Write('Введите a: '); + Readln(a); + Writeln('Последняя цифра числа: ',a mod 10); + Writeln('Число без последней цифры: ',a div 10); + Writeln('Если число a четно, то 0: ',a mod 2); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/DivMod2.pas b/!Tutorial/01_First/DivMod2.pas new file mode 100644 index 0000000..7f3169d --- /dev/null +++ b/!Tutorial/01_First/DivMod2.pas @@ -0,0 +1,13 @@ +// Операции div и mod +var a: integer := 247; + +begin + Write('Цифры числа в обратном порядке: '); + // Выводим последнюю цифру + Print(a mod 10); + // Отбрасываем последнюю цифру + a := a div 10; + Print(a mod 10); + a := a div 10; + Print(a mod 10); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/Eof.pas b/!Tutorial/01_First/Eof.pas new file mode 100644 index 0000000..a651a63 --- /dev/null +++ b/!Tutorial/01_First/Eof.pas @@ -0,0 +1,9 @@ +// Демонстрация работы функции eof. Запускать по Shift-F9, завершать по Ctrl-Z +begin + var s: char; + while not Eof do + begin + Read(s); + Println('-',Ord(s),' -'); + end; +end. diff --git a/!Tutorial/01_First/Eoln.pas b/!Tutorial/01_First/Eoln.pas new file mode 100644 index 0000000..55e6aa4 --- /dev/null +++ b/!Tutorial/01_First/Eoln.pas @@ -0,0 +1,8 @@ +// Демонстрация работы функции Eoln +begin + while not Eoln do + begin + var c := ReadChar; + Print(c); + end; +end. \ No newline at end of file diff --git a/!Tutorial/01_First/HelloWorld.pas b/!Tutorial/01_First/HelloWorld.pas new file mode 100644 index 0000000..90fe341 --- /dev/null +++ b/!Tutorial/01_First/HelloWorld.pas @@ -0,0 +1,5 @@ +// Первая программа +program HelloWorld; +begin + Writeln('Привет, мир!'); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/Random1.pas b/!Tutorial/01_First/Random1.pas new file mode 100644 index 0000000..c7763a6 --- /dev/null +++ b/!Tutorial/01_First/Random1.pas @@ -0,0 +1,10 @@ +// Генерация случайного числа + +begin + var i := Random(100); + Writeln('Случайное целое в диапазоне 0..99: ',i); + i := Random(2,5); + Writeln('Случайное целое в диапазоне 2..5: ',i); + var r: real := Random; + Writeln('Случайное вещественное в диапазоне [0,1): ',r); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/Random2.pas b/!Tutorial/01_First/Random2.pas new file mode 100644 index 0000000..2559b81 --- /dev/null +++ b/!Tutorial/01_First/Random2.pas @@ -0,0 +1,7 @@ +// Бросание кубиков + +begin + var (k1,k2) := Random2(1,6); + Writeln($'Очки на кубиках: {k1} {k2}'); + Writeln($'Сумма очков: {k1+k2}'); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/ReadString.pas b/!Tutorial/01_First/ReadString.pas new file mode 100644 index 0000000..297db1c --- /dev/null +++ b/!Tutorial/01_First/ReadString.pas @@ -0,0 +1,6 @@ +// Ввод строки + +begin + var имя := ReadString('Введите Ваше имя:'); + Writeln($'Здравствуйте, {имя}!'); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/Shl.pas b/!Tutorial/01_First/Shl.pas new file mode 100644 index 0000000..022eded --- /dev/null +++ b/!Tutorial/01_First/Shl.pas @@ -0,0 +1,8 @@ +// Демонстрация операции shl +begin + Writeln('Степени двойки'); + Writeln(' n 2^n'); + for var i:=0 to 30 do + Writeln(i:2,(1 shl i):12); +end. + diff --git a/!Tutorial/01_First/StandFun.pas b/!Tutorial/01_First/StandFun.pas new file mode 100644 index 0000000..73c3791 --- /dev/null +++ b/!Tutorial/01_First/StandFun.pas @@ -0,0 +1,14 @@ +// Стандартные функции +var x: real; + +begin + write('Введите x: '); + Readln(x); + Writeln('Квадрат ',x,' равен ',Sqr(x)); + Writeln(x,' в степени 5 равно ',Power(x,5)); + Writeln('Квадратный корень из ',x,' равен ',Sqrt(x)); + Writeln('Модуль ',x,' равен ',Abs(x)); + Writeln('Натуральный логарифм ',x,' равен ',Ln(x)); + Writeln('Синус ',x,' равен ',Sin(x)); + Writeln('Косинус ',x,' равен ',Cos(x)); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/StandardTypes.pas b/!Tutorial/01_First/StandardTypes.pas new file mode 100644 index 0000000..67b01ef --- /dev/null +++ b/!Tutorial/01_First/StandardTypes.pas @@ -0,0 +1,33 @@ +/// Стандартные размерные типы данных и их размер +var + i: integer; + j: shortint; + k: smallint; + l: longint; // синоним integer + i64: int64; + b: byte; + w: word; + lw: longword; + car: cardinal; // синоним longword + ui64: uint64; + r: real; + d: double; // синоним real + sn: single; + c: char; + +begin + Writeln('sizeof(integer) = ':20, sizeof(integer)); + Writeln('sizeof(shortint) = ':20,sizeof(shortint)); + Writeln('sizeof(smallint) = ':20,sizeof(smallint)); + Writeln('sizeof(longint) = ':20, sizeof(longint)); + Writeln('sizeof(int64) = ':20, sizeof(int64)); + Writeln('sizeof(byte) = ':20, sizeof(byte)); + Writeln('sizeof(word) = ':20, sizeof(word)); + Writeln('sizeof(longword) = ':20,sizeof(longword)); + Writeln('sizeof(cardinal) = ':20,sizeof(cardinal)); + Writeln('sizeof(uint64) = ':20, sizeof(uint64)); + Writeln('sizeof(real) = ':20, sizeof(real)); + Writeln('sizeof(double) = ':20, sizeof(double)); + Writeln('sizeof(single) = ':20, sizeof(single)); + Writeln('sizeof(char) = ':20, sizeof(char)); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/StringPlus.pas b/!Tutorial/01_First/StringPlus.pas new file mode 100644 index 0000000..aa5fa0d --- /dev/null +++ b/!Tutorial/01_First/StringPlus.pas @@ -0,0 +1,8 @@ +// Сложение строк +var s1: string := 'Pascal'; +var s2: string := 'NET'; + +begin + Writeln(s2+'-'+s1); + Writeln(s1+'.'+s2); +end. \ No newline at end of file diff --git a/!Tutorial/01_First/WriteFormat.pas b/!Tutorial/01_First/WriteFormat.pas new file mode 100644 index 0000000..81b23cc --- /dev/null +++ b/!Tutorial/01_First/WriteFormat.pas @@ -0,0 +1,11 @@ +/// Использование процедуры WritelnFormat +begin + // Вывод в обратном порядке + WritelnFormat('{2},{1},{0}',1,2,3); + // Вывод фигурных скобочек + WritelnFormat('{{}}{0}','Вывод фигурных скобочек в форматной строке'); + // Задание количества знаков после запятой для вещественного числа + WritelnFormat('{0:f3}',3.1415); + // Задание ширины поля вывода + WritelnFormat('{0,10:f}',3.1415); +end. \ No newline at end of file diff --git a/!Tutorial/02_Errors/CompilerError1.pas b/!Tutorial/02_Errors/CompilerError1.pas new file mode 100644 index 0000000..fcba518 --- /dev/null +++ b/!Tutorial/02_Errors/CompilerError1.pas @@ -0,0 +1,8 @@ +// Исправьте ошибку компиляции. +// Обратите внимание, что курсор позиционируется в конце слова, вызвавшего ошибку +var i: integer + +begin + i := 2; + Writeln(i); +end. \ No newline at end of file diff --git a/!Tutorial/02_Errors/CompilerError2.pas b/!Tutorial/02_Errors/CompilerError2.pas new file mode 100644 index 0000000..6c173ae --- /dev/null +++ b/!Tutorial/02_Errors/CompilerError2.pas @@ -0,0 +1,5 @@ +// Исправьте ошибки компиляции. Опишите переменную r +begin + r := 2.5; + Witeln(r); +end. \ No newline at end of file diff --git a/!Tutorial/02_Errors/CompilerError3.pas b/!Tutorial/02_Errors/CompilerError3.pas new file mode 100644 index 0000000..7576e94 --- /dev/null +++ b/!Tutorial/02_Errors/CompilerError3.pas @@ -0,0 +1,8 @@ +// Исправьте ошибку компиляции. Не всегда надо "верить" тексту ошибки + +var k: real; + +begin + k := 2,5; + Writeln(r); +end. \ No newline at end of file diff --git a/!Tutorial/02_Errors/CompilerError4.pas b/!Tutorial/02_Errors/CompilerError4.pas new file mode 100644 index 0000000..f4ad2ff --- /dev/null +++ b/!Tutorial/02_Errors/CompilerError4.pas @@ -0,0 +1,6 @@ +// Исправьте ошибки компиляции, изменив тип переменной x +var x: integer; + +begin + x := 3/5; +end. \ No newline at end of file diff --git a/!Tutorial/02_Errors/RuntimeError1.pas b/!Tutorial/02_Errors/RuntimeError1.pas new file mode 100644 index 0000000..43a0e5e --- /dev/null +++ b/!Tutorial/02_Errors/RuntimeError1.pas @@ -0,0 +1,7 @@ +// Введите не число +// Посмотрите, как выглядит ошибка при выполнении программы +var i: integer; + +begin + Read(i); +end. \ No newline at end of file diff --git a/!Tutorial/02_Errors/RuntimeError2.pas b/!Tutorial/02_Errors/RuntimeError2.pas new file mode 100644 index 0000000..8c54da2 --- /dev/null +++ b/!Tutorial/02_Errors/RuntimeError2.pas @@ -0,0 +1,6 @@ +// Посмотрите, как выглядит ошибка выполнения при целочисленном делении на 0 +var i: integer := 0; + +begin + Write(2 div i); +end. \ No newline at end of file diff --git a/!Tutorial/02_Errors/RuntimeError3.pas b/!Tutorial/02_Errors/RuntimeError3.pas new file mode 100644 index 0000000..e4b336b --- /dev/null +++ b/!Tutorial/02_Errors/RuntimeError3.pas @@ -0,0 +1,6 @@ +// При вещественном делении на 0 ошибки не возникает +var r: real := 0; + +begin + Write(1/r); +end. \ No newline at end of file diff --git a/!Tutorial/02_Errors/RuntimeError4.pas b/!Tutorial/02_Errors/RuntimeError4.pas new file mode 100644 index 0000000..b11155c --- /dev/null +++ b/!Tutorial/02_Errors/RuntimeError4.pas @@ -0,0 +1,4 @@ +// При работе с вещественными числами невозможно получить ошибку выполнения +begin + Writeln(Sqrt(-1)); +end. \ No newline at end of file diff --git a/!Tutorial/03_Robot_Drawman/DMa1.pas b/!Tutorial/03_Robot_Drawman/DMa1.pas new file mode 100644 index 0000000..fde4bef --- /dev/null +++ b/!Tutorial/03_Robot_Drawman/DMa1.pas @@ -0,0 +1,14 @@ +// Исполнитель Чертежник - отличное средство для начального обучения программированию +// школьников младших и средних классов +// Для генерации шаблона задания нажмите Ctrl-L и наберите DM и имя задания +uses Drawman; + +begin + Task('a1'); + ToPoint(2,3); + PenDown; + OnVector(1,2); + PenUp; + ToPoint(0,0); +end. + diff --git a/!Tutorial/03_Robot_Drawman/RBa1.pas b/!Tutorial/03_Robot_Drawman/RBa1.pas new file mode 100644 index 0000000..e7c5926 --- /dev/null +++ b/!Tutorial/03_Robot_Drawman/RBa1.pas @@ -0,0 +1,16 @@ +// Исполнитель Робот - отличное средство для начального обучения программированию +// школьников младших и средних классов +// Для генерации шаблона задания нажмите Ctrl-L и наберите RB и имя задания +uses Robot; + +begin + Task('a1'); + Right; Right; Right; Right; + Up; + Left; Paint; + Left; Paint; + Left; Paint; + Left; Paint; + Left; +end. + diff --git a/!Tutorial/04_Graphics/Gr1.pas b/!Tutorial/04_Graphics/Gr1.pas new file mode 100644 index 0000000..1b3eb12 --- /dev/null +++ b/!Tutorial/04_Graphics/Gr1.pas @@ -0,0 +1,8 @@ +// Графика. Линии. Размеры окна. Заголовок окна +uses GraphABC; + +begin + Window.Title := 'Первая графическая программа'; + Line(0,0,Window.Width-1,Window.Height-1); + Line(0,Window.Height-1,Window.Width-1,0); +end. \ No newline at end of file diff --git a/!Tutorial/04_Graphics/Gr2.pas b/!Tutorial/04_Graphics/Gr2.pas new file mode 100644 index 0000000..0471c2a --- /dev/null +++ b/!Tutorial/04_Graphics/Gr2.pas @@ -0,0 +1,8 @@ +// Графика. Точка. Случайный цвет. Скорость работы +uses GraphABC,Utils; + +begin + for var i:=1 to 100000 do + SetPixel(Random(Window.Width),Random(Window.Height),clRandom); + writeln('Время работы: ',Milliseconds/1000,' секунд'); +end. \ No newline at end of file diff --git a/!Tutorial/04_Graphics/Gr3.pas b/!Tutorial/04_Graphics/Gr3.pas new file mode 100644 index 0000000..de0d7ae --- /dev/null +++ b/!Tutorial/04_Graphics/Gr3.pas @@ -0,0 +1,14 @@ +// Графика. Свойства кисти и пера +uses GraphABC; + +begin + Window.Title := 'Свойства кисти и пера'; + Pen.Color := Color.Red; + Pen.Width := 3; + Pen.Style := psDashDot; + Brush.Style := bsHatch; + Brush.Color := Color.Green; + Brush.Hatch := bhDiagonalBrick; + Brush.HatchBackgroundColor := Color.Bisque; + Rectangle(20, 20, Window.Width - 20, Window.Height - 20); +end. \ No newline at end of file diff --git a/!Tutorial/04_Graphics/Gr4.pas b/!Tutorial/04_Graphics/Gr4.pas new file mode 100644 index 0000000..7c060dd --- /dev/null +++ b/!Tutorial/04_Graphics/Gr4.pas @@ -0,0 +1,22 @@ +// Графика. Draw и Fill - процедуры +uses GraphABC; + +begin + Window.Title := 'Draw и Fill - процедуры'; + for var i := 1 to 100 do + begin + Pen.Color := clRandom; + var x := Random(Window.Width-100); + var y := Random(Window.Height-100); + DrawRectangle(x,y,x+Random(100),y+Random(100)); + Sleep(30); + end; + for var i := 1 to 100 do + begin + Brush.Color := clRandom; + var x := Random(Window.Width-100); + var y := Random(Window.Height-100); + FillRectangle(x,y,x+Random(100),y+Random(100)); + Sleep(30); + end; +end. \ No newline at end of file diff --git a/!Tutorial/04_Graphics/Gr5.pas b/!Tutorial/04_Graphics/Gr5.pas new file mode 100644 index 0000000..979566e --- /dev/null +++ b/!Tutorial/04_Graphics/Gr5.pas @@ -0,0 +1,20 @@ +// Графика. Pie +uses GraphABC; + +const r = 200; + +begin + Window.Title := 'Круговая гистограмма'; + var x := Window.Center.X; + var y := Window.Center.Y; + Brush.Color := clRandom; + Pie(x,y,r,0,30); + Brush.Color := clRandom; + Pie(x,y,r,30,110); + Brush.Color := clRandom; + Pie(x,y,r,110,160); + Brush.Color := clRandom; + Pie(x,y,r,160,280); + Brush.Color := clRandom; + Pie(x,y,r,280,360); +end. \ No newline at end of file diff --git a/!Tutorial/04_Graphics/Gr6.pas b/!Tutorial/04_Graphics/Gr6.pas new file mode 100644 index 0000000..6430311 --- /dev/null +++ b/!Tutorial/04_Graphics/Gr6.pas @@ -0,0 +1,19 @@ +// Графика. Прозрачность +uses GraphABC; + +begin + Window.Title := 'Демонстрация прозрачности'; + + Brush.Color := clRed; + FillRectangle(50,50,100,Window.Height - 50); + Brush.Color := clGreen; + FillRectangle(150,50,200,Window.Height - 50); + Brush.Color := clBlue; + FillRectangle(250,50,300,Window.Height - 50); + Brush.Color := ARGB(127,255,0,0); + FillRectangle(20,100,420,150); + Brush.Color := ARGB(63,0,127,0); + FillRectangle(20,200,420,250); + Brush.Color := ARGB(31,0,0,255); + FillRectangle(20,300,420,350); +end. \ No newline at end of file diff --git a/!Tutorial/04_Graphics/Gr7.pas b/!Tutorial/04_Graphics/Gr7.pas new file mode 100644 index 0000000..3eacff0 --- /dev/null +++ b/!Tutorial/04_Graphics/Gr7.pas @@ -0,0 +1,24 @@ +// Графика. Сохраниение изображения графического окна в файл и загрузка из файла +uses GraphABC; + +const + delay = 500; + filename = 'GraphWindow.bmp'; + +begin + Window.Title := 'Window.Save и Window.Load'; + SetWindowSize(320,240); + + for var x:=0 to Window.Width - 1 do + for var y:=0 to Window.Height - 1 do + SetPixel(x,y,RGB(x-2*y,y+x,y-2*x)); + + Window.Save(filename); + for var i := 1 to 5 do + begin + Window.Clear; + Sleep(delay); + Window.Load(filename); + Sleep(delay); + end; +end. \ No newline at end of file diff --git a/!Tutorial/04_Graphics/Gr8.pas b/!Tutorial/04_Graphics/Gr8.pas new file mode 100644 index 0000000..678a0a3 --- /dev/null +++ b/!Tutorial/04_Graphics/Gr8.pas @@ -0,0 +1,18 @@ +// Графика. Сглаживание +uses GraphABC; + +begin + Window.Title := 'Демонстрация сглаживания'; + TextOut(40,20,'Со сглаживанием'); + Pen.Width := 2; + + Ellipse(40,60,300,200); + Line(340,60,600,130); + Line(600,130,340,200); + + SetSmoothingOff; + TextOut(40,240,'Без сглаживания'); + Ellipse(40,280,300,420); + Line(340,280,600,350); + Line(600,350,340,420); +end. \ No newline at end of file diff --git a/!Tutorial/04_Graphics/GrAnim1.pas b/!Tutorial/04_Graphics/GrAnim1.pas new file mode 100644 index 0000000..67e0b2d --- /dev/null +++ b/!Tutorial/04_Graphics/GrAnim1.pas @@ -0,0 +1,14 @@ +// Графика. Пример "наивной" анимации. Эффект мерцания +uses GraphABC; + +begin + Window.Title := 'Демонстрация простой анимации'; + var y := 200; + Brush.Color := clGreen; + for var x := 70 to 500 do + begin + Window.Clear(clWhite); + Circle(x,y,50); + Sleep(3); + end; +end. \ No newline at end of file diff --git a/!Tutorial/04_Graphics/GrAnim2.pas b/!Tutorial/04_Graphics/GrAnim2.pas new file mode 100644 index 0000000..b88e170 --- /dev/null +++ b/!Tutorial/04_Graphics/GrAnim2.pas @@ -0,0 +1,18 @@ +// Графика. Использование LockDrawing-Redraw. Мерцание отсутствует +uses GraphABC; + +begin + Window.Title := 'Анимация без мерцания'; + var y := 200; + Brush.Color := clGreen; + // Отключаем рисование в окне + LockDrawing; + for var x := 70 to 500 do + begin + Window.Clear(clWhite); + Circle(x,y,50); + // Перерисовываем окно из внеэранного буфера + Redraw; + Sleep(3); + end; +end. \ No newline at end of file diff --git a/!Tutorial/04_Graphics/GrCoord1.pas b/!Tutorial/04_Graphics/GrCoord1.pas new file mode 100644 index 0000000..8da8ac8 --- /dev/null +++ b/!Tutorial/04_Graphics/GrCoord1.pas @@ -0,0 +1,19 @@ +// Демонстрация преобразований системы координат +uses GraphABC; + +begin + Window.Title := 'Преобразования системы координат'; + Window.IsFixedSize := True; + + // Поворот + Coordinate.Angle := 30; + // Масштаб + Coordinate.Scale := 3; + // Начало координат - в центре окна + Coordinate.Origin := Window.Center; + + Brush.Color := clMoneyGreen; + Ellipse(-50,-20,50,20); + Line(-70,0,70,0); + Line(0,-40,0,40); +end. diff --git a/!Tutorial/04_Graphics/GrCoord2.pas b/!Tutorial/04_Graphics/GrCoord2.pas new file mode 100644 index 0000000..e81b9b6 --- /dev/null +++ b/!Tutorial/04_Graphics/GrCoord2.pas @@ -0,0 +1,15 @@ +// Демонстрация преобразований системы координат +uses GraphABC; + +begin + Window.Title := 'Преобразования системы координат'; + Window.IsFixedSize := True; + + Coordinate.Origin := Window.Center; + Circle(0,0,200); + for var i := 1 to 12 do + begin + Circle(0,180,10); + Coordinate.Angle := Coordinate.Angle + 30; + end; +end. diff --git a/!Tutorial/04_Graphics/GrCoord3.pas b/!Tutorial/04_Graphics/GrCoord3.pas new file mode 100644 index 0000000..515de5f --- /dev/null +++ b/!Tutorial/04_Graphics/GrCoord3.pas @@ -0,0 +1,17 @@ +uses GraphABC; + +begin + Coordinate.Origin := Window.Center; + Coordinate.SetMathematic; + while True do + begin + LockDrawing; + ClearWindow; + Ellipse(-120,-70,120,70); + Line(0,0,200,0); + Line(0,0,0,200); + Redraw; + Coordinate.Angle := Coordinate.Angle + 1; + Sleep(100); + end; +end. diff --git a/!Tutorial/04_Graphics/GrFont1.pas b/!Tutorial/04_Graphics/GrFont1.pas new file mode 100644 index 0000000..4044696 --- /dev/null +++ b/!Tutorial/04_Graphics/GrFont1.pas @@ -0,0 +1,23 @@ +// Демонстрация работы со шрифтами +uses GraphABC; + +begin + Window.Title := 'Шрифты'; + SetWindowSize(760,460); + Font.Name := 'Arial'; + Font.Style := fsBoldItalic; + for var i:=4 to 14 do + begin + Font.Size := 2*i; + Font.Color := clRandom; + TextOut(30,2*i*i-15,'PascalABC.NET'); + end; + Font.Name := 'Times New Roman'; + Font.Style := fsBoldUnderline; + for var i:=4 to 14 do + begin + Font.Size := 2*i; + Font.Color := clRandom; + TextOut(400,2*i*i-15,'PascalABC.NET'); + end; +end. diff --git a/!Tutorial/04_Graphics/GrFont2.pas b/!Tutorial/04_Graphics/GrFont2.pas new file mode 100644 index 0000000..17947a8 --- /dev/null +++ b/!Tutorial/04_Graphics/GrFont2.pas @@ -0,0 +1,16 @@ +// Демонстрация использования TextWidth и TextHeight +uses GraphABC; + +const s = 'Width & Height'; + +begin + Window.Title := 'Текст по центру'; + Window.IsFixedSize := True; + SetWindowSize(700,300); + Window.Center; + Font.Name := 'Times'; + Font.Size := 50; + var tw := TextWidth(s); + var th := TextHeight(s); + TextOut((Window.Width-tw) div 2,(Window.Height-th) div 2,s); +end. diff --git a/!Tutorial/04_Graphics/GrPoly.pas b/!Tutorial/04_Graphics/GrPoly.pas new file mode 100644 index 0000000..68f8031 --- /dev/null +++ b/!Tutorial/04_Graphics/GrPoly.pas @@ -0,0 +1,18 @@ +// Процедуры Polyline, Polygon, Curve, ClosedCurve +// Перенос начала системы координат +uses GraphABC; + +var a: array of Point := (new Point(0,0), new Point(50,170), new Point(100,100), new Point(150,170), new Point(200,0)); + +begin + Window.Title := 'Рисование по массиву точек'; + Brush.Color := Color.Beige; + Coordinate.SetOrigin(60,30); + Polyline(a); + Coordinate.OriginX := 360; + Polygon(a); + Coordinate.Origin := new Point(60,250); + Curve(a); + Coordinate.OriginX := 360; + ClosedCurve(a); +end. diff --git a/!Tutorial/04a_ABCObjects/ABC1.pas b/!Tutorial/04a_ABCObjects/ABC1.pas new file mode 100644 index 0000000..0fe49e8 --- /dev/null +++ b/!Tutorial/04a_ABCObjects/ABC1.pas @@ -0,0 +1,40 @@ +// Модуль ABCObjects. Изменение свойств объекта +uses ABCObjects,GraphABC; + +const delay = 300; + +procedure Pause; +begin + Sleep(delay); +end; + +var + r: RectangleABC; + z: StarABC; + +begin + Window.Title := 'ABCObjects: свойства графических объектов'; + z := new StarABC(Window.Center.X,Window.Center.Y,70,30,6,Color.Green); + r := new RectangleABC(100,100,200,100,Color.Gold); + Pause; + r.Center := Window.Center; + Pause; + r.Height := 70; + Pause; + r.Width := 220; + Pause; + z.Radius := 150; + Pause; + z.Color := Color.LightCoral; + Pause; + z.Count := 5; + Pause; + + r.Text := 'PascalABC.NET'; + r.Color := Color.Gainsboro; + Pause; + r.BorderWidth := 3; + r.BorderColor := Color.Blue; + Pause; + r.Center := Window.Center; +end. diff --git a/!Tutorial/05_IfCaseBoolean/Case1.pas b/!Tutorial/05_IfCaseBoolean/Case1.pas new file mode 100644 index 0000000..9f2c5a2 --- /dev/null +++ b/!Tutorial/05_IfCaseBoolean/Case1.pas @@ -0,0 +1,15 @@ +// Оператор выбора +var x: integer; + +begin + writeln('Введите оценку (1..5): '); + readln(x); + case x of + 1: writeln('Единица'); + 2: writeln('Двойка'); + 3: writeln('Тройка'); + 4: writeln('Четверка'); + 5: writeln('Пятерка'); + else writeln('Такой оценки нет'); + end; +end. \ No newline at end of file diff --git a/!Tutorial/05_IfCaseBoolean/Case2.pas b/!Tutorial/05_IfCaseBoolean/Case2.pas new file mode 100644 index 0000000..a6b257b --- /dev/null +++ b/!Tutorial/05_IfCaseBoolean/Case2.pas @@ -0,0 +1,12 @@ +// Оператор выбора +var day: integer; + +begin + writeln('Введите номер дня недели (1..7): '); + readln(day); + case day of + 1..5: writeln('Будний'); + 6,7: writeln('Выходной'); + else writeln('Неверный день недели'); + end; +end. \ No newline at end of file diff --git a/!Tutorial/05_IfCaseBoolean/Case3.pas b/!Tutorial/05_IfCaseBoolean/Case3.pas new file mode 100644 index 0000000..bd061c0 --- /dev/null +++ b/!Tutorial/05_IfCaseBoolean/Case3.pas @@ -0,0 +1,12 @@ +// Оператор выбора +var c: char; + +begin + writeln('Введите символ: '); + readln(c); + case c of + '0'..'9': writeln('Это цифра'); + 'a'..'z','A'..'Z': writeln('Это английская буква'); + 'а'..'я','А'..'Я': writeln('Это русская буква'); + end; +end. \ No newline at end of file diff --git a/!Tutorial/05_IfCaseBoolean/Case4.pas b/!Tutorial/05_IfCaseBoolean/Case4.pas new file mode 100644 index 0000000..ce699c1 --- /dev/null +++ b/!Tutorial/05_IfCaseBoolean/Case4.pas @@ -0,0 +1,14 @@ +// Оператор выбора. Случайная фигура +uses GraphABC; + +begin + SetWindowSize(400,300); + var t := Random(1,5); + case t of + 1: Circle(200,150,100); + 2: Rectangle(100,100,300,200); + 3: Ellipse(100,100,300,200); + 4: RoundRect(100,100,300,200,20,20); + 5: Line(100,100,300,200); + end; +end. \ No newline at end of file diff --git a/!Tutorial/05_IfCaseBoolean/If1.pas b/!Tutorial/05_IfCaseBoolean/If1.pas new file mode 100644 index 0000000..a76e753 --- /dev/null +++ b/!Tutorial/05_IfCaseBoolean/If1.pas @@ -0,0 +1,10 @@ +// Условный оператор. Полная форма +var + x: integer := 5; + y: integer := 3; + +begin + if x=1) and (x<=9) then + writeln('Однозначное число'); + // Odd - функция, возвращающая True только если x - нечетно + if Odd(x) and (x>=10) and (x<=99) then + writeln('Нечетное двузначное число'); + if (x=3) or (x=9) or (x=27) or (x=81) then + writeln('Степень тройки'); +end. \ No newline at end of file diff --git a/!Tutorial/05_IfCaseBoolean/If4.pas b/!Tutorial/05_IfCaseBoolean/If4.pas new file mode 100644 index 0000000..41008a9 --- /dev/null +++ b/!Tutorial/05_IfCaseBoolean/If4.pas @@ -0,0 +1,18 @@ +// Вложенные условные операторы +var x: integer; + +begin + writeln('Введите оценку (1..5): '); + readln(x); + if (x=1) then + writeln('Единица') + else if (x=2) then + writeln('Двойка') + else if (x=3) then + writeln('Тройка') + else if (x=4) then + writeln('Четверка') + else if (x=5) then + writeln('Пятерка') + else writeln('Такой оценки нет') +end. \ No newline at end of file diff --git a/!Tutorial/05_IfCaseBoolean/If5.pas b/!Tutorial/05_IfCaseBoolean/If5.pas new file mode 100644 index 0000000..074bf78 --- /dev/null +++ b/!Tutorial/05_IfCaseBoolean/If5.pas @@ -0,0 +1,19 @@ +// Вложенные условные операторы. Антонимы +var s: string; + +begin + writeln('Введите слово из списка (черный,высокий,свет,радость,умный): '); + readln(s); + write('Антоним: '); + if (s='черный') then + writeln('белый') + else if (s='высокий') then + writeln('низкий') + else if (s='свет') then + writeln('тьма') + else if (s='радость') then + writeln('горе') + else if (s='умный') then + writeln('глупый') + else writeln('Такого слова в списке нет') +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/For1.pas b/!Tutorial/06_ForWhileRepeat/For1.pas new file mode 100644 index 0000000..5545f14 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/For1.pas @@ -0,0 +1,22 @@ +// Цикл for + +const n = 20; + +var i: integer; + +begin + writeln('Числа от 1 до ',n,':'); + for i:=1 to n do + write(i,' '); + writeln; + writeln; + writeln('Числа от ',n,' до 1:'); + for i:=n downto 1 do + write(i,' '); + writeln; + writeln; + writeln('Маленькие английские буквы:'); + for c: char := 'a' to 'z' do + write(c,' '); + writeln; +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/For1a.pas b/!Tutorial/06_ForWhileRepeat/For1a.pas new file mode 100644 index 0000000..600a4a7 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/For1a.pas @@ -0,0 +1,38 @@ +// Цикл for. Шаг цикла 2 +const n = 25; + +var i: integer; + +begin + writeln('Четные числа от 1 до ',2*n); + for i:=1 to n do + write(2*i,' '); + writeln; + writeln; + + writeln('Четные числа от 1 до ',2*n); + var x := 2; + for i:=1 to n do + begin + write(x,' '); + x += 2; + end; + writeln; + writeln; + + writeln('Нечетные числа от 1 до ',2*n); + for i:=1 to n do + write(2*i-1,' '); + writeln; + writeln; + + writeln('Нечетные числа от 1 до ',2*n); + x := 1; + for i:=1 to n do + begin + write(x,' '); + x += 2; + end; + writeln; + writeln; +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/For2.pas b/!Tutorial/06_ForWhileRepeat/For2.pas new file mode 100644 index 0000000..f94af54 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/For2.pas @@ -0,0 +1,15 @@ +// Цикл for. Последовательность случайных чисел + +const n = 20; + +var i: integer; + +begin + write('Случайные оценки: '); + for i:=1 to n do + write(Random(2,5),' '); + writeln; + write('Случайные целые от 1 до 99: '); + for i:=n downto 1 do + write(Random(1,99),' '); +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/For3.pas b/!Tutorial/06_ForWhileRepeat/For3.pas new file mode 100644 index 0000000..2693461 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/For3.pas @@ -0,0 +1,11 @@ +// Цикл for. Последовательность случайных чисел +const n = 20; + +begin + for var i:=1 to n do + write(Random(2,5),' '); + writeln; + write('Случайные целые от 1 до 99: '); + for var i:=n downto 1 do + write(Random(1,99),' '); +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/For4.pas b/!Tutorial/06_ForWhileRepeat/For4.pas new file mode 100644 index 0000000..56a72f0 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/For4.pas @@ -0,0 +1,8 @@ +// Цикл for. Сумма всех двузначных чисел + +begin + var s := 0; + for var i:=10 to 99 do + s += i; + Println('Сумма всех двузначных чисел =',s); +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/For5.pas b/!Tutorial/06_ForWhileRepeat/For5.pas new file mode 100644 index 0000000..13de718 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/For5.pas @@ -0,0 +1,13 @@ +// Цикл for. Вычисление a в степени n + +begin + var a := ReadlnReal('Введите a:'); + var n := ReadlnInteger('Введите n:'); + + var p := 1.0; + for var i:=1 to n do + p *= a; + Println($'{a} в степени {n} = {p}'); + + Println($'Стандартная операция {a} ** {n} = {a ** n}'); +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/For6.pas b/!Tutorial/06_ForWhileRepeat/For6.pas new file mode 100644 index 0000000..3290467 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/For6.pas @@ -0,0 +1,15 @@ +// Цикл for. Таблица функции +var + a: real := 0; + b: real := 4; + n: integer := 16; + +begin + var h := (b-a)/n; + var x := a; + for var i:=0 to n do + begin + WritelnFormat('{0:f2} {1:f4}',x,sqrt(x)); + x += h; + end; +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/For7.pas b/!Tutorial/06_ForWhileRepeat/For7.pas new file mode 100644 index 0000000..fdee8f3 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/For7.pas @@ -0,0 +1,17 @@ +// for. +const n = 25; + +begin + var a := 1; + var b := 1; + writeln(' :'); + write(a,' ',b,' '); + + for var i:=3 to n do + begin + var c := a + b; + write(c,' '); + a := b; + b := c; + end; +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/For8.pas b/!Tutorial/06_ForWhileRepeat/For8.pas new file mode 100644 index 0000000..5167640 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/For8.pas @@ -0,0 +1,17 @@ +// Цикл for. Максимум из введенных чисел +const n = 10; + +var max: real; + +begin + writelnFormat('Введите {0} чисел',n); + max := integer.MinValue; // самое маленькое целое число + for var i:=1 to n do + begin + var x: real; + read(x); + if x>max then + max := x; + end; + writeln('Максимальное равно ',max); +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/For9.pas b/!Tutorial/06_ForWhileRepeat/For9.pas new file mode 100644 index 0000000..7ca1357 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/For9.pas @@ -0,0 +1,26 @@ +// Цикл for. Поиск значения. Оператор break +const n = 10; + +var + k: integer; + found: boolean; + +begin + writeln('Введите число для поиска: '); + readln(k); + writelnFormat('Введите {0} чисел',n); + found := False; + for var i:=1 to n do + begin + var x: integer; + read(x); + if x=k then + begin + found := True; + break; + end; + end; + if found then + writeln('Найдено') + else writeln('Не найдено'); +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/ForFor1.pas b/!Tutorial/06_ForWhileRepeat/ForFor1.pas new file mode 100644 index 0000000..c6f2b13 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/ForFor1.pas @@ -0,0 +1,12 @@ +// Вложенные циклы for. Таблица умножения +const n = 9; + +begin + writeln('Таблица умножения'); + for var i:=1 to n do + begin + for var j:=1 to n do + write(i*j:4); + writeln; + end; +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/ForFor2.pas b/!Tutorial/06_ForWhileRepeat/ForFor2.pas new file mode 100644 index 0000000..002e2d5 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/ForFor2.pas @@ -0,0 +1,20 @@ +// Вложенные циклы for +const n = 6; + +begin + for var i:=1 to n do + begin + for var j:=1 to i do + write('*'); + writeln; + end; + writeln; + for var i:=1 to n do + begin + for var j:=1 to 3*n do + if Odd(i+j) then + write('*') + else write(' '); + writeln; + end; +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/ForGra1.pas b/!Tutorial/06_ForWhileRepeat/ForGra1.pas new file mode 100644 index 0000000..a702817 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/ForGra1.pas @@ -0,0 +1,16 @@ +// Вложенные циклы for. Сетка из квадртов +uses GraphABC; + +const + sz = 35; + zz = 5; + +begin + var h := sz+zz; + for var nx:=0 to Window.Width div h do + for var ny:=0 to Window.Height div h do + begin + Brush.Color := clRandom; + Rectangle(zz+nx*h,zz+ny*h,zz+nx*h+sz,zz+ny*h+sz); + end; +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/algo1.pas b/!Tutorial/06_ForWhileRepeat/algo1.pas new file mode 100644 index 0000000..804e656 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/algo1.pas @@ -0,0 +1,21 @@ +// Алгоритм определения простоты числа +var + N: integer; + IsPrime: boolean; + +begin + writeln('Введите число: '); + readln(N); + + IsPrime := True; + for var i:=2 to round(sqrt(N)) do // если число составное, то один из его сомножителей <= (sqrt(N)) + if N mod i = 0 then + begin + IsPrime := False; + break; + end; + + if IsPrime then + writeln('Число ',N,' простое') + else writeln('Число ',N,' составное'); +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/algo2.pas b/!Tutorial/06_ForWhileRepeat/algo2.pas new file mode 100644 index 0000000..1d02bcd --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/algo2.pas @@ -0,0 +1,21 @@ +// Алгоритм вычисления значения многочлена в точке x по схеме Горнера +const n=5; + +var + x,a: real; + +begin + writeln('Введите значение x: '); + readln(x); + + writeln('Введите коэффициенты многочлена (',n+1,' штук): '); + read(a); + var s := a; + for var i:=1 to n do + begin + read(a); + s := s*x + a; + end; + + writeln('Значение многочлена в точке ',x,' равно ',s); +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/repeat1.pas b/!Tutorial/06_ForWhileRepeat/repeat1.pas new file mode 100644 index 0000000..6621f57 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/repeat1.pas @@ -0,0 +1,12 @@ +// Цикл repeat. Контроль ввода +var mark: integer; + +begin + repeat + writeln('Введите оценку (2..5): '); + readln(mark); + if (mark<2) or (mark>5) then + writeln('Оценка неверная. Повторите ввод'); + until (mark>=2) and (mark<=5); + writeln('Вы ввели оценку ',mark); +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/repeat2.pas b/!Tutorial/06_ForWhileRepeat/repeat2.pas new file mode 100644 index 0000000..da416f8 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/repeat2.pas @@ -0,0 +1,13 @@ +// Цикл repeat. Алгоритм Евклида нахождения наибольшего общего делителя +var A,B: integer; + +begin + write('Введите два целых числа: '); + readln(A,B); + repeat + var C := A mod B; + A := B; + B := C; + until B=0; + write('Наибольший общий делитель = ',A); +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/while1.pas b/!Tutorial/06_ForWhileRepeat/while1.pas new file mode 100644 index 0000000..bf8f623 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/while1.pas @@ -0,0 +1,12 @@ +// Цикл while. Вывод чисел с шагом 3 +const n = 60; + +begin + writeln('Числа от 1 до ',n,', кратные 3'); + var x := 3; + while x<=n do + begin + write(x,' '); + x += 3; + end; +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/while2.pas b/!Tutorial/06_ForWhileRepeat/while2.pas new file mode 100644 index 0000000..ff99964 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/while2.pas @@ -0,0 +1,12 @@ +// Цикл while. Степени 2 +begin + writeln('Степени 2'); + var i := 1; + var p := 1; + while i<32 do + begin + writeln(i:2,p:12); + i += 1; + p *= 2; + end; +end. \ No newline at end of file diff --git a/!Tutorial/06_ForWhileRepeat/while3.pas b/!Tutorial/06_ForWhileRepeat/while3.pas new file mode 100644 index 0000000..6840652 --- /dev/null +++ b/!Tutorial/06_ForWhileRepeat/while3.pas @@ -0,0 +1,18 @@ +// Цикл while. Сумма цифр положительного числа + +begin + var m := ReadlnInteger('Введите положительное число: '); + + Print('Цифры числа в обратном порядке:'); + var s := 0; + while m>0 do + begin + var digit := m mod 10; + Print(digit); + s += digit; + m := m div 10; + end; + + Println; + Println('Сумма цифр =',s); +end. \ No newline at end of file diff --git a/!Tutorial/07_CharString/Char1.pas b/!Tutorial/07_CharString/Char1.pas new file mode 100644 index 0000000..0093f51 --- /dev/null +++ b/!Tutorial/07_CharString/Char1.pas @@ -0,0 +1,13 @@ +// Стандартные функции Ord Chr +var + i: integer; + c: char; + +begin + c := 'z'; + i := Ord(c); + writelnFormat('Код символа {0} в кодировке Windows равен {1}',c,i); + i := 193; + c := Chr(i); + writelnFormat('Символ с кодом {0} в кодировке Windows - это {1}',i,c); +end. \ No newline at end of file diff --git a/!Tutorial/07_CharString/Char2.pas b/!Tutorial/07_CharString/Char2.pas new file mode 100644 index 0000000..d89fd87 --- /dev/null +++ b/!Tutorial/07_CharString/Char2.pas @@ -0,0 +1,13 @@ +// Стандартные функции OrdUnicode ChrUnicode +var + i: integer; + c: char; + +begin + c := 'Д'; + i := OrdUnicode(c); + writelnFormat('Код символа {0} в кодировке Unicode равен {1}',c,i); + i := 1046; + c := ChrUnicode(i); + writelnFormat('Символ с кодом {0} в кодировке Unicode - это {1}',i,c); +end. \ No newline at end of file diff --git a/!Tutorial/07_CharString/Char3.pas b/!Tutorial/07_CharString/Char3.pas new file mode 100644 index 0000000..25dd827 --- /dev/null +++ b/!Tutorial/07_CharString/Char3.pas @@ -0,0 +1,9 @@ +// Стандартные функции UpperCase LowerCase +var c: char; + +begin + c := 'д'; + writelnFormat('Символ {0} в верхнем регистре: {1}',c,UpperCase(c)); + c := 'F'; + writelnFormat('Символ {0} в нижнем регистре: {1}',c,LowerCase(c)); +end. \ No newline at end of file diff --git a/!Tutorial/07_CharString/CharTable.pas b/!Tutorial/07_CharString/CharTable.pas new file mode 100644 index 0000000..220cb62 --- /dev/null +++ b/!Tutorial/07_CharString/CharTable.pas @@ -0,0 +1,8 @@ +// Таблица символов и их кодов +begin + for var i:=32 to 255 do + begin + write(i:4,chr(i):2,' '); + if i mod 8 = 7 then writeln; + end; +end. diff --git a/!Tutorial/07_CharString/String1.pas b/!Tutorial/07_CharString/String1.pas new file mode 100644 index 0000000..d678534 --- /dev/null +++ b/!Tutorial/07_CharString/String1.pas @@ -0,0 +1,12 @@ +// Строки. Операция + и оператор +=. Доступ по индексу + +var s: string := 'Pascal'; + +begin + writeln(s); + s := s + '.'; + writeln(s); + s += 'NET'; + writeln(s); + writeln(s[1],' ',s[2],' ',s[3],' ',s[4],' ',s[5],' ',s[6]); +end. \ No newline at end of file diff --git a/!Tutorial/07_CharString/String2.pas b/!Tutorial/07_CharString/String2.pas new file mode 100644 index 0000000..a2a26c7 --- /dev/null +++ b/!Tutorial/07_CharString/String2.pas @@ -0,0 +1,14 @@ +// Строки. Процедура SetLength, функция Length и свойство Length + +var s: string; + +begin + writeln('Length(s) = ',Length(s)); + SetLength(s,3); + s[1] := 'N'; + s[2] := 'E'; + s[3] := 'T'; + writeln(s,' Length(s) = ',Length(s)); + for var i:= 1 to s.Length do + write(s[i],' '); +end. \ No newline at end of file diff --git a/!Tutorial/07_CharString/String3.pas b/!Tutorial/07_CharString/String3.pas new file mode 100644 index 0000000..5a2a97b --- /dev/null +++ b/!Tutorial/07_CharString/String3.pas @@ -0,0 +1,12 @@ +// Строки. Строка может иметь произвольную длину +var s: string; + +begin + s := 'abcdefghijklmnopqrstuvwxyz'; + s := s + Uppercase(s); + s += s; + s += s; + s += s; + writeln('Длина строки = ',s.Length); + writeln('Cтрока: ',s); +end. \ No newline at end of file diff --git a/!Tutorial/07_CharString/String4.pas b/!Tutorial/07_CharString/String4.pas new file mode 100644 index 0000000..7c765fc --- /dev/null +++ b/!Tutorial/07_CharString/String4.pas @@ -0,0 +1,12 @@ +// Строки фиксированной длины. Длина не может быть больше 255 +var + s: string[9]; + s1: shortstring; // shortstring = string[255] + slong: string; + +begin + slong := 'PascalABC.NET'; + writeln('Cтрока произвольной длины: ',slong); + s := slong; + writeln('Cтрока фиксированной длины обрезается: ',s); +end. \ No newline at end of file diff --git a/!Tutorial/07_CharString/String5.pas b/!Tutorial/07_CharString/String5.pas new file mode 100644 index 0000000..e4e6675 --- /dev/null +++ b/!Tutorial/07_CharString/String5.pas @@ -0,0 +1,18 @@ +// Строки. Стандартные подпрограммы работы со строками +var + s: string := ' Pascal__NET '; + s1: string := 'NET'; + +begin + writeln('Исходная строка: ''',s,''''); + s := Trim(s); + writeln('После вызова функции Trim: ''',s,''''); + var p := Pos(s1,s); + writelnFormat('Позиция подстроки ''{0}'' в строке ''{1}'' равна {2}',s1,s,p); + Delete(s,7,2); + writeln('После удаления символов __: ',s); + Insert('ABC.',s,7); + writeln('После вставки подстроки ''ABC.'': ',s); + writeln('Первая часть строки: ',Copy(s,1,9)); + writeln('Последняя часть строки: ',Copy(s,11,3)); +end. \ No newline at end of file diff --git a/!Tutorial/07_CharString/String6.pas b/!Tutorial/07_CharString/String6.pas new file mode 100644 index 0000000..609eb82 --- /dev/null +++ b/!Tutorial/07_CharString/String6.pas @@ -0,0 +1,18 @@ +// Строки. Методы класса string +var + s: string := ' Pascal__NET '; + s1: string := 'NET'; + +begin + writeln('Исходная строка: ''',s,''''); + s := s.Trim; + writeln('После вызова s.Trim: ''',s,''''); + var p := s.IndexOf(s1); // Индексация - с нуля + writelnFormat('Позиция подстроки ''{0}'' в строке ''{1}'' равна {2}',s1,s,p); + s := s.Remove(6,2); + writeln('После удаления символов __: ',s); + s := s.Insert(6,'ABC.'); + writeln('После вставки подстроки ''ABC.'': ',s); + writeln('Первая часть строки: ',s.Substring(0,9)); + writeln('Последняя часть строки: ',s.Substring(10,3)); +end. \ No newline at end of file diff --git a/!Tutorial/07_CharString/StringInteger1.pas b/!Tutorial/07_CharString/StringInteger1.pas new file mode 100644 index 0000000..484f912 --- /dev/null +++ b/!Tutorial/07_CharString/StringInteger1.pas @@ -0,0 +1,16 @@ +// Преобразование целое <-> строка +var + s: string; + i: integer; + +begin + // Преобразование целого в строку + i := 234; + s := IntToStr(i); + writelnFormat('Целое: {0}. После преобразования к строке: ''{1}''',i,s); + + // Преобразование строки в целое (может произойти исключение) + s := '567'; + i := StrToInt(s); + writelnFormat('Строка: ''{0}''. После преобразования к целому: {1}',s,i); +end. \ No newline at end of file diff --git a/!Tutorial/07_CharString/StringInteger2.pas b/!Tutorial/07_CharString/StringInteger2.pas new file mode 100644 index 0000000..5dfe155 --- /dev/null +++ b/!Tutorial/07_CharString/StringInteger2.pas @@ -0,0 +1,18 @@ +// Преобразование целое <-> строка в старом стиле (Val и Str) +var + s: string; + i: integer; + +begin + // Преобразование целого в строку + i := 234; + Str(i,s); + writelnFormat('Целое: {0}. После преобразования к строке: ''{1}''',i,s); + + // Преобразование строки в целое + s := '567'; + var err: integer; + Val(s,i,err); + if err=0 then + writelnFormat('Строка: ''{0}''. После преобразования к целому: {1}',s,i); +end. \ No newline at end of file diff --git a/!Tutorial/07_CharString/StringInteger3.pas b/!Tutorial/07_CharString/StringInteger3.pas new file mode 100644 index 0000000..ce86a50 --- /dev/null +++ b/!Tutorial/07_CharString/StringInteger3.pas @@ -0,0 +1,16 @@ +// Преобразование целое <-> строка в новом стиле +var + s: string; + i: integer; + +begin + // Преобразование целого в строку + i := 234; + s := i.ToString; + writelnFormat('Целое: {0}. После преобразования к строке: ''{1}''',i,s); + + // Преобразование строки в целое + s := '567'; + if integer.TryParse(s,i) then + writelnFormat('Строка: ''{0}''. После преобразования к целому: {1}',s,i); +end. \ No newline at end of file diff --git a/!Tutorial/07_CharString/StringReal1.pas b/!Tutorial/07_CharString/StringReal1.pas new file mode 100644 index 0000000..4b1037b --- /dev/null +++ b/!Tutorial/07_CharString/StringReal1.pas @@ -0,0 +1,16 @@ +// Преобразование вещественное <-> строка +var + s: string; + r: real; + +begin + // Преобразование целого в строку + r := 3.1415; + s := FloatToStr(r); + writelnFormat('Целое: {0}. После преобразования к строке: ''{1}''',r,s); + + // Преобразование строки в целое (может произойти исключение) + s := '3.1415'; + r := StrToFloat(s); + writelnFormat('Строка: ''{0}''. После преобразования к целому: {1}',s,r); +end. \ No newline at end of file diff --git a/!Tutorial/07_CharString/UpLowCase.pas b/!Tutorial/07_CharString/UpLowCase.pas new file mode 100644 index 0000000..2c73035 --- /dev/null +++ b/!Tutorial/07_CharString/UpLowCase.pas @@ -0,0 +1,22 @@ +// Использование стандартных функций UpperCase, LowerCase +var c: char; + +begin + for c:='a' to 'z' do + write(UpperCase(c)); + writeln; + for c:='A' to 'Z' do + write(LowerCase(c)); + writeln; + for c:='А' to 'Я' do + write(UpperCase(c)); + writeln; + for c:='а' to 'я' do + write(LowerCase(c)); + writeln; + var s := 'Папа у Васи силён в математике'; + s := UpperCase(s); + writeln(s); + s := LowerCase(s); + writeln(s); +end. diff --git a/!Tutorial/08_ProcFunc/Fun1.pas b/!Tutorial/08_ProcFunc/Fun1.pas new file mode 100644 index 0000000..9aeffb0 --- /dev/null +++ b/!Tutorial/08_ProcFunc/Fun1.pas @@ -0,0 +1,22 @@ +// Определение функции. Вывод таблицы ее значений + +function MyFun(x: real): real; +begin + Result := x*sin(x); +end; + +const + a = 0.0; + b = 2*Pi; + n = 10; + +begin + var h := (b-a)/n; + var x := a; + writeln('Таблица значений функции MyFun:'); + for var i := 0 to n do + begin + writeln(x:5:2,MyFun(x):10:4); + x += h; + end; +end. \ No newline at end of file diff --git a/!Tutorial/08_ProcFunc/Fun2.pas b/!Tutorial/08_ProcFunc/Fun2.pas new file mode 100644 index 0000000..4994822 --- /dev/null +++ b/!Tutorial/08_ProcFunc/Fun2.pas @@ -0,0 +1,17 @@ +// Функция Power + +function Power(x: real; n: integer): real; +begin + Result := 1; + for var i:=1 to n do + Result *= x; +end; + +var + x: real; + n: integer; + +begin + x := 2; n := 5; + writelnFormat('{0} в степени {1} = {2}',x,n,Power(x,n)); +end. \ No newline at end of file diff --git a/!Tutorial/08_ProcFunc/Proc1.pas b/!Tutorial/08_ProcFunc/Proc1.pas new file mode 100644 index 0000000..95f40b8 --- /dev/null +++ b/!Tutorial/08_ProcFunc/Proc1.pas @@ -0,0 +1,17 @@ +// Параметры процедур + +procedure Operations(a,b: integer); +begin + writeln(a,' + ',b,' = ',a+b); + writeln(a,' - ',b,' = ',a-b); + writeln(a,' * ',b,' = ',a*b); + writeln(a,' / ',b,' = ',a/b); + writeln(a,' div ',b,' = ',a div b); + writeln(a,' mod ',b,' = ',a mod b); +end; + +begin + Operations(5,3); + writeln; + Operations(7,4); +end. \ No newline at end of file diff --git a/!Tutorial/08_ProcFunc/Proc2.pas b/!Tutorial/08_ProcFunc/Proc2.pas new file mode 100644 index 0000000..c629366 --- /dev/null +++ b/!Tutorial/08_ProcFunc/Proc2.pas @@ -0,0 +1,22 @@ +// Параметры-переменные + +procedure DivMod(a,b: integer; var d,m: integer); +begin + d := a div b; + m := a mod b; +end; + +var + a,b: integer; + d,m: integer; + +begin + a := 7; + b := 3; + DivMod(a,b,d,m); + writelnFormat('{0} div {1} = {2}; {0} mod {1} = {3}',a,b,d,m); + a := 23; + b := 5; + DivMod(a,b,d,m); + writelnFormat('{0} div {1} = {2}; {0} mod {1} = {3}',a,b,d,m); +end. \ No newline at end of file diff --git a/!Tutorial/08_ProcFunc/Proc3.pas b/!Tutorial/08_ProcFunc/Proc3.pas new file mode 100644 index 0000000..ccbdb03 --- /dev/null +++ b/!Tutorial/08_ProcFunc/Proc3.pas @@ -0,0 +1,26 @@ +// Упаковка параметров в запись +uses GraphABC; + +type + Point = record + x,y: integer; + constructor (xx,yy: integer); + begin + x := xx; + y := yy; + end; + end; + +procedure Line(p1,p2: Point); +begin + GraphABC.Line(p1.x,p1.y,p2.x,p2.y); +end; + +begin + var p1 := new Point(10,10); + var p2 := new Point(10,210); + var p3 := new Point(210,10); + Line(p1,p2); + Line(p2,p3); + Line(p3,p1); +end. \ No newline at end of file diff --git a/!Tutorial/09_Arrays/DynArr1.pas b/!Tutorial/09_Arrays/DynArr1.pas new file mode 100644 index 0000000..3fc2eaf --- /dev/null +++ b/!Tutorial/09_Arrays/DynArr1.pas @@ -0,0 +1,14 @@ +// Использование динамического массива. +// Процедура SetLength выделения памяти под динамический массив +// Оператор foreach (массив доступен только на чтение) +var a: array of integer; + +begin + var n := 20; + SetLength(a,n); + for var i:=0 to a.Length-1 do + a[i] := Random(1,99); + writeln('Содержимое случайного динамического массива целых: '); + foreach var x in a do + Print(x); +end. \ No newline at end of file diff --git a/!Tutorial/09_Arrays/DynArr2.pas b/!Tutorial/09_Arrays/DynArr2.pas new file mode 100644 index 0000000..b5e877d --- /dev/null +++ b/!Tutorial/09_Arrays/DynArr2.pas @@ -0,0 +1,17 @@ +// Использование динамического массива. +var a: array of integer; + +begin + writeln('При присваивании динамических массивов две переменные начинают указывать на одну память:'); + var n := 20; + a := new integer[n]; // Другой способ выделения памяти + for var i:=0 to a.Length-1 do + a[i] := i; + + writeln('До присваивания b[5]: a[5]=',a[5]); + + var b: array of integer; + b := a; + b[5] := 666; + writeln('После присваивания b[5]: a[5]=',a[5]); +end. \ No newline at end of file diff --git a/!Tutorial/09_Arrays/DynArr3.pas b/!Tutorial/09_Arrays/DynArr3.pas new file mode 100644 index 0000000..8c7e97b --- /dev/null +++ b/!Tutorial/09_Arrays/DynArr3.pas @@ -0,0 +1,13 @@ +// Использование динамического массива. +var a: array of integer; + +begin + writeln('SetLength при повторном вызове не портит старые элементы:'); + SetLength(a,5); + for var i:=0 to a.Length-1 do + a[i] := i+1; + a.Println; + + SetLength(a,10); + a.Println; +end. \ No newline at end of file diff --git a/!Tutorial/09_Arrays/DynArr4.pas b/!Tutorial/09_Arrays/DynArr4.pas new file mode 100644 index 0000000..47fb8c9 --- /dev/null +++ b/!Tutorial/09_Arrays/DynArr4.pas @@ -0,0 +1,23 @@ +// Передача динамического массива в качестве параметра + +procedure WriteArr(a: array of integer); // var указывать не нужно, т.к. динамический массив является ссылкой на реальный объект +begin + foreach x: integer in a do + write(x,' '); + writeln; +end; + +procedure CreateRandomArr(var a: array of integer; n: integer); // var указывать нужно, т.к. в процедуре создается новый динамический массив +begin + a := new integer[n]; + for var i:=0 to a.Length-1 do + a[i] := Random(10); +end; + +var a: array of integer; + +begin + writeln('Случайный целый массив: '); + CreateRandomArr(a,30); + WriteArr(a); +end. \ No newline at end of file diff --git a/!Tutorial/09_Arrays/DynArrErr1.pas b/!Tutorial/09_Arrays/DynArrErr1.pas new file mode 100644 index 0000000..f8e2d51 --- /dev/null +++ b/!Tutorial/09_Arrays/DynArrErr1.pas @@ -0,0 +1,6 @@ +// Ошибка невыделения памяти для динамического массива +var a: array of integer; + +begin + a[0] := 666; +end. \ No newline at end of file diff --git a/!Tutorial/09_Arrays/DynArrErr2.pas b/!Tutorial/09_Arrays/DynArrErr2.pas new file mode 100644 index 0000000..cd1da4b --- /dev/null +++ b/!Tutorial/09_Arrays/DynArrErr2.pas @@ -0,0 +1,7 @@ +// Ошибка выхода за границы диапазона для динамического массива +var a: array of integer; + +begin + SetLength(a,10); + a[10] := 666; +end. \ No newline at end of file diff --git a/!Tutorial/09_Arrays/SortByChoice.pas b/!Tutorial/09_Arrays/SortByChoice.pas new file mode 100644 index 0000000..a0f618c --- /dev/null +++ b/!Tutorial/09_Arrays/SortByChoice.pas @@ -0,0 +1,42 @@ +// Сортировка выбором +procedure SortByChoice(a: array of real); +begin + for var i:=0 to a.Length-2 do + begin + var min := a[i]; + var ind := i; + for var j:=i+1 to a.Length-1 do + if a[j]0 then + writeln('Индекс первого элемента 7 равен ', ind) + else writeln('Элемент 7 отсутствует'); +end. \ No newline at end of file diff --git a/!Tutorial/09_Units/UnitInitFin/MainInitFinDemo.pas b/!Tutorial/09_Units/UnitInitFin/MainInitFinDemo.pas new file mode 100644 index 0000000..fb2a6d4 --- /dev/null +++ b/!Tutorial/09_Units/UnitInitFin/MainInitFinDemo.pas @@ -0,0 +1,7 @@ +// Демонстрация секций инициализации и финализации модулей +// Откройте модуль MyUnit, нажав на имени модуля правой мышью и выбрав пункт "Перейти к определению" +uses MyUnit; + +begin + writeln('Основная программа') +end. diff --git a/!Tutorial/09_Units/UnitInitFin/MyUnit.pas b/!Tutorial/09_Units/UnitInitFin/MyUnit.pas new file mode 100644 index 0000000..1887dbc --- /dev/null +++ b/!Tutorial/09_Units/UnitInitFin/MyUnit.pas @@ -0,0 +1,7 @@ +unit MyUnit; + +initialization + writeln('Секция инициализации. Выполняется до начала основной программы') +finalization + writeln('Секция финализации. Выполняется после окончания основной программы') +end. diff --git a/!Tutorial/09_Units/UnitNames/MainSameNames.pas b/!Tutorial/09_Units/UnitNames/MainSameNames.pas new file mode 100644 index 0000000..4f881ad --- /dev/null +++ b/!Tutorial/09_Units/UnitNames/MainSameNames.pas @@ -0,0 +1,7 @@ +// Алгоритм поиска имен в модулях +uses MyA,MyB; // Имена вначале ищутся в основной программе, а затем в модулях в порядке справа налево + +begin + p; // Вызывается MyB.p + MyA.p; // Если надо вызвать MyA.p, следует использовать имя p, уточненное именем модуля +end. diff --git a/!Tutorial/09_Units/UnitNames/MyA.pas b/!Tutorial/09_Units/UnitNames/MyA.pas new file mode 100644 index 0000000..7c8a67a --- /dev/null +++ b/!Tutorial/09_Units/UnitNames/MyA.pas @@ -0,0 +1,10 @@ +unit MyA; + +procedure p; +begin + writeln('MyA.p'); +end; + +begin + +end. diff --git a/!Tutorial/09_Units/UnitNames/MyB.pas b/!Tutorial/09_Units/UnitNames/MyB.pas new file mode 100644 index 0000000..a33cebb --- /dev/null +++ b/!Tutorial/09_Units/UnitNames/MyB.pas @@ -0,0 +1,10 @@ +unit MyB; + +procedure p; +begin + writeln('MyB.p'); +end; + +begin + +end. diff --git a/!Tutorial/09_Units/UnitStructure/MainProgram.pas b/!Tutorial/09_Units/UnitStructure/MainProgram.pas new file mode 100644 index 0000000..09db6bf --- /dev/null +++ b/!Tutorial/09_Units/UnitStructure/MainProgram.pas @@ -0,0 +1,13 @@ +uses MyUnit; // подключили модуль + +const Sz = 10; + +var a: IntArr; + +begin + Assert(sz<=Size,'Размер массива должен быть <='+Size.ToString); + FillArr(a,Sz); + writeln('Содержимое массива: '); + WriteArr(a,Sz); + writeln('Минимальный элемент: ',Min(a,Sz)); +end. diff --git a/!Tutorial/09_Units/UnitStructure/MyUnit.pas b/!Tutorial/09_Units/UnitStructure/MyUnit.pas new file mode 100644 index 0000000..87c1433 --- /dev/null +++ b/!Tutorial/09_Units/UnitStructure/MyUnit.pas @@ -0,0 +1,35 @@ +/// Модуль упрощенной структуры +unit MyUnit; // имя модуля должно совпадать с именем файла + +const Size = 100; + +type IntArr = array [1..Size] of integer; + +var Delimiter: string := ' '; + +// Документирующие комментарии отображаются при наведении на имя курсора мыши +/// Заполняет массив случайными числами +procedure FillArr(var a: IntArr; n: integer); +begin + for var i:=1 to n do + a[i] := Random(100); +end; + +/// Выводит массив +procedure WriteArr(const a: IntArr; n: integer); +begin + for var i:=1 to n do + write(a[i],Delimiter); + writeln; +end; + +/// Возвращает минимальный элемент в массиве +function Min(const a: IntArr; n: integer): integer; +begin + Result := a[1]; + for var i:=1 to n do + if Result>a[i] then + Result := a[i]; +end; + +end. diff --git a/!Tutorial/10_Matrices/Matr1.pas b/!Tutorial/10_Matrices/Matr1.pas new file mode 100644 index 0000000..9033bd4 --- /dev/null +++ b/!Tutorial/10_Matrices/Matr1.pas @@ -0,0 +1,40 @@ +// Поиск значения в случайной матрице. Использование оператора goto +const + sz = 10; + m = 4; + n = 5; + +type Matrix = array [1..sz,1..sz] of integer; + +label 1; + +var matr: Matrix; + +begin + // Заполнение матрицы m x n случайными числами + for var i := 1 to m do + for var j := 1 to n do + matr[i,j] := Random(100); + + // Вывод матрицы + for var i := 1 to m do + begin + for var j := 1 to n do + write(matr[i,j]:3); + writeln; + end; + + // Есть ли в матрице элемент 5? + var found5 := False; + for var i := 1 to m do + for var j := 1 to n do + if matr[i,j]=5 then + begin + found5 := True; + goto 1; // Ай как нехорошо! Но это лучший способ выхода из двух вложенных циклов сразу + end; +1: + if found5 then + writeln('Элемент 5 найден') + else writeln('Элемент 5 не найден') +end. \ No newline at end of file diff --git a/!Tutorial/10_Matrices/Matr2.pas b/!Tutorial/10_Matrices/Matr2.pas new file mode 100644 index 0000000..42df846 --- /dev/null +++ b/!Tutorial/10_Matrices/Matr2.pas @@ -0,0 +1,37 @@ +// Матрица как динамический массив массивов +type Matrix = array of array of integer; + +function CreateMatrix(m,n: integer): Matrix; +begin + SetLength(Result,m); + for var i:=0 to m-1 do + SetLength(Result[i],n); +end; + +procedure FillMatrByRandom(matr: Matrix); +begin + for var i:=0 to matr.Length-1 do + for var j:=0 to matr[0].Length-1 do + matr[i][j] := Random(100); +end; + +procedure WriteMatrix(matr: Matrix); +begin + for var i := 0 to matr.Length-1 do + begin + for var j := 0 to matr[0].Length-1 do + write(matr[i,j]:3); + writeln; + end; +end; + +var matr: Matrix; + +begin + var m := 5; + var n := 7; + matr := CreateMatrix(m,n); + + FillMatrByRandom(matr); + WriteMatrix(matr); +end. \ No newline at end of file diff --git a/!Tutorial/11_Enums/Enum1.pas b/!Tutorial/11_Enums/Enum1.pas new file mode 100644 index 0000000..db92312 --- /dev/null +++ b/!Tutorial/11_Enums/Enum1.pas @@ -0,0 +1,25 @@ +// Перечислимый тип +type Months = (January,February,March,April,May,June,July,August,September,October,November,December); + +var m: Months; + +begin + m := February; + writeln(m); + // Использование констант перечислимого типа после имени типа удобно: после точки intellisense показывает список констант + m := Months.April; + writeln('Следующий месяц: ',m); + Inc(m); + writeln('Следующий месяц: ',m); + m := Succ(m); + writeln('Следующий месяц: ',m); + m := Pred(m); + writeln('Предыдующий месяц: ',m); + Dec(m); + writeln('Предыдующий месяц: ',m); + writeln('Его порядковый номер (нумерация - с нуля): ',Ord(m)); + // Ошибки нет + writeln('Месяц перед январем - выход за границы: ',pred(Months.January)); + // Ошибки нет + writeln('Месяц после декабря - выход за границы: ',succ(Months.December)); +end. \ No newline at end of file diff --git a/!Tutorial/11_Enums/Enum2.pas b/!Tutorial/11_Enums/Enum2.pas new file mode 100644 index 0000000..77eef43 --- /dev/null +++ b/!Tutorial/11_Enums/Enum2.pas @@ -0,0 +1,22 @@ +// ѕеречислимый тип +uses System; + +type Months = (January,February,March,April,May,June,July,August,September,October,November,December); + +begin + var t: &Type := typeof(Months); + var names: array of string := Enum.GetNames(t); + writeln('÷икл по именам перечислимого типа'); + foreach name: string in names do + write(name,' '); + writeln; writeln; + + var v: &Array := Enum.GetValues(t); + var mm: array of Months := new Months[v.Length]; + writeln('÷икл по массиву всех значений перечислимого типа'); + for var i:=0 to v.Length-1 do + mm[i] := Months(v.GetValue(i)); + + for var i:=0 to mm.Length-1 do + write(mm[i],' '); +end. \ No newline at end of file diff --git a/!Tutorial/12_Files/File1.pas b/!Tutorial/12_Files/File1.pas new file mode 100644 index 0000000..8eb6269 --- /dev/null +++ b/!Tutorial/12_Files/File1.pas @@ -0,0 +1,35 @@ +// Типизированные файлы +// Запись в файл 10 чисел, при следующем запуске - чтение этих чисел и удаление файла +const filename = 'a.dat'; + +var f: file of integer; + +begin + if not FileExists(filename) then + begin + assign(f,filename); + rewrite(f); + writeln('Запись в файл ',filename); + for var i:=1 to 10 do + begin + var x := random(100); + write(x,' '); + write(f,x); + end; + close(f); + end + else + begin + assign(f,filename); + reset(f); + writeln('Чтение из файла ',filename); + for var i:=1 to 10 do + begin + var x: integer; + read(f,x); + write(x,' '); + end; + close(f); + erase(f); + end; +end. \ No newline at end of file diff --git a/!Tutorial/12_Files/Text1.pas b/!Tutorial/12_Files/Text1.pas new file mode 100644 index 0000000..72b9418 --- /dev/null +++ b/!Tutorial/12_Files/Text1.pas @@ -0,0 +1,15 @@ +// Программа, выводящая текст из своего файла +var + f: Text; + +begin + assign(f,'Text1.pas'); + reset(f); + while not eof(f) do + begin + var s: string; + readln(f,s); + writeln(s); + end; + close(f); +end. \ No newline at end of file diff --git a/!Tutorial/12_Files/Text2.pas b/!Tutorial/12_Files/Text2.pas new file mode 100644 index 0000000..cd46adb --- /dev/null +++ b/!Tutorial/12_Files/Text2.pas @@ -0,0 +1,13 @@ +// Программа, выводящая текст в файл a.txt +var + f: Text; + a: array of string := ('Каждый','охотник','желает','знать','где','сидит','фазан'); + +begin + assign(f,'a.txt'); + rewrite(f); + for var i:=0 to a.Length-1 do + writeln(f,a[i]); + close(f); + writeln('Текст записан в файл a.txt'); +end. \ No newline at end of file diff --git a/!Tutorial/12_Files/Text3.pas b/!Tutorial/12_Files/Text3.pas new file mode 100644 index 0000000..31daacb --- /dev/null +++ b/!Tutorial/12_Files/Text3.pas @@ -0,0 +1,19 @@ +// Программа, выводящая текст в файл a.txt +const + n = 30; + filename = 'pifagor.txt'; + +var f: Text; + +begin + assign(f,filename); + rewrite(f); + for var i:=1 to n do + begin + for var j:=1 to n do + write(f,i*j:4); + writeln(f); + end; + close(f); + writeln('Таблица умножения записана в файл '+filename); +end. \ No newline at end of file diff --git a/!Tutorial/12_Files/Untyped1.pas b/!Tutorial/12_Files/Untyped1.pas new file mode 100644 index 0000000..7c932dd --- /dev/null +++ b/!Tutorial/12_Files/Untyped1.pas @@ -0,0 +1,52 @@ +// Нетипизированные файлы +// Запись в файл 10 чисел, при следующем запуске - чтение этих чисел и удаление файла +const filename = 'u.dat'; + +var + f: file; + r: real; + s: string[10]; + k: integer; + c: char; + +begin + if not FileExists(filename) then + begin + assign(f,filename); + rewrite(f); + writeln('Запись в файл ',filename); + + r := random*10; + for var i:=0 to 10 do + s := s + Chr(Ord('A')+Random(26)); + c := Chr(Ord('A')+Random(26)); + k := Random(100); + + writeln(r); +// writeln(s); + writeln(c); + writeln(k); + // Запись в файл данных разных типов + write(f,r); +// writeln(f,s); + write(f,c); + write(f,k); + close(f); + end + else + begin + assign(f,filename); + reset(f); + writeln('Чтение из файла ',filename); + + // Чтение из файла данных разных типов + read(f,r,{s,}c,k); + writeln(r); +// writeln(s); + writeln(c); + writeln(k); + + close(f); + erase(f); + end; +end. \ No newline at end of file diff --git a/!Tutorial/13_Pointers/Pointer1.pas b/!Tutorial/13_Pointers/Pointer1.pas new file mode 100644 index 0000000..3d041c7 --- /dev/null +++ b/!Tutorial/13_Pointers/Pointer1.pas @@ -0,0 +1,16 @@ +// Типизированные указатели +var + i: integer := 5; + j: integer := 3; + p: ^integer; + +begin + writeln('Исходные значения переменных i и j: ',i,' ',j); + p := @i; // в p записывается адрес i, p указывает на i + writeln('По адресу ',p,' находится значение ',p^); // p^ - то, на что указывает p + p^ := 2; + p := @j; + writeln('По адресу ',p,' находится значение ',p^); + p^ += 1; + writeln('Новые значения переменных i и j: ',i,' ',j); +end. \ No newline at end of file diff --git a/!Tutorial/13_Pointers/Pointer2.pas b/!Tutorial/13_Pointers/Pointer2.pas new file mode 100644 index 0000000..f300676 --- /dev/null +++ b/!Tutorial/13_Pointers/Pointer2.pas @@ -0,0 +1,22 @@ +// Бестиповые указатели +// Им можно присваивать любой адрес, но для использования необходимо +// явное приведение к типизированному указателю +var + i: integer := 5; + r: real := 3.14; + p: pointer; + +type + pinteger = ^integer; + preal = ^real; + +begin + writeln('Исходные значения переменных i и r: '); + writeln(i,' ',r); + p := @i; + pinteger(p)^ := 8; + p := @r; + preal(p)^ += 1; + writeln('Новые значения переменных i и r: '); + writeln(i,' ',r); +end. \ No newline at end of file diff --git a/!Tutorial/13_Pointers/Pointer3.pas b/!Tutorial/13_Pointers/Pointer3.pas new file mode 100644 index 0000000..c710089 --- /dev/null +++ b/!Tutorial/13_Pointers/Pointer3.pas @@ -0,0 +1,11 @@ +// Выделение динамической памяти +var p: ^real; + +begin + // Выделили динамическую память и в p записали ее адрес + New(p); + p^ := 3; + writeln('Значение в динамичесской памяти = ',p^); + // Возврат динамической памяти, на оторую указывает p + Dispose(p); +end. \ No newline at end of file diff --git a/!Tutorial/13_Pointers/Pointer4.pas b/!Tutorial/13_Pointers/Pointer4.pas new file mode 100644 index 0000000..0faeeb6 --- /dev/null +++ b/!Tutorial/13_Pointers/Pointer4.pas @@ -0,0 +1,43 @@ +// Выделение динамической памяти +// Использование указателей для создания односвязного списка +type + PNode = ^TNode; + TNode = record + data: integer; + next: PNode; + end; + +function NewNode(d: integer; n: PNode): PNode; +begin + New(Result); + Result^.data := d; + Result^.next := n; +end; + +var first: PNode; + +begin + first := nil; + // Добавляем в начало односвязного списка + first := NewNode(3,first); + first := NewNode(7,first); + first := NewNode(5,first); + + // Вывод односвязного списка + writeln('Содержимое односвязного списка: '); + var p := first; + while p<>nil do + begin + write(p^.data,' '); + p := p^.next; + end; + + // Разрушение односвязного списка + p := first; + while p<>nil do + begin + var p1 := p; + p := p^.next; + Dispose(p1); + end; +end. \ No newline at end of file diff --git a/!Tutorial/13_Pointers/ProcPointer1.pas b/!Tutorial/13_Pointers/ProcPointer1.pas new file mode 100644 index 0000000..2d54f9f --- /dev/null +++ b/!Tutorial/13_Pointers/ProcPointer1.pas @@ -0,0 +1,21 @@ +// Процедурные переменные + +function add(a,b: integer): integer; +begin + Result := a + b; +end; + +function mult(a,b: integer): integer; +begin + Result := a * b; +end; + +var p: function (a,b: integer): integer; + + +begin + p := add; + writeln('Сумма 2 и 3 равна ',p(2,3)); + p := mult; + writeln('Произведение 2 и 3 равно ',p(2,3)); +end. \ No newline at end of file diff --git a/!Tutorial/13_Pointers/ProcPointer2.pas b/!Tutorial/13_Pointers/ProcPointer2.pas new file mode 100644 index 0000000..2ba3554 --- /dev/null +++ b/!Tutorial/13_Pointers/ProcPointer2.pas @@ -0,0 +1,27 @@ +// Процедурная переменная как параметр +procedure for_each(a: array of real; p: procedure(var r: real)); +begin + for var i := 0 to a.Length-1 do + p(a[i]); +end; + +procedure mult2(var r: real); +begin + r := 2*r +end; + +procedure print(var r: real); +begin + write(r,' '); +end; + +var a: array of real := (1,2,3,6,7); + +begin + writeln('Содержимое массива: '); + for_each(a,print); + writeln; + for_each(a,mult2); + writeln('Содержимое массива после умножения его элеметов на 2: '); + for_each(a,print); +end. \ No newline at end of file diff --git a/!Tutorial/13_Pointers/Reference.pas b/!Tutorial/13_Pointers/Reference.pas new file mode 100644 index 0000000..5dd358c --- /dev/null +++ b/!Tutorial/13_Pointers/Reference.pas @@ -0,0 +1,34 @@ +// Использование ссылок вместо указателей для создания односвязного списка +type + Node = class + data: integer; + next: Node; + constructor (d: integer; n: Node); + begin + data := d; + next := n; + end; + end; + +// Переменная типа "класс" представляет собой ссылку на объект, выделяемый конструктором +var first: Node; + +begin + first := nil; + // Добавляем в начало односвязного списка + first := new Node(3,first); + first := new Node(7,first); + first := new Node(5,first); + + // Вывод односвязного списка. ^ отсутствуют + writeln('Содержимое односвязного списка (использование ссылок вместо указателей): '); + var p := first; + while p<>nil do + begin + write(p.data,' '); + p := p.next; + end; + + // Разрушение односвязного списка + first := nil; // Сборщик мусора соберет память, на которую никто больше не указывает +end. \ No newline at end of file diff --git a/!Tutorial/14_Records/Rec1.pas b/!Tutorial/14_Records/Rec1.pas new file mode 100644 index 0000000..5b6b049 --- /dev/null +++ b/!Tutorial/14_Records/Rec1.pas @@ -0,0 +1,35 @@ +type + SexType = (Male, Female); + Person = record + Name: string; + Age, Weight: integer; + Sex: SexType; + end; + +procedure WritePerson(const p: Person); +begin + writelnFormat('Фамилия: {0} Пол: {1} Возраст: {2} Вес: {3}',p.Name,p.Sex,p.Age,p.Weight); +end; + +var + p: Person := (Name: 'Иванов'; Age: 20; Weight: 64; Sex: Male); + p1: Person; +begin + p1 := p; // Присваивание записей + var p2: Person; + p2.Name := 'Петрова'; + p2.Age := 18; + p2.Weight := 50; + p2.Sex := Female; + WritePerson(p2); + + var p3: Person; + with p3 do + begin + Name := 'Сидоров'; + Age := 24; + Weight := 80; + Sex := Male; + end; + WritePerson(p3); +end. \ No newline at end of file diff --git a/!Tutorial/14_Records/Rec2.pas b/!Tutorial/14_Records/Rec2.pas new file mode 100644 index 0000000..e95d97a --- /dev/null +++ b/!Tutorial/14_Records/Rec2.pas @@ -0,0 +1,26 @@ +// Иллюстрация конструкторов и методов в записях +// Если переопределен метод ToString, то он вызывается при выводе объекта этого типа процедурой writeln +type + SexType = (Male, Female); + Person = record + Name: string; + Age, Weight: integer; + Sex: SexType; + constructor (Name: string; Age, Weight: integer; Sex: SexType); + begin + Self.Name := Name; + Self.Age := Age; + Self.Sex := Sex; + Self.Weight := Weight; + end; + function ToString: string; override; + begin + Result := Format('Имя: {0} Пол: {1} Возраст: {2} Вес: {3}', Name, Sex, Age, Weight); + end; + end; + +var p: Person := new Person('Иванов',20,70,SexType.Male); + +begin + writeln(p); +end. diff --git a/!Tutorial/15_Classes/Inheritance1.pas b/!Tutorial/15_Classes/Inheritance1.pas new file mode 100644 index 0000000..94c4e7c --- /dev/null +++ b/!Tutorial/15_Classes/Inheritance1.pas @@ -0,0 +1,66 @@ +// Наследование. Полиморфизм и виртуальные функции +type + Person = class + private + name: string; + age: integer; + public + constructor (n: string; a: integer); + begin + name := n; age := a; + end; + procedure Print; virtual; // Виртуальная функция. Переопределяется в классах-потомках + begin + var s := GetType.ToString; + write('Тип: ',Copy(s,pos('.',s)+1,Length(s)):7,' Имя: ',name,' Возраст: ',age); + end; + procedure Println; + begin + Print; + writeln; + end; + end; + + Pupil = class(Person) // Pupil - наследник Person + private + clas: integer; + public + constructor (n: string; a,c: integer); + begin + inherited Create(n,a); // Вызов унаследованного конструктора + clas := c; + end; + procedure Print; override; + begin + inherited Print; + write(' Класс: ',clas); + end; + end; + + Teacher = class(Person) + private + predm: string; + public + constructor (n: string; a: integer; p: string); + begin + inherited Create(n,a); // Вызов унаследованного конструктора + predm := p; + end; + procedure Print; override; + begin + inherited Print; + write(' Предмет: ',predm); + end; + end; + +var a: array of Person := new Person[4]; // Полиморфный контейнер - контейнер объектов базового класса. Может содержать объекты производных классов + +begin + a[0] := new Pupil('Вова',11,5); + a[1] := new Teacher('Марья Ивановна',30,'Информатика'); + a[2] := new Person('Иванов',65); + a[3] := new Pupil('Вася',12,6); + + for var i:=0 to a.Length-1 do + a[i].Println; +end. \ No newline at end of file diff --git a/!Tutorial/15_Classes/PersonExternal.pas b/!Tutorial/15_Classes/PersonExternal.pas new file mode 100644 index 0000000..5d205a7 --- /dev/null +++ b/!Tutorial/15_Classes/PersonExternal.pas @@ -0,0 +1,30 @@ +// Описание методов вне интерфейса класса +// Удобство: интерфейс лучше виден +// Если класс описан в модуле, то реализация методов помещается в секцию реализации модуля +type + Person = class + private + name: string; + age: integer; + public + constructor (n: string; a: integer); + procedure Print; + end; + +//----------------- Person ------------------- +constructor Person.Create(n: string; a: integer); +begin + name := n; age := a; +end; + +procedure Person.Print; +begin + writeln('Имя: ',name,' Возраст: ',age); +end; + +var p: Person; + +begin + p := new Person('Иванов',20); + p.Print; +end. \ No newline at end of file diff --git a/!Tutorial/15_Classes/PersonInternal.pas b/!Tutorial/15_Classes/PersonInternal.pas new file mode 100644 index 0000000..e146f93 --- /dev/null +++ b/!Tutorial/15_Classes/PersonInternal.pas @@ -0,0 +1,30 @@ +// Описание методов внутри интерфейса класса +// Удобство: методы можно реализовывать сразу после объявления +// Неудобство: для больших классов интерфейс трудно читается +type + Person = class + private + // Поля класса, как правило, приватны. Доступ к ним - через методы и свойства + name: string; + age: integer; + public + // Конструктор неявно имеет имя Create + constructor (n: string; a: integer); + begin + name := n; age := a; + end; + procedure Print; + begin + writeln('Имя: ',name,' Возраст: ',age); + end; + end; + +var p,p1: Person; + +begin + p := new Person('Иванов',20); // Новый синтаксис вызова конструктора (рекомендуется) + p.Print; + p1 := Person.Create('Попов',19); // Старый синтаксис вызова конструктора (не рекомендуется) + p1.Print; + // Деструкторы отсутствуют, вместо них - автоматическая сборка мусора +end. \ No newline at end of file diff --git a/!Tutorial/15_Classes/Properties.pas b/!Tutorial/15_Classes/Properties.pas new file mode 100644 index 0000000..aa6958b --- /dev/null +++ b/!Tutorial/15_Classes/Properties.pas @@ -0,0 +1,35 @@ +// Свойства (properties) +type + /// Класс персоны + Person = class + private + nm: string; + ag: integer; + procedure SetAge(a: integer); // Процедура доступа к свойству располагается обычно в приватной секции + begin + if a<0 then // Перед установкой значения свойства мы можем сделать дополнительные проверки + a := 0; // и скорректировать значение свойства, либо сгенерировать исключение + ag := a; + end; + public + constructor (n: string; a: integer); + begin + nm := n; ag := a; + end; + /// Имя персоны + property Name: string read nm; // Свойство Name доступно только на чтение и возвращает значение поля nm + /// Возраст персоны + property Age: integer read ag write SetAge; + procedure Print; + begin + writeln('Имя: ',nm,' Возраст: ',ag); + end; + end; + +var p: Person := new Person('Иванов', 20); + +begin + writeln('Имя: ',p.Name); // Менять Name нельзя, доступ - только на чтение + p.Age := -1; // Попытка изменения возраста на отрицательное значение приводит к корректировке: возраст становится = 0 + writeln('Возраст: ',p.Age); +end. \ No newline at end of file diff --git a/!Tutorial/16_Exceptions/Try1.pas b/!Tutorial/16_Exceptions/Try1.pas new file mode 100644 index 0000000..c879e8a --- /dev/null +++ b/!Tutorial/16_Exceptions/Try1.pas @@ -0,0 +1,14 @@ +// Простейшая обработка исключений. Ввод с ошибкой +var a: integer; + +begin + try + writeln('Введите число: '); + // При вводе попробуйте совершить ошибку :) + readln(a); + writeln('Число введено верно '); + except + writeln('Ошибка ввода'); + end; + writeln('Выполнение программы продолжено'); +end. diff --git a/!Tutorial/16_Exceptions/Try2.pas b/!Tutorial/16_Exceptions/Try2.pas new file mode 100644 index 0000000..4145b1f --- /dev/null +++ b/!Tutorial/16_Exceptions/Try2.pas @@ -0,0 +1,15 @@ +// Обработка нескольких исключений +var x: integer; + +begin + try + writeln('Введите число (1 - ошибка деления на 0): '); + readln(x); + x := 10 div (x-1); + except + on System.FormatException do + writeln('Ошибка ввода'); + on System.DivideByZeroException do + writeln('Деление на 0'); + end; +end. diff --git a/!Tutorial/16_Exceptions/Try3.pas b/!Tutorial/16_Exceptions/Try3.pas new file mode 100644 index 0000000..4fcc481 --- /dev/null +++ b/!Tutorial/16_Exceptions/Try3.pas @@ -0,0 +1,15 @@ +// Иллюстрация finally +// Секция finally выполняется независимо от того, произошло исключение или нет +var x: integer := 0; + +begin + try + if Random(2)=0 then + x := 10 div x; + writeln('Выполнение продолжается'); + finally + writeln('Сработала секция finally'); + end; + // Если возникает исключение, то этот оператор не выполняется + writeln('После секции finally'); +end. diff --git a/!Tutorial/16_Exceptions/Try4.pas b/!Tutorial/16_Exceptions/Try4.pas new file mode 100644 index 0000000..2f61a1b --- /dev/null +++ b/!Tutorial/16_Exceptions/Try4.pas @@ -0,0 +1,11 @@ +// Исключения. Генерация исключения +function f(x: integer): integer; +begin + if x=0 then + raise new System.Exception('Аргумент функции f не может быть равен 0'); + Result := 10 mod x; +end; + +begin + writeln(f(0)); +end. diff --git a/!Tutorial/17_Interfaces/Interf1.pas b/!Tutorial/17_Interfaces/Interf1.pas new file mode 100644 index 0000000..fdb7216 --- /dev/null +++ b/!Tutorial/17_Interfaces/Interf1.pas @@ -0,0 +1,61 @@ +// Интерфейсы. Интерфейс IComparer +uses System,System.Collections.Generic; + +type + Student = class + private + name: string; + age,course,group: integer; + public + constructor (n: string; a,c,g: integer); + begin + name := n; + age := a; + course := c; + group := g; + end; + function ToString: string; override; + begin + Result := Format('Имя: {0,9} Возраст: {1} Курс: {2} Группа: {3}',name,age,course,group); + end; + end; + + SortByName = class(IComparer) + public + function Compare(s1,s2: Student): integer; + begin + Result := string.Compare(s1.name,s2.name); + end; + end; + + SortByAge = class(IComparer) + public + function Compare(s1,s2: Student): integer; + begin + Result := s1.age - s2.age; + end; + end; + +procedure WriteArray(prompt: string; a: array of T); +begin + writeln(prompt); + foreach x: T in a do + writeln(x); + writeln; +end; + +var a: array of Student; + +begin + SetLength(a,5); + a[0] := new Student('Иванова',18,2,3); + a[1] := new Student('Козлов',19,3,10); + a[2] := new Student('Сидорова',22,5,1); + a[3] := new Student('Крикунов',17,1,2); + a[4] := new Student('Лихачев',25,4,8); + WriteArray('Исходный массив:',a); + &Array.Sort(a,new SortByName); + WriteArray('Сортировка по имени: ',a); + &Array.Sort(a,new SortByAge); + WriteArray('Сортировка по возрасту: ',a); +end. diff --git a/!Tutorial/17_Interfaces/Interf2.pas b/!Tutorial/17_Interfaces/Interf2.pas new file mode 100644 index 0000000..2993568 --- /dev/null +++ b/!Tutorial/17_Interfaces/Interf2.pas @@ -0,0 +1,43 @@ +// Интерфейсы. Интерфейс IComparer +uses System,System.Collections.Generic; + +type + Student = class + private + name: string; + age,course,group: integer; + public + constructor (n: string; a,c,g: integer); + begin + name := n; + age := a; + course := c; + group := g; + end; + function ToString: string; override; + begin + Result := Format('Имя: {0,9} Возраст: {1} Курс: {2} Группа: {3}',name,age,course,group); + end; + end; + +procedure WriteArray(prompt: string; a: array of T); +begin + writeln(prompt); + foreach x: T in a do + writeln(x); + writeln; +end; + +var a: array of Student; + +begin + SetLength(a,5); + a[0] := new Student('Иванова',18,2,3); + a[1] := new Student('Козлов',19,3,10); + a[2] := new Student('Сидорова',22,5,1); + a[3] := new Student('Крикунов',17,1,2); + a[4] := new Student('Лихачев',25,4,8); + WriteArray('Исходный массив:',a); + + writeln('Индекс Козлова = ',&Array.FindIndex(a,(s: Student)-> s.name = 'Козлов')); +end. diff --git a/!Tutorial/18_Dll/Main.pas b/!Tutorial/18_Dll/Main.pas new file mode 100644 index 0000000..368b2e0 --- /dev/null +++ b/!Tutorial/18_Dll/Main.pas @@ -0,0 +1,12 @@ +// Основная программа, использующая библиотеку MyLib.dll +// MyLib.pas должен быть предварительно откомпилирован +{$reference 'MyLib.dll'} + +var f: Frac; + +begin + writeln('Сумма чисел 2 и 3 равна ',add(2,3)); + writeln('MyPi = ',MyPi); + f := new Frac(2,3); + f.Print; +end. \ No newline at end of file diff --git a/!Tutorial/18_Dll/MyLib.pas b/!Tutorial/18_Dll/MyLib.pas new file mode 100644 index 0000000..89708ec --- /dev/null +++ b/!Tutorial/18_Dll/MyLib.pas @@ -0,0 +1,26 @@ +// Откомпилируйте библиотеку, нажав Ctrl-F9. В папке должен появиться файл MyLib.dll + +library MyLib; + +const MyPi = 3.14; + +function add(a,b: integer): integer; +begin + Result := a + b; +end; + +type + Frac = record + num,denom: integer; + constructor (n,d: integer); + begin + num := n; + denom := d; + end; + procedure Print; + begin + writeln(num,'/',denom); + end; + end; + +end. \ No newline at end of file diff --git a/1.pas b/1.pas new file mode 100644 index 0000000..725f6ba --- /dev/null +++ b/1.pas @@ -0,0 +1,13 @@ +program aaa; +begin + var input:real; + readln(input); + writeln('1 - байты'); + writeln('2 - килобайты'); + write('выбирай: '); + var sel:byte; + readln(sel); + input /= 8; + if(sel = 2) then input /= 1024; + writeln(input); +end. \ No newline at end of file diff --git a/2.pas b/2.pas new file mode 100644 index 0000000..a4f64fd --- /dev/null +++ b/2.pas @@ -0,0 +1,14 @@ +program bbb; + +function f(x:int64):int64; begin + if(x > 0) then Result:= 2*x-10; + if(x = 0) then Result:= 0; + if(x < 0) then Result:= 2*Abs(x)-1; + end; + +begin + var input:int64; + + readln(input); + writeln(f(input)); +end. \ No newline at end of file diff --git a/Algorithms/Combinatorics/NextPerm.pas b/Algorithms/Combinatorics/NextPerm.pas new file mode 100644 index 0000000..f41e421 --- /dev/null +++ b/Algorithms/Combinatorics/NextPerm.pas @@ -0,0 +1,6 @@ +begin + var a := Arr(1..4); + repeat + a.Println; + until not NextPermutation(a); +end. \ No newline at end of file diff --git a/Algorithms/Eratosthenes.pas b/Algorithms/Eratosthenes.pas new file mode 100644 index 0000000..f7c8e1c --- /dev/null +++ b/Algorithms/Eratosthenes.pas @@ -0,0 +1,24 @@ +// "Решето Эратосфена" - вычисление простых чисел +const n = 100000; + +begin + var primes := HSet(2..n); + + for var i:=2 to Round(Sqrt(n)) do + begin + if not (i in primes) then + continue; + var x := i*i; + while x<=n do + begin + primes -= x; + x += i; + end; + end; + + Writeln('Простые числа < ',n,':'); + Writeln(primes); + Writeln; + Writeln('Время вычисления: ',Milliseconds/1000); +end. + diff --git a/Algorithms/FloodFillTuple.pas b/Algorithms/FloodFillTuple.pas new file mode 100644 index 0000000..3a584bf --- /dev/null +++ b/Algorithms/FloodFillTuple.pas @@ -0,0 +1,70 @@ +uses GraphABC; + +procedure DrawCell(a: array [,] of integer; x,y: integer); +var sz := 30; +begin + case a[y,x] of +0: Brush.Color := Color.White; +1: Brush.Color := Color.Black; +2: Brush.Color := Color.Chocolate; + end; + Rectangle(x*sz,y*sz,x*sz+sz-1,y*sz+sz-1) +end; + +procedure AddToQueue(a: array [,] of integer; x,y: integer; q: Queue<(integer,integer)>); +begin + if a[y,x] = 0 then + begin + q.Enqueue(new Point(x,y)); + a[y,x] := 2; + Sleep(200); + DrawCell(a,x,y); + end; +end; + +procedure FloodFill(a: array [,] of integer; x,y: integer); +begin + var q := new Queue<(integer,integer)>; + AddToQueue(a,x,y,q); + while not (q.Count=0) do + begin + (x,y) := q.Dequeue(); + AddToQueue(a,x+1,y,q); + AddToQueue(a,x-1,y,q); + AddToQueue(a,x,y+1,q); + AddToQueue(a,x,y-1,q); + end; +end; + +procedure ReadFromFile(fname: string; var a: array [,] of integer); +begin + var f := OpenRead(fname); + var dimx,dimy: integer; + Readln(f,dimy,dimx); + SetLength(a,dimy,dimx); + for var y := 0 to dimy-1 do + begin + for var x := 0 to dimx-1 do + begin + var c := f.ReadChar; + a[y,x]:= if c='*' then 1 else 0; + end; + f.Readln + end; + f.Close; +end; + +procedure Draw(a: array [,] of integer); +begin + for var y := 0 to a.RowCount-1 do + for var x := 0 to a.ColCount-1 do + DrawCell(a,x,y); +end; + +begin + Window.Title := 'Иллюстрация алгоритма FloodFill'; + var a: array [,] of integer; + ReadFromFile('field.txt',a); + Draw(a); + FloodFill(a,4,4); +end. \ No newline at end of file diff --git a/Algorithms/MazeGen.pas b/Algorithms/MazeGen.pas new file mode 100644 index 0000000..de545d1 --- /dev/null +++ b/Algorithms/MazeGen.pas @@ -0,0 +1,106 @@ +// Программа генерации случайных лабиринтов +uses GraphABC; + +const + szw = 70; // размер лабиринта + szh = 50; + cellsz = 10; // размер ячейки + +type + point = record + x,y: integer; + end; + +var + maze: array [0..szw-1] of array [0..szh-1] of integer; + todo: array [0..szw*szh-1] of point; + todonum: integer; + +const + dx: array [0..3] of integer = (0, 0, -1, 1); + dy: array [0..3] of integer = (-1, 1, 0, 0); + +procedure Init; +begin + for var x:=0 to szw-1 do + for var y:=0 to szh-1 do + if (x=0) or (x=szw-1) or (y=0) or (y=szh-1) then + maze[x][y]:=32 + else maze[x][y]:=63; + + var x := Random(szw-2)+1; + var y := Random(szh-2)+1; + +// Пометить клетку как принадлежащую лабиринту + maze[x][y]:= maze[x][y] and not 48; + +// Занести в список todo все ближайшие необработанные клетки + for var d:=0 to 3 do + if (maze[x + dx[d]][y + dy[d]] and 16) <> 0 then + begin + todo[todonum].x := x + dx[d]; + todo[todonum].y := y + dy[d]; + Inc(todonum); + maze[x + dx[d]][y + dy[d]] := maze[x + dx[d]][y + dy[d]] and not 16; + end; + + // Пока не обработаны все клетки + while todonum > 0 do + begin + // Выбрать из списка todo произвольную клетку + var n := Random(todonum); + x := todo[n].x; + y := todo[n].y; + + // Удалить из списка обработанную клетку + Dec(todonum); + todo[n]:= todo[todonum]; + + // Выбрать направление, которое ведет к лабиринту + var dd: integer; + repeat + dd:=Random (4); + until not ((maze[x + dx[dd]][y + dy[dd]] and 32) <> 0); + + // Присоединить выбранную клетку к лабиринту + maze[x][y] := maze[x][y] and not ((1 shl dd) or 32); + maze[x + dx[dd]][y + dy[dd]] := maze[x + dx[dd]][y + dy[dd]] and not (1 shl (dd xor 1)); + + // Занести в список todo все ближайшие необработанные клетки + for var d:=0 to 3 do + if (maze[x + dx[d]][y + dy[d]] and 16) <> 0 then + begin + todo[todonum].x := x + dx[d]; + todo[todonum].y := y + dy[d]; + Inc(todonum); + maze[x + dx[d]][y + dy[d]] := maze[x + dx[d]][y + dy[d]] and not 16; + end; + end; + + maze[1][1] := maze[1][1] and not 1; // начало лабиринта - в левом верхнем углу + maze[szw-2][szh-2] := maze[szw-2][szh-2] and not 2; // конец лабиринта - в правом нижнем углу +end; + +procedure Draw; +begin + for var x:=1 to szw-2 do + for var y:=1 to szh-2 do + begin + if ((maze[x][y] and 1) <> 0) then // верхняя стена + Line(x * cellsz, y * cellsz, x * cellsz + cellsz , y * cellsz); + if ((maze[x][y] and 2) <> 0) then // нижняя стена + Line(x * cellsz, y * cellsz + cellsz, x * cellsz + cellsz , y * cellsz + cellsz); + if ((maze[x][y] and 4) <> 0) then // левая стена + Line(x * cellsz, y * cellsz, x * cellsz, y * cellsz + cellsz ); + if ((maze[x][y] and 8) <> 0) then // правая стена + Line(x * cellsz + cellsz, y * cellsz, x * cellsz + cellsz, y * cellsz + cellsz); + end; +end; + +begin + Window.Title := 'Генерация лабиринта'; + SetWindowSize(szw*cellsz,szh*cellsz); + Init; + Draw; +end. + diff --git a/Algorithms/PrimeNumbers.pas b/Algorithms/PrimeNumbers.pas new file mode 100644 index 0000000..3e3b051 --- /dev/null +++ b/Algorithms/PrimeNumbers.pas @@ -0,0 +1,22 @@ +// Генерация больших простых чисел +begin + Println('Большие простые числа: '); + var count := 0; + var beg := Random(1000000000)+2; + for var i:=beg to beg+5000 do + begin + var f := True; + var j := 2; + var r := Round(Sqrt(i)); + while f and (j<=r) do + if i mod j = 0 then f := False + else j += 1; + if f then + begin + Print(i); + count += 1; + if count mod 8 = 0 then + Println; + end; + end; +end. diff --git a/Algorithms/Recursion/ESquares.pas b/Algorithms/Recursion/ESquares.pas new file mode 100644 index 0000000..ceb9752 --- /dev/null +++ b/Algorithms/Recursion/ESquares.pas @@ -0,0 +1,27 @@ +// E-квадраты. Демонстрация рекурсии +uses GraphABC; + +const mw = 2.9; + +procedure ESquares(n,x,y,w: integer); +begin + var w1 := round(w/mw); + var h := (w-2*w1) div 3; + Brush.Color := clRandom; + Rectangle(x,y,x+w,y+w); + if n>0 then + begin + Sleep(1); + ESquares(n-1,x+h,y+h,w1); + ESquares(n-1,x+w-h-w1,y+h,w1); + ESquares(n-1,x+h,y+w-h-w1,w1); + ESquares(n-1,x+w-h-w1,y+w-h-w1,w1); + end; +end; + +begin + Window.Title := 'Рекурсия: E-квадраты'; + SetWindowSize(750,530); + Pen.Color := clWhite; + ESquares(4,125,18,490); +end. diff --git a/Algorithms/Recursion/Hanoi.pas b/Algorithms/Recursion/Hanoi.pas new file mode 100644 index 0000000..fc4b231 --- /dev/null +++ b/Algorithms/Recursion/Hanoi.pas @@ -0,0 +1,121 @@ +// Ханойские башни +uses GraphABC; + +type + /// Тип диска + DiskType = record + /// Диаметр диска + Sz: integer; + /// Цвет диска + Color: GraphABC.Color; + end; + /// Тип массива дисков на стержне + DiskArr = array of DiskType; + +const + /// Количество дисков + CountDisks = 8; + /// Высота диска + DiskHeight = 12; + /// Приращение ширины диска + DiskWidthDelta = 12; + h = CountDisks * DiskWidthDelta * 2 + 20; + /// y-координата основания пирамид дисков + y0 = DiskHeight * CountDisks + 80; + hh = 30; + /// x-координата первого стержня + x1 = h div 2 + hh; + /// x-координата второго стержня + x2 = x1 + h; + /// x-координата третьего стержня + x3 = x2 + h; + /// Пауза, мс + delay = 50; + +var + /// Массив пирамид дисков + Tower: array [1..3] of DiskArr; + /// Массив количеств дисков в пирамидах + DisksInTower: array [1..3] of integer; + /// Номер хода + MoveNumber: integer; + +/// Рисование пирамиды +procedure DrawTower(a: DiskArr; n: integer; x0,y0: integer); +begin + Brush.Color := clBlack; + Rectangle(x0-5,y0,x0+5,y0-DiskHeight*CountDisks-10); + for var i:=0 to n-1 do + begin + Brush.Color := a[i].Color; + Rectangle(x0-a[i].sz*DiskWidthDelta,y0-DiskHeight*(i-1),x0+a[i].sz*DiskWidthDelta,y0-DiskHeight*i+1) + end; +end; + +/// Рисование всех пирамид и информационной строки +procedure DrawAll; +begin + DrawTower(Tower[1],DisksInTower[1],x1,y0); + DrawTower(Tower[2],DisksInTower[2],x2,y0); + DrawTower(Tower[3],DisksInTower[3],x3,y0); + Brush.Color := clWhite; + TextOut(20,20,'Число перемещений дисков = '+MoveNumber); + Redraw; +end; + +/// Перемещение диска со стержня FromN на стержень ToN +procedure MoveDisk(FromN, ToN: integer); +begin + Inc(MoveNumber); + Inc(DisksInTower[ToN]); + Tower[ToN][DisksInTower[ToN]-1] := Tower[FromN][DisksInTower[FromN]-1]; + Dec(DisksInTower[FromN]); + Sleep(delay); + ClearWindow; + DrawAll; +end; + +/// Основная екурсивная процедура алгоритма "Ханойские башни" +procedure MoveTower(n: integer; FromN, ToN, WorkN: integer); +begin + if n=0 then exit; + MoveTower(n-1, FromN, WorkN, ToN); + MoveDisk(FromN, ToN); + MoveTower(n-1, WorkN, ToN, FromN); +end; + +/// Инициализация массивов +procedure InitTowers; +begin + SetLength(Tower[1],CountDisks); + SetLength(Tower[2],CountDisks); + SetLength(Tower[3],CountDisks); + DisksInTower[1] := CountDisks; + DisksInTower[2] := 0; + DisksInTower[3] := 0; + for var i:=0 to DisksInTower[1]-1 do + begin + Tower[1][i].Sz := DisksInTower[1]-i+1; + Tower[1][i].Color := clRandom; + end; +end; + +/// Инициализация окна +procedure InitWindow; +begin + SetWindowSize(x3+x1,y0+50); + CenterWindow; + Window.Title := 'Ханойские башни'; + Font.Size := 14; + Font.Name := 'Arial'; +end; + +begin + InitWindow; + InitTowers; + LockDrawing; + DrawAll; + MoveTower(CountDisks,1,3,2); +end. + + diff --git a/Algorithms/Recursion/Knapsack.pas b/Algorithms/Recursion/Knapsack.pas new file mode 100644 index 0000000..ae037ad --- /dev/null +++ b/Algorithms/Recursion/Knapsack.pas @@ -0,0 +1,57 @@ +// Задача о ранце. В массиве B заданы веса предметов. +// Выдать все варианты полной комплектации ранца частью этих предметов +const Sz=100; + +type IntArr = array [1..Sz] of integer; + +procedure PrintArr(const A: IntArr; n: integer); +begin + for var i:=1 to n do + Print(A[i]); + Println; +end; + +procedure TrySolve(n: integer; const B: IntArr; nb: integer); +var + Subset: IntArr; + space: integer; + ns: integer; + + procedure TrySolve0(i: integer); + begin + if space=0 then + PrintArr(Subset,ns) + else if (space<0) or (i>nb) then + exit // отсечение + else // продолжение перебора всех подмножеств множества B + begin + TrySolve0(i+1); // попробовать не взять i-тый элемент + + ns += 1; + Subset[ns] := B[i]; + space := space - B[i]; + TrySolve0(i+1); // попробовать взять i-тый элемент + space := space + B[i]; + ns -= 1; + end; + end; + +begin + space:=n; + TrySolve0(1); +end; + +procedure FillArr(var B: IntArr; var n: integer); +begin + n:=5; // количество предметов + B[1]:=8; B[2]:=5; B[3]:=13; B[4]:=3; B[5]:=15; // веса предметов +end; + +var + B: IntArr; + nb: integer; + +begin + FillArr(B,nb); + TrySolve(23,B,5); +end. diff --git a/Algorithms/Recursion/Permutations.pas b/Algorithms/Recursion/Permutations.pas new file mode 100644 index 0000000..b1b560f --- /dev/null +++ b/Algorithms/Recursion/Permutations.pas @@ -0,0 +1,19 @@ +// Все перестановки +const n = 4; + +procedure Perm(a: array of integer; m: integer); +begin + if m=1 then + a.Println; + for var i:=0 to m-1 do + begin + Swap(a[i],a[m-1]); // ставим каждый на место последнего + Perm(a,m-1); + Swap(a[i],a[m-1]); + end; +end; + +begin + var a := Range(1,n).ToArray; // заполнение массива a числами от 1 до n + Perm(a,n); +end. \ No newline at end of file diff --git a/Algorithms/Recursion/TreeDraw.pas b/Algorithms/Recursion/TreeDraw.pas new file mode 100644 index 0000000..512a37f --- /dev/null +++ b/Algorithms/Recursion/TreeDraw.pas @@ -0,0 +1,26 @@ +// Рекурсивное рисование двоичного дерева +uses GraphWPF; + +const + LevelHeight = 50; + Levels = 8; + delay = 10; + +procedure DrawTree(x,y,dx: real; level: integer); +// обход: левое поддерево, корень, правое +begin + if level>0 then + begin + DrawTree(x-dx,y+LevelHeight,dx / 2,level-1); + Line(x,y,x-dx,y+LevelHeight); + Line(x,y,x+dx,y+LevelHeight); + Sleep(delay); + DrawTree(x+dx,y+LevelHeight,dx / 2,level-1); + end; +end; + +begin + Window.Title := 'Рекурсивное рисование бинарного дерева'; + Window.SetSize(800,30+Levels*LevelHeight); + DrawTree(Window.Width / 2,10,Window.Width / 5,Levels); +end. diff --git a/Algorithms/SortArrays/QuickSort.pas b/Algorithms/SortArrays/QuickSort.pas new file mode 100644 index 0000000..4d68e91 --- /dev/null +++ b/Algorithms/SortArrays/QuickSort.pas @@ -0,0 +1,44 @@ +// Быстрая сортировка Ч. Хоара +/// Разделение a[l]..a[r] на части a[l]..a[q] <= a[q+1]..a[r] +function Partition(a: array of integer; l,r: integer): integer; +begin + var i := l - 1; + var j := r + 1; + var x := a[l]; + while True do + begin + repeat + i += 1; + until a[i]>=x; + repeat + j -= 1; + until a[j]<=x; + if i=r then exit; + var j := Partition(a,l,r); + QuickSort(a,l,j); + QuickSort(a,j+1,r); +end; + +const n = 20; + +begin + var a := ArrRandom(n); + Println('До сортировки: '); + Writeln(a); + QuickSort(a,0,a.Length-1); + Println('После сортировки: '); + Println(a); +end. diff --git a/Algorithms/SortArrays/QuickSortFunctional.pas b/Algorithms/SortArrays/QuickSortFunctional.pas new file mode 100644 index 0000000..d9e929a --- /dev/null +++ b/Algorithms/SortArrays/QuickSortFunctional.pas @@ -0,0 +1,14 @@ +// Быстрая сортировка Ч. Хоара +// Неэффективный код, иллюстрирующий суть алгоритма +function QS(a: array of integer): array of integer := + if a.Length < 2 then + a + else + QS(a[1:].FindAll(y->y<=a[0])) + a[:1] + QS(a[1:].FindAll(y->y>a[0])); + +begin + var a := ArrRandom(20); + a.Println; + var b := QS(a); + b.Println; +end. diff --git a/Algorithms/SortArrays/SelectionSort.pas b/Algorithms/SortArrays/SelectionSort.pas new file mode 100644 index 0000000..cfea28f --- /dev/null +++ b/Algorithms/SortArrays/SelectionSort.pas @@ -0,0 +1,22 @@ +// Сортировка выбором +procedure SelectionSort(a: array of real); +begin + for var i:=0 to a.Length-2 do + begin + var (min,ind) := (a[i],i); + for var j:=i+1 to a.Length-1 do + if a[j]r.Round(2)).ToArray; + Println('Содержимое массива: '); + a.Println; + SelectionSort(a); + Println('После сортировки выбором: '); + a.Println; +end. \ No newline at end of file diff --git a/Algorithms/Sqrt2.pas b/Algorithms/Sqrt2.pas new file mode 100644 index 0000000..dde6bdf --- /dev/null +++ b/Algorithms/Sqrt2.pas @@ -0,0 +1,4 @@ +## +var x := 2.0; +SeqGen(6,x,a → (a + x/a) / 2).Last.Println; +x.Sqrt.Print; \ No newline at end of file diff --git a/Algorithms/field.txt b/Algorithms/field.txt new file mode 100644 index 0000000..a095a94 --- /dev/null +++ b/Algorithms/field.txt @@ -0,0 +1,9 @@ +7 8 +******** +* *** * +** * * +* ** +** * +* ** *** +******** + diff --git a/Applications/GraphApplications/FuncTransform.pas b/Applications/GraphApplications/FuncTransform.pas new file mode 100644 index 0000000..a628fa0 --- /dev/null +++ b/Applications/GraphApplications/FuncTransform.pas @@ -0,0 +1,50 @@ +uses + GraphWPF; + +var + h := 0.01; + mx := 2.0; + my := 0.35; + dy := 0.0; + dx := 0.0; + f: real -> real := x -> x * sin(x); + +const + boundx = 5; + boundy = 3; + +function Transform(f: real -> real): real -> real; +begin + Result := x -> my * f(mx * (x + dx)) + dy; +end; + +procedure DrawGraphic(f: real -> real); +begin + Window.Clear; + DrawGraph(f, -boundx, boundx, -boundy, boundy); + Window.Title := Format('mx={0:f2} my={1:f2} dx={2:f2} dy={3:f2}', mx, my, dx, dy); +end; + +var ArrowKeys := HSet(Key.Left, Key.Right, Key.Up, Key.Down, Key.Home, Key.&End, Key.PageUp, Key.PageDown); + +procedure KeyDown(k: Key); +begin + var g := Transform(f); + case k of + Key.Left: my -= h; + Key.Right: my += h; + Key.Up: mx -= h; + Key.Down: mx += h; + Key.Home: dx += h; + Key.PageUp: dx -= h; + Key.PageDown: dy += h; + Key.End: dy -= h; + end; + if k in ArrowKeys then + DrawGraphic(g); +end; + +begin + DrawGraphic(Transform(f)); + OnKeyDown := KeyDown; +end. \ No newline at end of file diff --git a/Applications/GraphApplications/Paporotnik/Main.pas b/Applications/GraphApplications/Paporotnik/Main.pas new file mode 100644 index 0000000..3946450 --- /dev/null +++ b/Applications/GraphApplications/Paporotnik/Main.pas @@ -0,0 +1,22 @@ +//(c) DarkStar 2008 +uses GraphABC, Paporotnik, PaporotnikData; + +const + Iterations = 300000; + Height = 600; + Fast = false; + Width = Height div 2; + WindowWidth= Width * 3; + Brightness = 170; + +var + Paprotnik := new PaporotnikFractal(PaprotnikData); + SimplePaprotnik := new PaporotnikFractal(SimplePaprotnikData); + Elka := new PaporotnikFractal(ElkaData); + +begin + InitWindow(200, 50, WindowWidth , Height, clBlack); + Paprotnik.Draw(0, 0, Iterations, Height, Brightness, fast); + SimplePaprotnik.Draw(Width, 0, Iterations, Height, Brightness, fast); + Elka.Draw(Width*2, 0, Iterations, Height, Brightness, fast); +end. \ No newline at end of file diff --git a/Applications/GraphApplications/Paporotnik/Paporotnik.pas b/Applications/GraphApplications/Paporotnik/Paporotnik.pas new file mode 100644 index 0000000..3d689e7 --- /dev/null +++ b/Applications/GraphApplications/Paporotnik/Paporotnik.pas @@ -0,0 +1,51 @@ +///Модуль для рисования фракталов семейства "Лист папоротника" +unit Paporotnik; + +uses GraphABC; + +type + + ///Настройки фрактала + PaporotnikFractalInitalData = record + data: array of array of real; + P0,P1,P2,P3:real; + end; + + ///Фрактал "Лист папоротника" + PaporotnikFractal = class + private + data: array of array of real; + P0,P1,P2,P3:real; + public + constructor(initdata: PaporotnikFractalInitalData); + begin + data := initdata.data; + P0 := initdata.P0; + P1 := initdata.P1; + P2 := initdata.P2; + P3 := initdata.P3; + end; + procedure Draw(x0,y0,Iterations,Height,Brightness: integer; fast: boolean); + begin + var plotx, ploty, x, y : real; + var Size := Height/11; + var Width := Height div 2; + var dx := Width div 2; + var dc := Iterations div Brightness; + if fast then + LockDrawing; + for var i:=1 to Iterations do begin + var P := Random(100); + var rnd := P = sealed class + where T: record; + + private f: BlockFileOf; + ///Автоматически очищает кэш после каждого чтения и записи + public AutoFlush := true; + ///Указывает, удалять ли файл, когда сборщик мусора удалит данный объект + public DeleteOnExit: boolean; + + + private function GetItem32(i: integer): T; + private function GetItem64(i: int64): T; + private function GetSection32(from, c: integer): array of T; + private function GetSection64(from, c: int64): array of T; + private function GetSectionLazy32(from, c: integer): sequence of T; + private function GetSectionLazy64(from, c: int64): sequence of T; + + private procedure SetItem32(i: integer; o: T); + private procedure SetItem64(i: int64; o: T); + private procedure SetSection32(from, c: integer; o: array of T); + private procedure SetSection64(from, c: int64; o: array of T); + private procedure SetSectionLazy32(from, c: integer; o: sequence of T); + private procedure SetSectionLazy64(from, c: int64; o: sequence of T); + + + + public property InnerFile: BlockFileOf read f; + + ///Возвращает количество элементов. В отличии от array of T - длину можно устанавливать + public property Length: int64 read f.Size write f.Size := value; + + ///Возвращает или задаёт элемент с индексом i + public property Item[i: integer]: T read GetItem32 write SetItem32; + ///Возвращает или задаёт элемент с индексом i + public property Item64[i: int64]: T read GetItem64 write SetItem64; default; + + ///Срез начиная с элемента from и длиной count + public property Section[from, count: integer]: array of T read GetSection32 write SetSection32; + ///Срез начиная с элемента from и длиной count + public property Section64[from, count: int64]: array of T read GetSection64 write SetSection64; + + ///Возвращает ленивую последовательность начиная с элемента from и длиной count + ///Устанавливает значение элементов начиная с элемента from и длиной count + public property SectionLazy[from, count: integer]: sequence of T read GetSectionLazy32 write SetSectionLazy32; + ///Возвращает ленивую последовательность начиная с элемента from и длиной count + ///Устанавливает значение элементов начиная с элемента from и длиной count + public property SectionLazy64[from, count: int64]: sequence of T read GetSectionLazy64 write SetSectionLazy64; + + + + ///Очищает кэш чтения/записи + public procedure Flush := f.BaseStream.Flush; + + + ///Создаёт новый массив, хранящий данные в файле fname. Если его нет - создаёт новый + public constructor(fname: string) := + Create(fname, System.IO.FileMode.OpenOrCreate); + + ///Создаёт новый массив хранящий данные в файле fname. + ///mode указывает каким образом открывать/создавать файл и имеет тип System.IO.FileMode + public constructor(fname: string; mode: System.IO.FileMode); + begin + f := new BlockFileOf(fname); + f.Open(mode); + end; + + ///Использует заданный файл как основу для массива + ///Если файл не открыт - его откроет в режиме System.IO.FileMode.OpenOrCreate + public constructor(&file: BlockFileOf); + begin + f := &file; + if not f.Opened then + f.Open(System.IO.FileMode.OpenOrCreate); + end; + + ///Открывает заданный файл в режиме mode и использует его как основу для массива + public constructor(&file: BlockFileOf; mode: System.IO.FileMode); + begin + f := &file; + f.Open(mode); + end; + + /// Создаёт новый массив хранящий данные в новом временном файл (в системной папке) + /// Созданный файл будет удалён в произвольное время после окончания использования переменной или при вызове Finalize + public constructor; + begin + Create(System.IO.Path.GetTempFileName, System.IO.FileMode.CreateNew); + DeleteOnExit := true; + end; + + ///Выполняет необходимую очистку при завершении работы с переменной + ///Этот метод выполнится автоматически в произвольное время (после окончания использования переменной) + ///Если попытаться использовать переменную после вызова этого метода - поведение будет неопределённым + public procedure Finalize; override; + begin + f.Close; + if DeleteOnExit then f.Delete; + end; + + end; + +implementation + +{$region index property's} + +function FileArr.GetItem32(i: integer) := GetItem64(i); + +function FileArr.GetSection32(from, c: integer) := GetSection64(from, c); + +function FileArr.GetSectionLazy32(from, c: integer) := GetSectionLazy64(from, c); + +procedure FileArr.SetItem32(i: integer; o: T) := SetItem64(i, o); + +procedure FileArr.SetSection32(from, c: integer; o: array of T) := SetSection64(from, c, o); + +procedure FileArr.SetSectionLazy32(from, c: integer; o: sequence of T) := SetSectionLazy64(from, c, o); + +function FileArr.GetItem64(i: int64): T; +begin + f.Seek(i); + Result := f.Read; + if AutoFlush then f.BaseStream.Flush; +end; + +function FileArr.GetSection64(from, c: int64): array of T; +begin + f.Seek(from); + Result := f.Read(c); + if AutoFlush then f.BaseStream.Flush; +end; + +function FileArr.GetSectionLazy64(from, c: int64): sequence of T; +begin + f.Seek(from); + Result := f.ReadLazy(c); + if AutoFlush then f.BaseStream.Flush; +end; + +procedure FileArr.SetItem64(i: int64; o: T); +begin + f.Seek(i); + f.Write(o); + if AutoFlush then f.BaseStream.Flush; +end; + +procedure FileArr.SetSection64(from, c: int64; o: array of T); +begin + f.Seek(from); + if c > o.Length then raise new System.IndexOutOfRangeException('count должно быть <= длинны переданного массива'); + f.Write(o, 0, c); + if AutoFlush then f.BaseStream.Flush; +end; + +procedure FileArr.SetSectionLazy64(from, c: int64; o: sequence of T); +begin + f.Seek(from); + f.Write(o, 0, c); + if AutoFlush then f.BaseStream.Flush; +end; + +{$endregion index property's} + +end. \ No newline at end of file diff --git a/BlockFileOfT/FileDatabase/База данных на файле.pas b/BlockFileOfT/FileDatabase/База данных на файле.pas new file mode 100644 index 0000000..fd4af02 --- /dev/null +++ b/BlockFileOfT/FileDatabase/База данных на файле.pas @@ -0,0 +1,201 @@ +uses BlockFileOfT; +uses System.Runtime.InteropServices;//нужно чтоб не писать System.Runtime.InteropServices.StructLayout и т.п. +uses FileArray; + +type + DataType1 = record + b: byte; + + constructor(b:byte) := + self.b := b; + + end; + DataType2 = record + i: integer; + + constructor(i:integer) := + self.i := i; + + end; + DataType3 = record + ch: char; + + constructor(ch:char) := + self.ch := ch; + + end; + DataType4 = record + r: real; + + constructor(r:real) := + self.r := r; + + end; + + DataType = ( + ByteData = 1, + IntData = 2, + CharData = 3, + RealData = 4 + ); + + [StructLayout(LayoutKind.&Explicit)] // Позволяет явно указывать позицию каждого поля + DataUnit = record + [FieldOffset(0)] DataT: byte; + [FieldOffset(8)] DataT1: DataType1; // У этих 4 полей одинаковая позиция + [FieldOffset(8)] DataT2: DataType2; // Значит, у них будет общая память + [FieldOffset(8)] DataT3: DataType3; // Но это так же значит что если записать данные 1 типа - + [FieldOffset(8)] DataT4: DataType4; // данные другого типа считать не выйдет (выведет мусор) + + constructor(data: DataType1); + begin + DataT := 1; + DataT1 := data; + end; + + constructor(data: DataType2); + begin + DataT := 2; + DataT2 := data; + end; + + constructor(data: DataType3); + begin + DataT := 3; + DataT3 := data; + end; + + constructor(data: DataType4); + begin + DataT := 4; + DataT4 := data; + end; + + function ToString:string; override; + begin + var sb := new StringBuilder; + + sb.AppendFormat( + 'DataUnit({0,8}, ', + System.Enum.GetName(typeof(DataType), DataT) + ); + + case DataType(DataT) of + ByteData: sb.AppendFormat('{0})',DataT1.b); + IntData : sb.AppendFormat('{0})',DataT2.i); + CharData: sb.AppendFormat('{0})',DataT3.ch); + RealData: sb.AppendFormat('{0})',DataT4.r); + else raise new System.FormatException($'Не правильный тип данных: {DataT}'); + end; + + Result := sb.ToString; + end; + + end; + + Database = class(System.IDisposable) + private const HeaderSize = 1 + 4*2; // 1 байт на версию + 4 символа (по 2 байта) на DatabaseType + + public version: byte; + public DatabaseType: string; + public BlockFile: BlockFileOf; + public Data: FileArr; + + public constructor := exit; + + public constructor(fname: string; version: byte; DatabaseType: string); + begin + self.version := version; + self.DatabaseType := DatabaseType; + + self.BlockFile := new BlockFileOf(fname); + self.BlockFile.Offset := HeaderSize; + self.BlockFile.Open(System.IO.FileMode.Create); + + self.Data := new FileArr(self.BlockFile); + end; + + public class function Load(fname: string): Database; + begin + Result := new Database; + + Result.BlockFile := new BlockFileOf(fname, HeaderSize); + Result.BlockFile.Reset; + + begin // заголовок + var br := new System.IO.BinaryReader(Result.BlockFile.BaseStream); + + Result.version := br.ReadByte; + Result.DatabaseType := string.Create(ArrGen(4,i->char(br.ReadUInt16))).TrimEnd('_'); + + end; + + Result.Data := new FileArr(Result.BlockFile); + + Result.Data.AutoFlush := false; + Result.Data.DeleteOnExit := false; + + end; + + public procedure Save; + begin + + begin // заголовок + self.BlockFile.PosByte := 0; + var bw := new System.IO.BinaryWriter(self.BlockFile.BaseStream); + + bw.Write(self.version); + + foreach var ch in self.DatabaseType.PadRight(4,'_') do + bw.Write(word(ch)); + + end; + + self.Data.Flush; + end; + + public function ToString:string; override; + begin + var sb := new StringBuilder; + sb += $'version: {version}{#10}'; + sb += $'Database Type: {DatabaseType}{#10}'; + sb += $'Data:[{#10}'; + + BlockFile.Pos := 0; + foreach var du in BlockFile.Read(BlockFile.Size) do + sb += $'{#9}{du}{#10}'; + + sb += $']'; + Result := sb.ToString; + end; + + public procedure Dispose; + begin + Data.Finalize; + end; + + end; + +begin + var db1 := new Database('temp.bin',1,'JSBD'); // JSBD = Just Some Basic Data + + db1.version := 5; // Была 1, изменили на 5 + db1.Data[0] := new DataUnit(new DataType1(123)); + db1.Data[1] := new DataUnit(new DataType2(456)); + db1.Data[2] := new DataUnit(new DataType3('A')); + db1.Data[3] := new DataUnit(new DataType4(123.456)); + + db1.Save; + db1.Dispose; + + + + db1 := Database.Load('temp.bin'); + writeln(db1); + + writeln; + // Пытаемся прочитать переменную типа integer там - где записана переменная типа real + // Это, конечно, выводит мусор + writeln('int from real: ', db1.Data[3].DataT2.i); + +end. \ No newline at end of file diff --git a/BlockFileOfT/Дополнительно.pas b/BlockFileOfT/Дополнительно.pas new file mode 100644 index 0000000..ad9eb09 --- /dev/null +++ b/BlockFileOfT/Дополнительно.pas @@ -0,0 +1,79 @@ +uses BlockFileOfT; + +uses System.Runtime.InteropServices; // для StructLayout у r3 + +type + r1 = record + b1, b2: byte; + + constructor(b1, b2: byte); + begin + self.b1 := b1; + self.b2 := b2; + end; + + ///Переопределение того - как объекты типа r1 будет выписывать writeln + function ToString: string; override := + $'r1({b1}, {b2})'; + + end; + + r2 = record + b: byte; + i: int64; + end; + + [StructLayout(LayoutKind.&Explicit, Size=9)] + r3 = record + [FieldOffset(0)] b: byte; + // Явно указываем что i будет хранится на следующем байте после b + // Так можно даже накладывать поля друг на друга + // Но поэтому также нужно относиться с осторожностью к такой возможности + // И помнить у какого типа какой размер, чтобы наложение полей не получилось там, где оно не требуется + [FieldOffset(1)] i: int64; + end; + +begin + var f := new BlockFileOf('temp.bin'); + f.Rewrite; + + f.Write(new r1(1, 2)); + f.Write(new r1(3, 4)); + f.Write(new r1(5, 6)); + + f.Pos := 1; + var str := f.BaseStream; + var br := new System.IO.BinaryReader(str); + Writeln(br.ReadByte); // 3 - потому что прочитало 1 байт, когда файловый курсор стоял в начале элемента #1 + + // А вот так делать не следует. Сейчас курсор находится в середине второго элемента + // Обычно это вызовет неопределённое поведение и заполнит поля полученной записи мусором + // Но этот случай простой, поэтому точно известно что прочитает половину второй и половину третьей записи и выведет (4,5) + Writeln(f.Read); + // Если вы НЕ пытаетесь специально читать мимо элементов - стоит устанавливать позицию в файле (f.Pos := ...) после прямой работы с BaseStream + + f.Pos := 0; + f.PosByte += 1; // сдвигаем курсор на один байт (вся запись f.TSize байт, что, в данном случае, 2) + // br и f всё ещё работают над тем же потоком, потому что мы не закрывали файл + // А файловый курсор хранится как раз в потоке + // Поэтому br можно всё ещё использовать и он будет синхронизирован с f.PosByte + Writeln(br.ReadByte); // 2, потому что второй байт первой записи + + f.Close; + + + + + var f2 := new BlockFileOf; + // f2.TSize это то же самое, что sizeof(r2) + // У меня 16, хотя sizeof(byte)=1 + sizeof(int64)=8, то есть должно быть 9? + // Это потому, что на многих процессорах добавляет отступы (так легче читать/записывать значения) в некоторые записи, так что будьте осторожны + // Это также хорошая причина не пользоваться бездумно BaseStream - потому что на разных компьютерах один и тот же код может работать по-разному + Writeln(f2.TSize); + + var f3 := new BlockFileOf; + // А вот теперь размер 9, потому что мы явно указали что отступ нам не нужен + // Конечно, теперь чтение/запись i может быть медленнее на некоторых процессорах, отступ всё же не для красоты был + Writeln(f3.TSize); + +end. \ No newline at end of file diff --git a/BlockFileOfT/Основы.pas b/BlockFileOfT/Основы.pas new file mode 100644 index 0000000..31586f8 --- /dev/null +++ b/BlockFileOfT/Основы.pas @@ -0,0 +1,67 @@ +uses BlockFileOfT; + +type + r1=record + i:integer; + r:real; + + constructor(i:integer; r:real); + begin + self.i := i; + self.r := r; + end; + ///Переопределение того - как объекты типа r1 будет выписывать writeln + function ToString:string; override := + $'r1({i}, {r})'; + end; + +begin +// var f: BlockFileOf; +// f := new BlockFileOf; // В отличии от file of T - BlockFileOf всегда надо инициализировать перед тем как использовать +// f.Assign('temp.bin'); + var f := new BlockFileOf('temp.bin'); // эта строчка работает как предыдущие 3 + + f.Rewrite; // Если навести мышку на метод (в данном случае .Rewrite) - показывает описание + f.Write(new r1(123,123.456)); + f.Write(new r1(456,456.789)); + +// f.Flush; // не обязательно - .Close вызывает .Flush перед тем как закрыть файл + // После работы с файлом - надо его закрыть. Иначе: + // 1. Часть данных может не сохраниться + // 2. Изменять файл вне переменной f будет нельзя, пока f держит его открытым + f.Close; + +// f.Assign('temp.bin'); // Не обязательно, файл остаётся привязан после закрытия + + f.Reset; + writeln($'Read#1: {f.Read}'); // r1(123,123.456) + writeln($'Pos#1: {f.Pos}'); // 1, потому что мы открыли файл через ".Reset" (курсор в начале файла) и затем прочитали 1 элемент + + // В отличии от file of T, у BlockFileOf нету режима чтения и режима записи + // Они объеденены, поэтому не надо закрывать файл чтобы записать что-то после чтения + f.Write(new r1(0,0)); + + writeln($'Size#1: {f.Size}'); // 2, потому что r1(0,0) НЕ втиснуло между первыми 2 элементами, а записало поверх второго + + writeln($'EOF: {f.EOF}'); // True, потому что у нас всего было 2 элемента и курсор сейчас стоит на позиции 2 (1 чтение + 1 запись) + +// f.Seek(1); + f.Pos := 1; // То же самое, что и .Seek(1), но лучше + + writeln($'Read#2: {f.Read}'); // r1(0,0), то, что мы только что записали + + f.Pos := 5; // Можно ставить за границей файла +// f.Read; // Ошибка: Нельзя читать за пределами файла. Можно только записывать + f.Write(new r1); + writeln($'Size#2: {f.Size}'); // 6, потому что мы записали +1 элемент после позиции 5 + + // Но вообще, размер правильно менять так: + f.Size := 10; + writeln($'Size#3: {f.Size}'); // 10 + writeln($'Pos#2: {f.Pos}'); // 6, как и была после того, как мы последний раз вызвали .Write + + // Программа сейчас завершится, поэтому файл закроется сам + // Но если не вызвать хотя бы Flush, то изменения могут не сохранится + f.Flush; + +end. \ No newline at end of file diff --git a/BlockFileOfT/Справка.html b/BlockFileOfT/Справка.html new file mode 100644 index 0000000..345a868 --- /dev/null +++ b/BlockFileOfT/Справка.html @@ -0,0 +1,22 @@ + + + + + + + + + + + Выберете раздел: + +
+ Если найдёте что-то неправильное или ошибку (в том числе и грамматическую) в справке - пишите сюда. + + + \ No newline at end of file diff --git a/BlockFileOfT/СправкаData/RefTSaving.html b/BlockFileOfT/СправкаData/RefTSaving.html new file mode 100644 index 0000000..8348a1f --- /dev/null +++ b/BlockFileOfT/СправкаData/RefTSaving.html @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + <=
+
+ Сохранение ссылочных типов в блочный файл.
+
+ + + +

В чём проблема ссылочных типов

+ + + + +

Размерные массивы и строки

+ + + + + + + \ No newline at end of file diff --git a/BlockFileOfT/СправкаData/WhyOffset.html b/BlockFileOfT/СправкаData/WhyOffset.html new file mode 100644 index 0000000..02d9f37 --- /dev/null +++ b/BlockFileOfT/СправкаData/WhyOffset.html @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + <=
+
+
+ + +

Что такое "Offset"

+ + + + +

Заголовки

+ + + + + + \ No newline at end of file diff --git a/BlockFileOfT/СправкаData/main.html b/BlockFileOfT/СправкаData/main.html new file mode 100644 index 0000000..c7a7fdd --- /dev/null +++ b/BlockFileOfT/СправкаData/main.html @@ -0,0 +1,265 @@ + + + + + + + + + + + + + + <=
+
+ Основной упор данной страницы - сравнение "file of T" и "BlockFileOf<T>".
+ Но она также подходит и для обучения основам "BlockFileOf<T>". +
+ + +

Объявление

+ + + + +

Основы записи/чтения

+ + + + +

Перечисление всех элементов в файле

+ + + + +

Основное преимущество: сохранение записей (record)

+ + + + + + \ No newline at end of file diff --git a/BlockFileOfT/Сравнение скорости.pas b/BlockFileOfT/Сравнение скорости.pas new file mode 100644 index 0000000..6e4a06f --- /dev/null +++ b/BlockFileOfT/Сравнение скорости.pas @@ -0,0 +1,289 @@ +uses BlockFileOfT; + +// Эта процедура позволяет копировать память между содержимым массива и другим массивом/стеком +// При этом не волнуясь о блокировках массивов в памяти +// Если элемент массива передан как var-параметр, то сборщик мусора не трогает этот массив +procedure CopyMem(var o1: T1; var o2: T2; count: integer) := +System.Buffer.MemoryCopy( + @o1, @o2, + count, count +); + +type + StructLayout = System.Runtime.InteropServices.StructLayoutAttribute; + LayoutKind = System.Runtime.InteropServices.LayoutKind; + FieldOffset = System.Runtime.InteropServices.FieldOffsetAttribute; + + + + // Size контролирует размер записи. Его можно не указывать, тогда его выберет автоматически + // В нашем случае нужен один байт для поля length + // А затем место под 255 символов (масимум, который может хранить эта строка) + // При этом каждый символ занимает два байта в памяти + [StructLayout(LayoutKind.&Explicit, Size= 1 + 255*2 )] + ValueString255 = record + public [FieldOffset(0)] length: byte; + public [FieldOffset(1)] body: char; + + public const MaxLength = 255; + + // operator explicit, принимающий array of char и возвращающий ValueString255 выглядит в коде как: + // var s := ValueString255(a); + // Где тип у "a" — array of char + public static function operator explicit(a: array of char): ValueString255; + begin + Result.length := Min(MaxLength, a.Length); // если a.Length>MaxLength, то length надо обрезать до MaxLength + if Result.length=0 then exit; // иначе упадёт a[0] + CopyMem(a[0], Result.body, Result.length*2); // char занимает два байта, поэтому копируем length*2 + end; + + public static function operator explicit(s: string): ValueString255; + begin + Result.length := Min(MaxLength, s.Length); + if Result.length=0 then exit; + CopyMem(s[1], Result.body, Result.length*2); + end; + + public static function operator explicit(s: ValueString255): array of char; + begin + Result := new char[s.length]; + if s.length=0 then exit; + CopyMem(s.body, Result[0], s.length*2); + end; + + // объявлять тип CharArr может быть неудобно + public function ToCharArray: array of char; + type CharArr = array of char; + begin + Result := CharArr(self); + end; + + public static function operator explicit(s: ValueString255): string := + new string(@s.body, 0, s.length); + + public function ToString: string; override := + string(self); + + end; + + ///Это будет сохранять в file of T + AR = record + s: string[255]; + + //dt: DateTime; // Не даёт ¯\_(ツ)_/¯ + dt: int64; // Ну и ладно, в System.DateTime всё хранится в одном поле типа int64 + + i: integer; + ch: char; + b: byte; + end; + ///Это будет сохранять в BlockFileOf + BR = record + s: ValueString255; + dt: DateTime; // А BlockFileOf принимает любые размерные типы без ограничений + i: integer; + ch: char; + b: byte; + end; + + ///Это тип для ввода/вывода + ///В нём хранятся входные данные, общие и для file of T, и для BlockFileOf + ///Тут же описаны и преобразования всех особых типов + ///Заметьте, преобразование string[255] к string и назад ничего не копирует и не преобразовывает, если изначальная строка уже была <= 255 символов + ///Поэтому преобразования между ValueString255 и string работают медленнее + ///И даже при этом BlockFileOf всё равно быстрее + IOR = record + s: string; + dt: System.DateTime; + i: integer; + ch: char; + b: byte; + + static function operator explicit(a: IOR): AR; + begin + Result.s := a.s; + Result.dt := a.dt.Ticks; // Ticks возвращает никак не преобразованное значение единственного внутреннего поля DateTime + Result.i := a.i; + Result.ch := a.ch; + Result.b := a.b; + end; + + static function operator explicit(a: IOR): BR; + begin + Result.s := ValueString255(a.s); // вызываем наш operator explicit + Result.dt := a.dt; + Result.i := a.i; + Result.ch := a.ch; + Result.b := a.b; + end; + + static function operator explicit(a: AR): IOR; + begin + Result.s := a.s; + Result.dt := new DateTime(a.dt); // Единственный конструктор DateTime принимающий 1 параметр - принимает кол-во тиков. И напрямую присваивает это значение внутреннему полю + Result.i := a.i; + Result.ch := a.ch; + Result.b := a.b; + end; + + static function operator explicit(a: BR): IOR; + begin + Result.s := string(a.s); + Result.dt := a.dt; + Result.i := a.i; + Result.ch := a.ch; + Result.b := a.b; + end; + + static function GetRandom: IOR; + begin + Result.s := new string(ArrGen(Random(256), i -> ChrAnsi(Random(byte.MaxValue)))); + Result.dt := System.DateTime.Now.AddTicks(System.Convert.ToInt64(((Random * 2 - 1) * 1024 * 1024 * 1024 * 1024))); + Result.i := (Random(word.MaxValue) shl 16) + Random(word.MaxValue); + Result.ch := ChrAnsi(Random(byte.MaxValue)); + Result.b := Random(256); + end; + + public function ToString: string; override := + $'IOR( s.Length={s.Length}, dt={dt}, i={i}, ch="{ch}", b={b} )'; + + end; + +procedure TestIntegrity1(c: integer); +begin + + var f: file of AR; + var test_arr := ArrGen(c, i -> IOR.GetRandom); + + Rewrite(f, 'temp.bin'); + foreach var a in test_arr.Select(a -> AR(a)) do + f.Write(a); + + f.Close; + + Reset(f); + var n_test_arr := f.ReadElements.Select(a -> IOR(a)).ToArray; + f.Close; + + if not test_arr.SequenceEqual(n_test_arr) then + begin + writeln('тест 1 (file of T) не пройден'); + if test_arr.Length <> n_test_arr.Length then + writeln($'len: {test_arr.Length} <> {n_test_arr.Length}') else + for var i := 0 to test_arr.Length - 1 do + if test_arr[i] <> n_test_arr[i] then + begin + writeln($'el:{#10}{test_arr[i]}{#10}{n_test_arr[i]}{#10}'); + end; + readln; + exit; + end; + +end; + +procedure TestIntegrity2(c: integer); +begin + + var f := new BlockFileOf
('temp.bin'); + var test_arr := ArrGen(c, i -> IOR.GetRandom); + + f.Rewrite; + f.Write(test_arr.ConvertAll(a -> BR(a))); + f.Close; + + f.Reset; + var n_test_arr := f.Read(f.Size).ConvertAll(a -> IOR(a)); + f.Close; + + if not test_arr.SequenceEqual(n_test_arr) then + begin + writeln('тест 2 (BlockFileOf) не пройден'); + if test_arr.Length <> n_test_arr.Length then + writeln($'len: {test_arr.Length} <> {n_test_arr.Length}') else + for var i := 0 to test_arr.Length - 1 do + if test_arr[i] <> n_test_arr[i] then + begin + writeln($'el:{#10}{test_arr[i]}{#10}{n_test_arr[i]}{#10}'); + end; + + readln; + exit; + end; + +end; + +procedure TestIntegrity; +begin + TestIntegrity1(10000); + writeln('тест 1 ok'); + TestIntegrity2(10000); + writeln('тест 2 ok'); + writeln('тесты ok'); +end; + +procedure TestSpeed; +begin + + var sw := new System.Diagnostics.Stopwatch; // Точнее, чем этим, замерить невозможно + var lc := 10; + var ec := 10000;//Чем больше элементов, тем больше преимущество BlockFileOf, потому что он сохраняет их всех сразу. + //Но он быстрее даже если сохранять по одному элементу + var t1, t2: int64; + + var f1: file of AR; + Assign(f1, 'temp.bin'); + var f2 := new BlockFileOf
('temp.bin'); + + while true do + begin + + var test_arr := ArrGen(ec, i -> IOR.GetRandom); + + sw.Restart; + loop lc do + begin + Rewrite(f1); + var AR_arr := test_arr.ConvertAll(a -> AR(a)); + foreach var a in AR_arr do f1.Write(a); + f1.Close; + + Reset(f1); + ArrGen(ec, i -> IOR(f1.Read)); + f1.Close; + end; + sw.Stop; + t1 += sw.ElapsedTicks; + + sw.Restart; + loop lc do + begin + f2.Rewrite; + f2.Write(test_arr.ConvertAll(a -> BR(a))); + f2.Close; + + f2.Reset; + f2.Read(ec).ConvertAll(a -> IOR(a)); + f2.Close; + end; + sw.Stop; + t2 += sw.ElapsedTicks; + + System.GC.Collect; + System.Console.Clear; + writeln($'file of T: {t1}'); + writeln($'BlockFile: {t2}'); + end; + +end; + +begin + // Уберите флажок "Debug версия" в "Сервис>>Настройки>>Опции компиляции" и запускайте по Shift+F9, иначе отладка может неравномерно влиять на результаты + + // Тест на отсутствие ошибок. Можно убрать + TestIntegrity; + + // Тест скорости + // Он бесконечный, чем дольше тестируется - тем более усреднённые, а значит и более точные результаты + TestSpeed; + +end. \ No newline at end of file diff --git a/CheckedTasks/DrawMan/DMpp17.pas b/CheckedTasks/DrawMan/DMpp17.pas new file mode 100644 index 0000000..3c2c23b --- /dev/null +++ b/CheckedTasks/DrawMan/DMpp17.pas @@ -0,0 +1,27 @@ +// Выполнение задания pp17 для Чертежника +uses Drawman; + +procedure Spir(n: integer); +begin + PenDown; + var i := n; + while i>=1 do + begin + OnVector(0,i); + OnVector(i,0); + i -= 1; + OnVector(0,-i); + OnVector(-i,0); + i -= 1; + end; + PenUp; +end; + +begin + Task('pp17'); + ToPoint(2,2); + Spir(10); + ToPoint(16,2); + Spir(8); + ToPoint(0,0); +end. diff --git a/CheckedTasks/DrawMan/DrawManMakeTask/DMMy1.pas b/CheckedTasks/DrawMan/DrawManMakeTask/DMMy1.pas new file mode 100644 index 0000000..bae8386 --- /dev/null +++ b/CheckedTasks/DrawMan/DrawManMakeTask/DMMy1.pas @@ -0,0 +1,5 @@ +uses DrawMan,DMTasks; + +begin + Task('mydm1'); +end. diff --git a/CheckedTasks/DrawMan/DrawManMakeTask/DMTasks.pas b/CheckedTasks/DrawMan/DrawManMakeTask/DMTasks.pas new file mode 100644 index 0000000..ff4c76f --- /dev/null +++ b/CheckedTasks/DrawMan/DrawManMakeTask/DMTasks.pas @@ -0,0 +1,60 @@ +unit DMTasks; + +interface + +uses DMTaskMaker; + +implementation + +procedure FirstDM; +var i,a: integer; +begin + TaskText('Задание mydm1. Начертите, используя цикл'); + Field(14,8); + DoToPoint(7,7); + a:=6; + for i:=1 to 6 do + begin + DoPenDown; + DoOnVector(a,-a); + DoOnVector(-a,a); + DoOnVector(-a,-a); + DoOnVector(a,a); + Dec(a); + DoPenUp; + DoOnVector(0,-1); + end; +end; + +procedure DoCross; +begin + DoPenDown; + DoOnVector(1,0); DoOnVector(0,-1); + DoOnVector(1,0); DoOnVector(0,-1); + DoOnVector(-1,0); DoOnVector(0,-1); + DoOnVector(-1,0); DoOnVector(0,1); + DoOnVector(-1,0); DoOnVector(0,1); + DoOnVector(1,0); DoOnVector(0,1); + DoPenUp; +end; + +procedure SecondDM; +begin + TaskText('Задание mydm2. Начертите, используя процедуру Cross'); + Field(18,12); + DoToPoint(3,8); + DoCross; + DoToPoint(8,4); + DoCross; + DoToPoint(12,11); + DoCross; + DoToPoint(15,6); + DoCross; +end; + +begin + RegisterGroup('mydm','Мои задания для Чертежника','DMTasks',2); + RegisterTask('mydm1',FirstDM); + RegisterTask('mydm2',SecondDM); +end. + diff --git a/CheckedTasks/DrawMan/random_DM.pas b/CheckedTasks/DrawMan/random_DM.pas new file mode 100644 index 0000000..c9f2904 --- /dev/null +++ b/CheckedTasks/DrawMan/random_DM.pas @@ -0,0 +1,16 @@ +// Демонстрация использования случайных чисел для Чертежника. Лучи +uses DrawMan; + +begin + Field(30,22); + ToPoint(15,11); + PenDown; + for var i:=1 to 100 do + begin + var dx := Random(-10,10); + var dy := Random(-10,10); + OnVector(dx,dy); + OnVector(-dx,-dy); + end; + PenUp; +end. diff --git a/CheckedTasks/PT4/Dynamic2.pas b/CheckedTasks/PT4/Dynamic2.pas new file mode 100644 index 0000000..4888d19 --- /dev/null +++ b/CheckedTasks/PT4/Dynamic2.pas @@ -0,0 +1,18 @@ +// Пример решения задачи Dynamic2 из электронного задачника Programming Taskbook +uses PT4; + +var p1,p2: PNode; + +begin + Task('Dynamic2'); + read(p1); + var n := 0; + while p1 <> nil do + begin + write(p1^.Data); + n += 1; + p2 := p1; { сохраняем адрес текущего элемента } + p1 := p1^.Next; { и переходим к следующему элементу } + end; + write(n, p2); +end. \ No newline at end of file diff --git a/CheckedTasks/PT4/File48.pas b/CheckedTasks/PT4/File48.pas new file mode 100644 index 0000000..d73fec2 --- /dev/null +++ b/CheckedTasks/PT4/File48.pas @@ -0,0 +1,24 @@ +// Пример решения задачи File48 из электронного задачника Programming Taskbook +uses PT4; +var + f: array [1..4] of file of integer; +begin + Task('File48'); + for var i:=1 to 4 do + begin + var s: string; + read(s); + Assign(f[i], s); + if i < 4 then Reset(f[i]) + else Rewrite(f[i]); + end; + while not Eof(f[1]) do + for var i:=1 to 3 do + begin + var a: integer; + read(f[i],a); + write(f[4],a); + end; + for var i := 1 to 4 do + Close(f[i]); +end. diff --git a/CheckedTasks/PT4/PT4TaskMaker/Demo1.pas b/CheckedTasks/PT4/PT4TaskMaker/Demo1.pas new file mode 100644 index 0000000..7bee82d --- /dev/null +++ b/CheckedTasks/PT4/PT4TaskMaker/Demo1.pas @@ -0,0 +1,4 @@ +uses PT4, PT4Demo; +begin + Task('Demo1?'); +end. \ No newline at end of file diff --git a/CheckedTasks/PT4/PT4TaskMaker/PT4Demo.pas b/CheckedTasks/PT4/PT4TaskMaker/PT4Demo.pas new file mode 100644 index 0000000..2fed7f4 --- /dev/null +++ b/CheckedTasks/PT4/PT4TaskMaker/PT4Demo.pas @@ -0,0 +1,291 @@ +unit PT4Demo; + +interface + +implementation + +uses PT4TaskMaker; + +procedure Demo3; +var + a, b: real; +begin + CreateTask('Ввод и вывод данных, оператор присваивания'); + TaskText('Даны стороны прямоугольника~{a} и~{b}.', 0, 2); + TaskText('Найти его площадь {S}~=~{a}\*{b} и периметр ' + + '{P}~=~2\*({a}\;+\;{b}).', 0, 4); + a := (1 + Random(100)) / 10; + b := (1 + Random(100)) / 10; + DataR('a = ', a, xLeft, 3, 4); + DataR('b = ', b, xRight, 3, 4); + ResultR('S = ', a * b, 0, 2, 4); + ResultR('P = ', 2 * (a + b), 0, 4, 4); + SetTestCount(3); +end; + +procedure Demo4; +var + m, n, i, j, k: integer; + a: array [1..5, 1..8] of real; +begin + CreateTask('Двумерные массивы (матрицы): вывод элементов'); + TaskText('Дана матрица размера~{M}\;\x\;{N} ' + + 'и целое число~{K} (1~\l~{K}~\l~{M}).', 0, 2); + TaskText('Вывести элементы {K}-й строки данной матрицы.', 0, 4); + m := 2 + Random(4); + n := 4 + Random(5); + k := 1; + if m = 5 then k := 0; + DataN('M = ', m, 3, 1, 1); + DataN('N = ', n, 10, 1, 1); + for i := 1 to M do + for j := 1 to N do + begin + a[i, j] := 9.98 * Random; + DataR('', a[i,j], Center(j, n, 4, 2), i + k, 4); + end; + k := 1 + Random(m); + dataN('K = ', k, 68, 5, 1); + for j := 1 to n do + ResultR('', a[k, j], Center(j, n, 4, 2), 3, 4); +end; + +procedure Demo5; +var s: string; +begin + CreateTask('Символы и строки: основные операции'); + TaskText('Дана строка~{S}.', 0, 2); + TaskText('Вывести ее первый и последний символ.', 0, 4); + s := WordSample(Random(WordCount)); + DataS('S = ', s, 0, 3); + ResultC('Первый символ: ', s[1], xLeft, 3); + ResultC('Последний символ: ', s[length(s)], xRight, 3); + SetTestCount(4); +end; + +function FileName(Len: integer): string; +const + c = '0123456789abcdefghijklmnopqrstuvwxyz'; +var + i: integer; +begin + result := ''; + for i := 1 to Len do + result := result + c[Random(Length(c))+1]; +end; + +procedure Demo6; +var + k, i, j, jmax: integer; + s1, s2, s3: string; + fs1: file of ShortString; + fs2: file of ShortString; + fc3: file of char; + s: ShortString; + c: char; +begin + CreateTask('Символьные и строковые файлы'); + TaskText('Дано целое число~{K} (>\,0) и строковый файл.', 0, 1); + TaskText('Создать два новых файла: строковый, содержащий ' + + 'первые {K}~символов', 0, 2); + TaskText('каждой строки исходного файла, и символьный, ' + + 'содержащий {K}-й символ', 0, 3); + TaskText('каждой строки (если длина строки меньше~{K}, ' + + 'то в строковый файл', 0, 4); + TaskText('записывается вся строка, а в символьный файл ' + + 'записывается пробел).', 0, 5); + s1 := '1' + FileName(5) + '.tst'; + s2 := '2' + FileName(5) + '.tst'; + s3 := '3' + FileName(5) + '.tst'; + Assign(fs1, s1); + Rewrite(fs1); + Assign(fs2, s2); + Rewrite(fs2); + Assign(fc3, s3); + Rewrite(fc3); + k := 2 + Random(10); + jmax := 0; + for i := 1 to 10 + Random(20) do + begin + j := 2 + Random(15); + if jmax < j then + jmax := j; + s := FileName(j); + write(fs1, s); + if j >= k then + c := s[k] + else + c := ' '; + write(fc3, c); + s := copy(s, 1, k); + write(fs2,s); + end; + Close(fs1); + Close(fs2); + Close(fc3); + DataN('K =', k, 0, 1, 2); + DataS('Имя исходного файла: ', s1, 3, 2); + DataS('Имя результирующего строкового файла: ', s2, 3, 4); + DataS('Имя результирующего символьного файла: ', s3, 3, 5); + DataComment('Содержимое исходного файла:', xRight, 2); + DataFileS(s1, 3, jmax + 3); + ResultComment('Содержимое результирующего строкового файла:', 0, 2); + ResultComment('Содержимое результирующего символьного файла:', 0, 4); + ResultFileS(s2, 3, k + 3); + ResultFileC(s3, 5, 4); +end; + +procedure Demo7; +var + p: integer; + s, s1, s2: string; + t1, t2: text; +begin + CreateTask('Текстовые файлы: основные операции'); + TaskText('Дан текстовый файл.', 0, 2); + TaskText('Удалить из него все пустые строки.', 0, 4); + s1 := FileName(6) + '.tst'; + s2 := '#' + FileName(6) + '.tst'; + s := TextSample(Random(TextCount)); + Assign(t2, s2); + Rewrite(t2); + Assign(t1, s1); + Rewrite(t1); + writeln(t2, s); + Close(t2); + p := Pos(#13#10#13#10, s); + while p <> 0 do + begin + Delete(s, p, 2); + p := Pos(#13#10#13#10, s); + end; + writeln(t1, s); + Close(t1); + ResultFileT(s1, 1, 5); + Rename(t2, s1); + DataFileT(s1, 2, 5); + DataS('Имя файла: ', s1, 0, 1); + SetTestCount(3); +end; + +var WrongNode: TNode; + +procedure Demo8Data; +var + i, n: integer; + p, p1, p2: PNode; +begin + if Random(4) = 0 then + n := 1 + else + n := 2 + Random(8); + new(p1); + p1^.Data := Random(90) + 10; + p1^.Prev := nil; + p2 := p1; + for i := 2 to n do + begin + new(p); + p^.Data := Random(90) + 10; + p^.Prev := p2; + p2^.Next := p; + p2 := p; + end; + p2^.Next := nil; + SetPointer(1, p1); + SetPointer(2, p2); + ResultP('Последний элемент: ', 2, 0, 2); + ResultList(1, 0, 3); + ShowPointer(2); + DataP('', 1, 0, 2); + p := p1; + for i := 1 to n do + begin + p^.prev := @WrongNode; + p := p^.Next; + end; + DataList(1, 0, 3); + ShowPointer(1); +end; + +procedure Demo8; +begin + CreateTask('Динамические структуры данных: двусвязный список'); + TaskText('Дан указатель~{P}_1 на начало непустой цепочки ' + + 'элементов-записей типа TNode,', 0, 1); + TaskText('связанных между собой с помощью поля Next. Используя ' + + 'поле Prev записи TNode,', 0, 2); + TaskText('преобразовать исходную (\Iодносвязную\i) цепочку ' + + 'в \Iдвусвязную\i, в которой каждый', 0, 3); + TaskText('элемент связан не только с последующим элементом ' + + '(с помощью поля Next),', 0, 4); + TaskText('но и с предыдущим (с помощью поля Prev). Поле Prev ' + + 'первого элемента положить', 0, 5); + TaskText('равным \N. Вывести указатель на последний элемент ' + + 'преобразованной цепочки.', 0, 0); + Demo8Data; +end; + +procedure Demo8Net; +begin + CreateTask('Динамические структуры данных: двусвязный список'); + TaskText('Дана ссылка~{A}_1 на начало непустой цепочки ' + + 'элементов-объектов типа Node,', 0, 1); + TaskText('связанных между собой с помощью своих свойств Next. ' + + 'Используя свойства Prev', 0, 2); + TaskText('данных объектов, преобразовать исходную ' + + '(\Iодносвязную\i) цепочку в \Iдвусвязную\i,', 0, 3); + TaskText('в которой каждый элемент связан не только ' + + 'с последующим элементом (с помощью', 0, 4); + TaskText('свойства Next), но и с предыдущим (с помощью ' + + 'свойства Prev). Свойство Prev', 0, 5); + TaskText('первого элемента положить равным \O. Вывести ' + + 'ссылку~{A}_2 на последний', 0, 0); + TaskText('элемент преобразованной цепочки.', 0, 0); + SetObjectStyle; + Demo8Data; +end; + +procedure InitTask(num: integer); +begin + case num of + 1..2: UseTask('Begin', num); + 3: Demo3; + 4: Demo4; + 5: Demo5; + 6: Demo6; + 7: Demo7; + 8: Demo8; + 9: Demo8Net; + end; +end; + +begin + CreateGroup('Demo', 'Примеры различных задач', 'М. Э. Абрамян, 2009', + 'df6yui13dffdsttd', 9, InitTask); + CommentText('Данная группа демонстрирует различные возможности'); + CommentText('\Iконструктора учебных заданий\i \MPT4TaskMaker\m.'); + + Subgroup('Ввод и вывод данных, оператор присваивания'); + CommentText('В этой подгруппе содержатся задания, импортированные'); + CommentText('из группы Begin.\PПриводимый ниже абзац преамбулы'); + CommentText('также импортирован из данной группы.\P'); + UseComment('Begin'); + + Subgroup('Двумерные массивы (матрицы): вывод элементов'); + CommentText('Данное задание дублирует задание Matrix7.'); + + Subgroup('Символьные и строковые файлы'); + CommentText('Данное задание дублирует задание File63. Оно демонстрирует'); + CommentText('особенности, связанные с двоичными \Iстроковыми\i файлами.'); + + Subgroup('Текстовые файлы: основные операции'); + CommentText('Данное задание дублирует задание Text16.'); + + Subgroup('Динамические структуры данных: двусвязный список'); + CommentText('Первое задание дублирует задание Dynamic30.'); + CommentText('Второе задание дублирует задание ObjDyn30 и представляет'); + CommentText('собой \<объектный\> вариант первого задания.'); + + RegisterGroup('PT4Demo'); +end. \ No newline at end of file diff --git a/CheckedTasks/PT4/PT4TaskMaker/PT4DemoTest.pas b/CheckedTasks/PT4/PT4TaskMaker/PT4DemoTest.pas new file mode 100644 index 0000000..9736d7a --- /dev/null +++ b/CheckedTasks/PT4/PT4TaskMaker/PT4DemoTest.pas @@ -0,0 +1,7 @@ +uses PT4, PT4Demo; +begin +// для отображения окна задачника +// надо закомментировать вызов процедуры MakeText + MakeText('Demo'); + Task('Demo7?'); +end. \ No newline at end of file diff --git a/CheckedTasks/PT4/String9.pas b/CheckedTasks/PT4/String9.pas new file mode 100644 index 0000000..44715e3 --- /dev/null +++ b/CheckedTasks/PT4/String9.pas @@ -0,0 +1,15 @@ +// Пример решения задачи String9 из электронного задачника Programming Taskbook +uses PT4; +var + n: integer; + c1,c2: char; + s: string; +begin + Task('String9'); + read(n,c1,c2); + s := ''; + for var i := 1 to n div 2 do + s := s + c1 + c2; + write(s); +end. + diff --git a/CheckedTasks/Robot/RBcc17.pas b/CheckedTasks/Robot/RBcc17.pas new file mode 100644 index 0000000..59285e1 --- /dev/null +++ b/CheckedTasks/Robot/RBcc17.pas @@ -0,0 +1,23 @@ +// Выполнение задания cc17 для Робота +uses Robot; + +begin + Task('cc17'); + for var i:=6 downto 1 do + begin + for var j:=1 to i do + begin + for var k:=1 to j do + begin + Paint; + Up; + end; + for var k:=1 to j do + Down; + Right; + end; + Right; + end; + Left; +end. + diff --git a/CheckedTasks/Robot/RobotMakeTask/RBMy1.pas b/CheckedTasks/Robot/RobotMakeTask/RBMy1.pas new file mode 100644 index 0000000..62fbc7a --- /dev/null +++ b/CheckedTasks/Robot/RobotMakeTask/RBMy1.pas @@ -0,0 +1,5 @@ +uses Robot,RobTasks; + +begin + Task('myrob1'); +end. diff --git a/CheckedTasks/Robot/RobotMakeTask/RobTasks.pas b/CheckedTasks/Robot/RobotMakeTask/RobTasks.pas new file mode 100644 index 0000000..d1ae196 --- /dev/null +++ b/CheckedTasks/Robot/RobotMakeTask/RobTasks.pas @@ -0,0 +1,44 @@ +unit RobTasks; + +interface + +uses RobotTaskMaker; + +implementation + +procedure FirstRob; +begin + TaskText('Задание myrob1. Закрасить помеченные клетки'); + Field(10,6); + HorizontalWall(0,3,4); + VerticalWall(4,3,2); + RobotBegin(1,4); + VerticalWall(5,1,5); + HorizontalWall(5,1,4); + RobotEnd(6,2); + Tag(6,2); +end; + +procedure SecondRob; +var n,i: integer; +begin + TaskText('Задание myrob2. Закрасить клетки под закрашенными'); + n:=Random(4)+7; + Field(n,4); + RobotBeginEnd(1,3,n,3); + MarkPainted(n,2); + Tag(n,3); + for i:=2 to n-1 do + if Random(3)=1 then + begin + MarkPainted(i,2); + Tag(i,3); + end; +end; + +begin + RegisterTask('myrob1',FirstRob); + RegisterTask('myrob2',SecondRob); + RegisterGroup('myrob', 'Мои задания для Робота', 'RobTasks', 2); +end. + diff --git a/CheckedTasks/Robot/random_Robot.pas b/CheckedTasks/Robot/random_Robot.pas new file mode 100644 index 0000000..4ab24f2 --- /dev/null +++ b/CheckedTasks/Robot/random_Robot.pas @@ -0,0 +1,17 @@ + // Демонстрация использования случайных чисел для Робота. Случайное блуждание +uses Robot; + +begin + Field(50,40); + while True do + begin + var r := Random(4); + case r of + 0: if FreeFromUp then Up; + 1: if FreeFromDown then Down; + 2: if FreeFromLeft then Left; + 3: if FreeFromRight then Right; + end; + Paint; + end; +end. diff --git a/Games/15.pas b/Games/15.pas new file mode 100644 index 0000000..ccf1f38 --- /dev/null +++ b/Games/15.pas @@ -0,0 +1,178 @@ +// Игра в 15 +uses GraphABC,ABCObjects,ABCButtons; + +const +/// размер поля + n = 4; +/// размер фишки + sz = 100; +/// зазор между фишками + zz = 10; +/// отступ от левого и правого краев + x0 = 20; +/// отступ от верхнего и нижнего краев + y0 = 20; + +var + p: array [1..n,1..n] of SquareABC; + digits: array [1..n*n-1] of integer; + + MeshButton: ButtonABC; + StatusRect: RectangleABC; + + EmptyCellX,EmptyCellY: integer; + MovesCount: integer; + EndOfGame: boolean; // True если все фишки стоят на своих местах + +// Поменять местами две фишки +procedure Swap(var p,p1: SquareABC); +begin + PABCSystem.Swap(p,p1); + var i := p.Left; + p.Left := p1.Left; + p1.Left := i; + i := p.Top; + p.Top := p1.Top; + p1.Top := i; +end; + +// Определить, являются ли клетки соседями +function Neighbours(x1,y1,x2,y2: integer): boolean; +begin + Result := (Abs(x1-x2)=1) and (y1=y2) or (Abs(y1-y2)=1) and (x1=x2) +end; + +// Заполнить вспомогательный массив цифр +procedure FillDigitsArr; +begin + for var i:=1 to n*n-1 do + digits[i] := i; +end; + +// Перемешать вспомогательный массив цифр. Количество обменов должно быть четным +procedure MixDigitsArr; +var x: integer; +begin + for var i:=1 to n*n-1 do + begin + repeat + x := Random(15)+1; + until x<>i; + Swap(digits[i],digits[x]); + end; + if n mod 2=0 then + Swap(digits[1],digits[2]); // количество обменов должно быть четным +end; + +// Заполнить двумерный массив фишек. Вместо пустой ячейки - белая фишка с числом 0 +procedure Fill15ByDigitsArr; +begin + Swap(p[EmptyCellY,EmptyCellX],p[n,n]); // Переместить пустую фишку в правый нижний угол + EmptyCellX := n; + EmptyCellY := n; + var i := 1; + for var y:=1 to n do + for var x:=1 to n do + begin + if x*y=n*n then exit; + p[y,x].Number := digits[i]; + i += 1; + end; +end; + +// Перемешать массив фишек +procedure Mix15; +begin + MixDigitsArr; + Fill15ByDigitsArr; + MovesCount := 0; + EndOfGame := False; + StatusRect.Text := 'Количество ходов: '+IntToStr(MovesCount); + StatusRect.Color := RGB(200,200,255); +end; + +// Создать массив фишек +procedure Create15; +begin + EmptyCellX := n; + EmptyCellY := n; + for var x:=1 to n do + for var y:=1 to n do + begin + p[y,x] := new SquareABC(x0+(x-1)*(sz+zz),y0+(y-1)*(sz+zz),sz,clMoneyGreen); + p[y,x].BorderColor := clGreen; + p[y,x].BorderWidth := 2; + p[y,x].TextScale := 0.7; + end; + p[EmptyCellY,EmptyCellX].Color := clWhite; + p[EmptyCellY,EmptyCellX].BorderColor := clWhite; + FillDigitsArr; + MixDigitsArr; + Fill15ByDigitsArr; +end; + +// Проверить, все ли фишки стоят на своих местах +function IsSolution: boolean; +begin + Result:=True; + var i:=1; + for var y:=1 to n do + for var x:=1 to n do + begin + if p[y,x].Number<>i then + begin + Result:=False; + break; + end; + i += 1; + if i=n*n then i:=0; + end; +end; + +procedure MouseDown(x,y,mb: integer); +begin + if EndOfGame then // Если все фишки на своих местах, то не реагировать на мышь и ждать нажатия кнопки "Перемешать" + exit; + if ObjectUnderPoint(x,y)=nil then // Eсли мы щелкнули не на объекте, то не реагировать на мышь + exit; + var fx := (x-x0) div (sz+zz) + 1; // Вычислить координаты на доске для ячейки, на которой мы щелкнули мышью + var fy := (y-y0) div (sz+zz) + 1; + if (fx>n) or (fy>n) then + exit; + if Neighbours(fx,fy,EmptyCellX,EmptyCellY) then // Если ячейка соседствует с пустой, то поменять их местами + begin + Swap(p[EmptyCellY,EmptyCellX],p[fy,fx]); + EmptyCellX := fx; + EmptyCellY := fy; + Inc(MovesCount); + StatusRect.Text := 'Количество ходов: ' + MovesCount; + if IsSolution then + begin + StatusRect.Text := 'Победа! Сделано ходов: ' + MovesCount; + StatusRect.Color := RGB(255,200,200); + EndOfGame := True; + end + end; +end; + +begin + SetSmoothingOff; + Window.Title := 'Игра в 15'; + Window.IsFixedSize := True; + SetWindowSize(2*x0+(sz+zz)*n-zz,2*y0+(sz+zz)*n-zz+90); + + EndOfGame := False; + Create15; + + MeshButton := ButtonABC.Create((WindowWidth-200) div 2,2*y0+(sz+zz)*n-zz,200,'Перемешать',clLightGray); + MeshButton.OnClick := Mix15; + StatusRect := new RectangleABC(0,WindowHeight-40,WindowWidth,40,RGB(200,200,255)); + StatusRect.TextVisible := True; + StatusRect.Text := 'Количество ходов: '+IntToStr(MovesCount); + StatusRect.BorderWidth := 2; + StatusRect.BorderColor := RGB(80,80,255); + + MovesCount := 0; + + OnMouseDown := MouseDown; +end. diff --git a/Games/Animals/Animals.pas b/Games/Animals/Animals.pas new file mode 100644 index 0000000..2851efb --- /dev/null +++ b/Games/Animals/Animals.pas @@ -0,0 +1,98 @@ +// Самообучающаяся игра "Угадай животное". +// Старайтесь на вопрос "Чем отличается" вводить самый общий ответ +// Например: "Чем отличается чиж от ежа" - "Умеет летать" +type + TNode = class + s: string; + left,right: TNode; + constructor(s: string); + begin + Self.s := s; + left := nil; + right := nil; + end; + end; + +var f: text; + +/// Сохранить дерево в файл +procedure SaveToFile(p: TNode); +begin + if p=nil then + begin + writeln(f,''); + exit + end; + writeln(f,p.s); + SaveToFile(p.left); + SaveToFile(p.right); +end; + +/// Загрузить дерево из файла +function LoadFromFile: TNode; +var + s: string; +begin + readln(f,s); + if s='' then + begin + Result := nil; + exit + end; + var p := new TNode(s); + p.left := LoadFromFile; + p.right := LoadFromFile; + Result := p; +end; + +var + p,p1,p2,root: TNode; + x: integer; + s,q: string; + +begin + writeln('Загадайте животное'); + assign(f, 'animals_data.txt'); + if not FileExists('animals_data.txt') then + root := new TNode('Собака') + else + begin + reset(f); + root := loadfromfile; + close(f); + end; + + p := root; + while p.left<>nil do + begin + Print(p.s+'? (0 - Нет, 1 - Да):'); + readln(x); + if x=1 then + p := p.left + else + p := p.right + end; + + write('Это '+p.s+'? (0 - Нет, 1 - Да): '); + readln(x); + if x=1 then + writeln('Я угадала!') + else + begin + write('Я проиграла. Что это за животное? '); + readln(s); + write('Введите вопрос, отличающий это животное от '+p.s+': '); + readln(q); + p1 := new TNode(s); + p2 := new TNode(p.s); + p.s := q; + p.left := p1; + p.right := p2; + end; + + + + Rewrite(f); + SaveToFile(root); + Close(f); +end. diff --git a/Games/Animals/Animals1.pas b/Games/Animals/Animals1.pas new file mode 100644 index 0000000..6da87fb --- /dev/null +++ b/Games/Animals/Animals1.pas @@ -0,0 +1,66 @@ +// Самообучающаяся игра "Угадай животное". +// Старайтесь на вопрос "Чем отличается" вводить самый общий ответ +// Например: "Чем отличается чиж от ежа" - "Умеет летать" + +uses System.Runtime.Serialization.Formatters.Binary; +uses System.IO; +uses System; + +type + [Serializable] + Node = class + public + s: string; + left,right: Node; + constructor(s: string); + begin + Self.s := s; + left := nil; + right := nil; + end; + end; + +const FileName = 'animals.dat'; + +begin + var formatter := new BinaryFormatter; + var root: Node; + + Println('Загадайте животное'); + if not FileExists(FileName) then + root := new Node('Собака') + else + begin + var fs := new FileStream(FileName, FileMode.OpenOrCreate); + root := Node(formatter.Deserialize(fs)); + fs.Close; + end; + + var p := root; + while p.left<>nil do + begin + var x := ReadlnInteger(p.s+'? (0 - Нет, 1 - Да):'); + if x=1 then + p := p.left + else + p := p.right + end; + + var x := ReadlnInteger('Это '+p.s+'? (0 - Нет, 1 - Да): '); + if x=1 then + Println('Я угадала!') + else + begin + var s := ReadlnString('Я проиграла. Что это за животное?'); + var q := ReadlnString('Введите вопрос, отличающий это животное от '+p.s+':'); + var p1 := new Node(s); + var p2 := new Node(p.s); + p.s := q; + p.left := p1; + p.right := p2; + end; + + var fs := new FileStream(FileName, FileMode.OpenOrCreate); + formatter.Serialize(fs, root); + fs.Close; +end. diff --git a/Games/Animals/animals.dat b/Games/Animals/animals.dat new file mode 100644 index 0000000..d812b7e Binary files /dev/null and b/Games/Animals/animals.dat differ diff --git a/Games/Animals/animals_data.txt b/Games/Animals/animals_data.txt new file mode 100644 index 0000000..f7ff8b7 --- /dev/null +++ b/Games/Animals/animals_data.txt @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Games/Battle.pas b/Games/Battle.pas new file mode 100644 index 0000000..27d6fc8 --- /dev/null +++ b/Games/Battle.pas @@ -0,0 +1,318 @@ +uses GraphABC; + +const types = 3; //число типов рыб минус 1 + rmax = 4; //радиус всех рыб + CanEat = rmax; //максимальное расстояние при поедании + eps = 0.00001; //необходимо при операциях с данными real + epsustupi = 0.1; //насколько значима иерархия среди хищников + strahkraj = 3; //во сколько раз жертвы боятся края меньше, чем хищников + ustupi = CanEat*10; //насколько значима иерархия среди хищников + BkColor = clBlack; //Фон + Height = 600; //Высота графического окна + Width = 780; //Ширина графического окна + xmin = 10; // + ymin = 10; //Минимальные и максимальные значения координат, + xmax = Width - 100; //которые могут принимать рыбы + ymax = Height - 140; // + +Type +fishtype = class //Описание одной стаи + c : color; + public + CanRazm, MaxKol, Kol, MaxLife, MinFood: integer; + //цвет, размножение, макс. кол-во, текущее кол-во, макс. жизнь, + //сколько хищнику нужно есть для размножения + Speed, See: real; //Нормальная скорость и зрение в пикселях + constructor create(ac:color; aCanRazm, aMaxKol, aMaxLife, aMinFood:integer; aSpeed, aSee: real); + begin + c:= ac; CanRazm:= aCanRazm; MaxKol:= aMaxKol; Kol:= 1; + MaxLife:= aMaxLife; MinFood:= aMinFood; Speed:= aSpeed; See:= aSee + end; + procedure ShowKol(y: integer); //отобразить текущее кол-во + var s: string; + begin + SetFontColor(c); + TextOut(xmax + 20, y, ' '); + s := IntToStr(kol); + TextOut(xmax + 20, y, s); + end; + end; + +var opisanie: array[0..types] of fishtype; //данные для всех стай + +Type +fish = class + x, y, r, dx0, dy0: real; //текущие координаты, радиус и предыдущий шаг + tip, life, razm, status, food: integer; + //razm - время с момента последнего размножения, + //status - состояние - спокойное или возбуждённое + next, prev: fish; //двусвязный циклический список + constructor Create(ax, ay, ar: real; atip: integer; aprev, anext: fish); + begin + x:= ax; y:= ay; r:= ar; tip:= atip; prev:= aprev; next:= anext; + life:= 0; razm:= 0; dx0:= random; dy0:= random; status:= 1; food:= 0; + end; + procedure show; + begin + SetPenColor(opisanie[tip].c); + circle(round(x), round(y), round(r)) + end; + procedure hide; + begin + SetPenColor(BkColor); + circle(round(x), round(y), round(r)) + end; + procedure Destroy; + begin + hide; + opisanie[tip].kol:= opisanie[tip].kol - 1; + opisanie[tip].ShowKol(tip*40 + 20); + end; + procedure moveto(dx, dy: real); + begin + hide; + x:= x + dx; y:= y + dy; + if x > xmax then x:= xmax; + if x < xmin then x:= xmin; + if y > ymax then y:= ymax; + if y < ymin then y:= ymin; + show + end; + + procedure MakeDeti(var mama, StartAkula, KonAkula, StartKilka, KonKilka : fish); + //произвести потомство + var d: fish; + begin + razm:= 0; + food:= 0; + d:= fish.create(x, y, r, tip, mama, next); + next.prev:= d; + next:= d; + if mama = KonAkula then KonAkula:= d; + if mama = KonKilka then KonKilka:= d; + opisanie[tip].kol:= opisanie[tip].kol + 1; + opisanie[tip].ShowKol(tip*40 + 20); + end; + + procedure step(var ribka, StartAkula, KonAkula, StartKilka, KonKilka : fish); + //Здесь алгоритмы для рыб + var + dx, dy, d, dx2, dy2, dmin: real; + t, trup, found: fish; + FoundOhot: boolean; + begin + status:= 1; //Нормальное состояние + dx:= 0; dy:= 0; + if tip > 0 then + begin //Начало алгоритма для жертв + t:= StartAkula; + if t<>nil then + repeat //Ищем всех хищников в поле видимости + d:= sqrt((x - t.x)*(x - t.x) + (y - t.y)*(y - t.y)); + if d < opisanie[tip].See then + begin + if d < eps then d:= eps; + dx2:= (x - t.x)/(d*d); + dy2:= (y - t.y)/(d*d); + dx:= dx + dx2; + dy:= dy + dy2; + status:= 2; //Возбуждённое состояние + end; + t:= t.next + until t = KonAkula.next; + //И обратим внимание на края: + if x - xmin < opisanie[tip].See then dx:= dx + 1/((x - xmin + eps)*strahkraj); + if xmax - x < opisanie[tip].See then dx:= dx + 1/((x - xmax - eps)*strahkraj); + if y - ymin < opisanie[tip].See then dy:= dy + 1/((y - ymin + eps)*strahkraj); + if ymax - y < opisanie[tip].See then dy:= dy + 1/((y - ymax - eps)*strahkraj); + d:= sqrt(dx*dx + dy*dy); + if d < eps then + begin + dx:= 2*status*random()*opisanie[tip].Speed - status*opisanie[tip].Speed; + dy:= 2*status*random()*opisanie[tip].Speed - status*opisanie[tip].Speed + end + else + begin + dx:= status*opisanie[tip].Speed*dx/d; + dy:= status*opisanie[tip].Speed*dy/d + end + end + else {tip = 0} + begin //Начало алгоритма для хищников + dmin:= 11000; + t:= StartAkula; + while t<>ribka do //Проверяем всех выше по иерархии + begin + + d:= sqrt((x - t.x)*(x - t.x) + (y - t.y)*(y - t.y)); + if (d < dmin) and (abs(dx0 - t.dx0) < epsustupi) and + (abs(dy0 - t.dy0) < epsustupi) then dmin:= d; + + t:= t.next + end; + FoundOhot:= dmin < ustupi; + dmin:= 11000; + found:= nil; + t:= StartKilka; + if (t<>nil) and (life > 100) and not FoundOhot then + repeat + + d:= sqrt((x - t.x)*(x - t.x) + (y - t.y)*(y - t.y)); + if d < dmin then + begin + dmin:= d; + found:= t //found - ближайшая жертва + end; + t:= t.next + until t = KonKilka.next; + if (found <> nil) and (dmin < opisanie[tip].See) then + begin + status:= 2; //Возбуждённое состояние + dx:= found.x - x; + dy:= found.y - y; + if dmin < CanEat + status*opisanie[tip].Speed then + begin //Поедание + found.next.prev:= found.prev; + found.prev.next:= found.next; + if (found = StartKilka) and (found = KonKilka) then + begin + //StartKilka:= nil; + //KonKilka:= nil + end; + if found = StartKilka then + StartKilka:= StartKilka.next; + if found = KonKilka then + KonKilka:= KonKilka.prev; + found.destroy; + found := nil; + food:= food + 1 + end + end + else + if (x <= xmin) or (x >= xmax) or (y <= ymin) or (y >= ymax) then + begin + dx:= 2*status*random()*opisanie[tip].Speed - status*opisanie[tip].Speed; + dy:= 2*status*random()*opisanie[tip].Speed - status*opisanie[tip].Speed + end + else + begin + dx:= dx0; dy:= dy0 //Повтор предыдущего шага - патрулирование + end; + d:= sqrt(dx*dx + dy*dy); + if d > eps then + begin + dx:= status*opisanie[tip].Speed*dx/d; + dy:= status*opisanie[tip].Speed*dy/d; + end + end; + //Начало алгоритма для всех рыб + moveto(dx, dy); + dx0:= dx; dy0:= dy; + life:= life + 1; razm:= razm + 1; + if opisanie[tip].Kol >= opisanie[tip].MaxKol then Razm:= 0; + if (razm > opisanie[tip].CanRazm) and (food >= opisanie[tip].minfood) then + MakeDeti(ribka, StartAkula, KonAkula, StartKilka, KonKilka); + if life > opisanie[tip].MaxLife then //Смерть от старости + begin + trup:= ribka; ribka:= ribka.prev; + trup.next.prev:= trup.prev; + trup.prev.next:= trup.next; + if trup = StartKilka then + StartKilka:= StartKilka.next; + if trup = KonKilka then + KonKilka:= KonKilka.prev; + if trup = StartAkula then + StartAkula:= StartAkula.next; + if trup = KonAkula then + KonAkula:= KonAkula.prev; + if trup = trup.next then ribka:= nil; + if trup <> nil then + trup.destroy; + trup := nil; + end + end; + + end; + +function getAllCount:integer; +var i,c:integer; +begin + c:=0; + for i:=0 to types do + c:=c+opisanie[i].Kol; + getAllCount:=c; +end; + +var i: integer; + p, q, StartAkula, StartKilka, KonAkula, KonKilka, tek: fish; + +begin + SetSmoothing(False); + SetWindowSize(Width, Height); + SetWindowLeft(200); + SetWindowTop(50); + SetWindowCaption('Битва за жизнь'); + SetFontSize(7); + SetFontName('Arial'); + SetBrushColor(BkColor); + FillRectangle(0, 0, Width, Height); + SetFontColor(clWhite); + TextOut(10, ymax + 20, 'Автор программы - Иванов С.О. e-mail: ssyy@yandex.ru'); + TextOut(10, ymax + 20+1*18, 'Программа моделирует поведение нескольких стай рыб. Справа - количества рыб в текущий'); + TextOut(10, ymax + 20+2*18, 'момент времени. Изменяя параметры в коде программы, можно влиять на ход битвы.'); + TextOut(10, ymax + 20+3*18, 'По умолчанию: красные - хищники, поедают любых рыб из других стай, не плодятся,'); + TextOut(10, ymax + 20+4*18, 'пока не поели; синие - жертвы, самые медленные, но быстрее всех плодятся; зелёные - жертвы,'); + TextOut(10, ymax + 20+5*18, 'быстрее синих, но плодятся медленнее; желтые - самые быстрые среди жертв, но желтых мало.'); + SetFontSize(12); + StartAkula:= nil; + StartKilka:= nil; + KonAkula:= nil; + KonKilka:= nil; + + //c - цвет. + //CanRazm - минимальное количество ходов отдельно взятой рыбы между двумя + // её последовательными размножениями. + //MaxKol - максимально допустимое количество рыб данного вида. + //Kol - количество рыб данного вида в текущий момент времени. + //MaxLife - максимальная продолжительность жизни. + // После того, как рыба сделает больше шагов, чем это число, она умирает. + //MinFood - минимальное количество съеденных жертв, необходимое для размножения + // (только для хищников; для жертв это количество принято за -1). + //Speed - нормальная скорость. Максимальная скорость рыбы в 2 раза больше этого числа. + //See - радиус обзора - как далеко видит рыба. + + //c, CanRazm, MaxKol, MaxLife, MinFood, Speed, See + opisanie[3]:= fishtype.create(clYellow, 300, 15, 1500, -1, 0.99, 50); + opisanie[2]:= fishtype.create(clGreen, 150, 50, 1500, -1, 0.9, 50); + opisanie[1]:= fishtype.create(clBlue, 30, 50, 500, -1, 0.7, 35); + opisanie[0]:= fishtype.create(clRed, 1000, 40, 5000, 1, 1, 500); + SetPenColor(clWhite); + rectangle(round(xmin - rmax - 1), round(ymin - rmax - 1), + round(xmax + rmax + 1), round(ymax + rmax + 1)); + //Теперь нужно построить первоначальный список + q:= fish.create(xmin + 10, ymax - 10, rmax, 0, nil, nil); + p:= fish.create(xmin + 10, ymin + 10, rmax, 1, q, q); + q.next:= p; q.prev:= p; + StartAkula:= q; KonAkula:= q; + StartKilka:= p; KonKilka:= p; + p:= fish.create(xmax - 10, ymin + 10, rmax, 2, KonKilka, StartAkula); + StartAkula.prev:= p; + KonKilka.next:= p; KonKilka:= p; + p:= fish.create(xmax - 10, ymax - 10, rmax, 3, KonKilka, StartAkula); + StartAkula.prev:= p; + KonKilka.next:= p; KonKilka:= p; + for i:= 0 to types do opisanie[i].ShowKol(i*40 + 20); + //И все ходят по очереди, пока хоть кто-то жив. + tek:= StartKilka; + //i:=0;c:=getallcount;LockDrawing; + repeat + tek:= tek.next; + tek.step(tek, StartAkula, KonAkula, StartKilka, KonKilka); + {i:=i+1; + if i>=c then begin + i:=0;c:=getallcount; + Redraw; + end;} + until (tek = nil); + +end. diff --git a/Games/BookWorm/BookWormABCNET.pas b/Games/BookWorm/BookWormABCNET.pas new file mode 100644 index 0000000..287a368 --- /dev/null +++ b/Games/BookWorm/BookWormABCNET.pas @@ -0,0 +1,228 @@ +uses GraphABC,ABCObjects,ABCButtons; + +const +/// Примерная частота повторяемости букв + freqcharstr='аааааааааааааааааааааааааабббббввввввввггггдддддддееееееееееееееееееееежжззззииииииииииииииииииийккккккккккккккклллллллллллммммммнннннннннннннннннооооооооооооооооооооооооппппппппрррррррррррррррррссссссссссссстттттттттттттттууууууффххцццчччшшщыыьььььэюяяяя'; + +const + MaxWordLen = 12; + scorehits: array [1..MaxWordLen] of integer = (0,1,2,4,7,11,16,22,29,37,46,56); + +type + MySquareABC = class(SquareABC) end; + +var +/// Доска с буквами + MainBoard: ObjectBoardABC; +/// Доска высоты 1 для размещения слова + WordBoard: ObjectBoardABC; +/// Номер первого незанятого символа на доске WordBoard + cur: integer; +/// Количество ходов + moves: integer; +/// Очки + score: integer; +/// Прямоугольник для отображения информации + Status: RectangleABC; + +/// Существует ли такое слово (все слова хранятся в файле words.txt) +function WordExists(s: string): boolean; +var + f: text; + str: string; +begin + s := LowerCase(s); + Result := False; + assign(f,'words.txt'); + reset(f); + while not eof(f) do + begin + readln(f,str); + if s=str then + begin + Result := True; + break; + end; + end; + close(f); +end; + +procedure MyMouseDown(x,y,mb: integer); +begin +// Нажата левая мышь + if mb=1 then + begin + if cur>WordBoard.DimX then + exit; + var ob := ObjectUnderPoint(x,y); + if (ob is MySquareABC) and ob.Visible then + begin + var ob1 := WordBoard[cur,1]; + ob1.Visible := True; + ob1.Text := ob.Text; + Inc(cur); + ob.Visible := False; + var s := ''; + for var i:=1 to cur-1 do + s := s + WordBoard[i,1].Text; + if WordExists(s) then + WordBoard.Color := clYellow + else WordBoard.Color := clSkyBlue + end; + end + else +// Нажата правая мышь + begin + for var xx:=1 to cur-1 do + WordBoard[xx,1].Visible := False; + for var xx:=1 to MainBoard.DimX do + for var yy:=1 to MainBoard.DimY do + MainBoard[xx,yy].Visible:=True; + cur := 1; + WordBoard.Color := clSkyBlue + end; +end; + +/// Обработчик кнопки "Новая игра" +procedure BtNewClick; +begin + score := 0; + moves := 0; + Status.Text := 'Ходов: '+IntToStr(moves)+' Очков: '+IntToStr(score); + MyMouseDown(1,1,2); + for var xx:=1 to MainBoard.DimX do + for var yy:=1 to MainBoard.DimY do + MainBoard[xx,yy].Text := UpCase(freqcharstr[Random(255)+1]); +end; + +/// Обработчик кнопки "Сказать слово" +procedure BtWordClick; +begin + if WordBoard.Color<>clYellow then + exit; + Inc(score,scorehits[cur-1]); + Inc(moves); + for var xx:=1 to cur-1 do + WordBoard[xx,1].Visible:=False; + for var xx:=1 to MainBoard.DimX do + for var yy:=1 to MainBoard.DimY do + if not MainBoard[xx,yy].Visible then + begin + MainBoard[xx,yy].Visible:=True; + MainBoard[xx,yy].Text:=UpCase(freqcharstr[Random(255)+1]); + end; + cur := 1; + WordBoard.Color := clSkyBlue; + Status.Text := 'Ходов: '+IntToStr(moves)+' Очков: '+IntToStr(score); +end; + +/// Обработчик кнопки "Подсказка" +procedure BtPleaseClick; +var + f: text; + str,maxstr: string; + arr,work: array ['а'..'я'] of integer; + maxlen: integer; + + function CanConstructWord(s: string): boolean; + begin + work := arr; + Result := True; + for var i:=1 to Length(s) do + begin + Dec(work[s[i]]); + if work[s[i]]<0 then + begin + Result := False; + break; + end; + end; + end; + +begin // BtPleaseClick + maxlen := 0; + maxstr := ''; + for var c:='а' to 'я' do + arr[c]:=0; + + for var xx:=1 to MainBoard.DimX do + for var yy:=1 to MainBoard.DimY do + Inc(arr[LowCase(MainBoard[xx,yy].Text[1])]); + + assign(f,'words.txt'); + reset(f); + while not eof(f) do + begin + readln(f,str); + if CanConstructWord(str) and (Length(str)>maxlen) and (Length(str)<=MaxWordLen) then + begin + maxlen := Length(str); + maxstr := str; + end; + end; + close(f); + + writeln(maxstr); +end; + +procedure InitWindow; +begin + SetWindowSize(640,480); + Window.IsFixedSize := True; + Window.Title := 'Знай русские слова!'; + Brush.Color := clMoneyGreen; + FillRect(0,0,WindowWidth,WindowHeight); +end; + +procedure InitGameVars; +begin + cur := 1; + moves := 0; + score := 0; +end; + +procedure InitButtons; +begin + var btword := new ButtonABC(70,410,180,30,'Сказать слово',clGray); + var btnew := new ButtonABC(280,410,100,30,'Заново',clLightGray); + var btplease := new ButtonABC(410,410,160,30,'Подсказка',clGray); + +// Привязка обработчиков к кнопкам + btword.OnClick := BtWordClick; + btnew.OnClick := BtNewClick; + btplease.OnClick := BtPleaseClick; +end; + + +procedure InitInterface; +begin + Status := new RectangleABC(70,350,500,30,clSkyBlue); + Status.Text := 'Ходов: 0 Очков: 0'; + WordBoard := new ObjectBoardABC(20,40,MaxWordLen,1,50,50,clSkyBlue); + MainBoard := new ObjectBoardABC(220,120,4,4,50,50,clMoneyGreen); + MainBoard.BorderColor := clGreen; + //MainBoard.Bordered := False; + + for var x:=1 to WordBoard.DimX do + begin + WordBoard[x,1] := new SquareABC(0,0,WordBoard.CellSizeX-6,clWhite); + WordBoard[x,1].Visible := False; + end; + for var x:=1 to MainBoard.DimX do + for var y:=1 to MainBoard.DimY do + begin + MainBoard[x,y] := new MySquareABC(0,0,MainBoard.CellSizeX-6,clWhite); + MainBoard[x,y].Text := UpCase(freqcharstr[Random(freqcharstr.Length)+1]); + end; +end; + +begin + SetConsoleIO; + + InitWindow; + InitGameVars; + InitInterface; + InitButtons; + + OnMouseDown := MyMouseDown; +end. \ No newline at end of file diff --git a/Games/BookWorm/words.txt b/Games/BookWorm/words.txt new file mode 100644 index 0000000..1f8de26 --- /dev/null +++ b/Games/BookWorm/words.txt @@ -0,0 +1,14842 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Games/DeleteByMouse.pas b/Games/DeleteByMouse.pas new file mode 100644 index 0000000..bcbf463 --- /dev/null +++ b/Games/DeleteByMouse.pas @@ -0,0 +1,56 @@ +uses WPFObjects; + +const CountSquares = 20; + +var + /// Текущая цифра + CurrentDigit: integer; + /// Количество ошибок + Mistakes: integer; + /// Строка информации + StatusRect: RectangleWPF; + +/// Вывод информационной строки +procedure DrawStatusText; +begin + if CurrentDigit<=CountSquares then + StatusRect.Text := $'Удалено квадратов: {CurrentDigit-1} Ошибок: {Mistakes}' + else StatusRect.Text := $'Игра окончена. Время: {Milliseconds div 1000} с. Ошибок: {Mistakes}'; +end; + +/// Обработчик события мыши +procedure MyMouseDown(x,y: real; mb: integer); +begin + var ob := ObjectUnderPoint(x,y); + if (ob<>nil) and (ob is RectangleWPF) and (ob<>StatusRect) then + if ob.Number=CurrentDigit then + begin + ob.Destroy; + Inc(CurrentDigit); + DrawStatusText; + end + else + begin + ob.Color := Colors.Red; + Inc(Mistakes); + DrawStatusText; + end; +end; + +begin + Window.Title := 'Игра: удали все квадраты по порядку'; + for var i:=1 to CountSquares do + begin + var x := Random(Window.Width-50); + var y := Random(Window.Height-100); + var ob := RectangleWPF.Create(x,y,50,50,Colors.LightGreen,1); + ob.FontSize := 25; + ob.Number := i; + end; + StatusRect := RectangleWPF.Create(0,Window.Height-40,Window.Width,40,Colors.LightBlue); + CurrentDigit := 1; + Mistakes := 0; + DrawStatusText; + // Установка обработчиков + OnMouseDown := MyMouseDown; +end. \ No newline at end of file diff --git a/Games/KillThem.pas b/Games/KillThem.pas new file mode 100644 index 0000000..29ce53a --- /dev/null +++ b/Games/KillThem.pas @@ -0,0 +1,238 @@ +uses ABCObjects,GraphABC,Timers; + +const + clPlayer = Color.BurlyWood; + +var + kLeftKey,kRightKey: boolean; + kSpaceKey: integer; + /// Игрок + Player: RectangleABC; + /// Таймер движения врагов + t: Timer; + /// Флаг конца игры + EndOfGame: boolean; + /// Количество неигровых объектов + StaticObjectsCount: integer; + /// Счетчик выигрышей + Wins: integer; + /// Счетчик проигрышей + Falls: integer; + /// Информационная строка + InfoString: RectangleABC; + /// Сообщение в начале игры + NewGame: RoundRectABC; + +type + KeysType = (kLeft,kRight); + + /// Класс пули + Pulya = class(CircleABC) + public + constructor Create(x,y: integer); + procedure Move; override; + end; + + /// Класс врага + Enemy = class(RectangleABC) + public + constructor Create(x,y,w: integer); + procedure Move; override; + end; + +constructor Pulya.Create(x,y: integer); +begin + inherited Create(x,y,5,clRed); + dx := 0; + dy := -5; +end; + +procedure Pulya.Move; +begin + inherited Move; + if Top<0 then + Visible := False; + for var j:=StaticObjectsCount to Objects.Count-1 do + // При столкновении пуля и объект становятся невидимыми + if (Objects[j]<>Self) and Intersect(Objects[j]) then + begin + Objects[j].Visible := False; + Visible := False; + end; +end; + +constructor Enemy.Create(x,y,w: integer); +begin + inherited Create(x,y,w,20,clRandom); + if Random(2)=0 then + dx := 5 + else dx := -5; + dy := 0; +end; + +procedure Enemy.Move; +begin + if Random(2)<>0 then + Exit; + if Random(10)=0 then + dy := 5; + if (Left<0) or (Left+Width>Window.Width) or (Random(30)=0) then + dx := -dx; + inherited Move; + if dy<>0 then + dy := 0; + if Top>Window.Height-50 then + EndOfGame := True; +end; + +/// Количество врагов +function NumberOfEnemies: integer; +begin + Result := 0; + for var i:=0 to Objects.Count-1 do + if Objects[i] is Enemy then + Result += 1; +end; + +/// Создание игрока и врагов +procedure CreateObjects; +begin + Player := new RectangleABC(280,WindowHeight-30,100,20,clPlayer); + for var i:=1 to 100 do + begin + var r1 := new Enemy(Random(WindowWidth-50),40+Random(10),50); + r1.TextVisible := True; + r1.Number := i; + end; +end; + +/// Разрушение игрока и врагов +procedure DestroyObjects; +begin + for var i:=Objects.Count-1 downto StaticObjectsCount do + Objects[i].Destroy; +end; + +/// Перемещение врагов +procedure MoveObjects; +begin + for var i:=StaticObjectsCount+1 to Objects.Count-1 do + Objects[i].Move; +end; + +/// Удаление уничтоженных объектов +procedure DestroyKilledObjects; +begin + for var i:=ObjectsCount-1 downto StaticObjectsCount+1 do + if not Objects[i].Visible then + Objects[i].Destroy; +end; + +/// Обработчик нажатия клавиши +procedure KeyDown(Key: integer); +begin + case Key of +vk_Left: kLeftKey := True; +vk_Right: kRightKey := True; +vk_Space: if kSpaceKey=2 then kSpaceKey := 1; + end; +end; + +/// Обработчик отжатия клавиши +procedure KeyUp(Key: integer); +begin + case Key of +vk_Left: kLeftKey := False; +vk_Right: kRightKey := False; +vk_Space: kSpaceKey := 2; + end; +end; + +/// Изменение информационной строки +procedure ChangeInfoString; +begin + InfoString.Text := 'Врагов: '+IntToStr(NumberOfEnemies)+' Побед: '+IntToStr(Wins)+' Поражений: '+IntToStr(Falls); +end; + +/// Обработчик нажатия символьной клавиши +procedure KeyPress(Key: char); +begin + if (Key in ['G','П','g','п']) and EndOfGame then + begin + NewGame.Visible := False; + EndOfGame := False; + t.Start; + CreateObjects; + kSpaceKey := 2; + kLeftKey := False; + kRightKey := False; + end; +end; + +/// Обработчик отжатия мыши +procedure MouseUp(x,y,mb: integer); +begin + if NewGame.PTInside(x,y) then + KeyPress('G'); +end; + +/// Обработчик таймера +procedure TimerProc; +begin + if kLeftKey and (Player.Left>0) then + Player.MoveOn(-10,0); + if kRightKey and (Player.Left+Player.Width0 then + Falls += 1 + else Wins += 1; + NewGame.Visible := True; + DestroyObjects; + ChangeInfoString; + RedrawObjects; + end; +end; + +begin + Window.Title := 'Стрелялка'; + Window.IsFixedSize := True; + ClearWindow(clBlack); + LockDrawingObjects; + EndOfGame := True; + InfoString := new RectangleABC(0,0,Window.Width,38,Color.DarkBlue); + InfoString.Bordered := False; + InfoString.FontColor := clWhite; + InfoString.TextScale := 0.9; + + var zz := 100; + NewGame := new RoundRectABC(zz,200,400,200,30,Color.Violet); + NewGame.Center := Window.Center; + NewGame.Text := 'G - Новая игра'; + StaticObjectsCount := Objects.Count; + ChangeInfoString; + RedrawObjects; + + OnKeyDown := KeyDown; + OnKeyPress := KeyPress; + OnKeyUp := KeyUp; + OnMouseUp := MouseUp; + + t := new Timer(1,TimerProc); +end. diff --git a/Games/Life.pas b/Games/Life.pas new file mode 100644 index 0000000..8c0af51 --- /dev/null +++ b/Games/Life.pas @@ -0,0 +1,318 @@ +// Игра "Жизнь" на торе +// Оптимизация хешированием по равномерной сетке +uses GraphABC; + +const +/// Ширина клетки + w = 4; +/// Количество клеток по ширине + m = 300; +/// Количество клеток по высоте + n = 220; +/// Отступ поля от левой границы окна + x0 = 1; +/// Отступ поля от верхней границы окна + y0 = 21; + mm = m + 1; + nn = n + 1; +/// Количество клеток сетки по горизонтали + mk = 15; +/// Количество клеток сетки по вертикали + nk = 10; + +var + a,b,sosedia,sosedib: array [0..nn,0..mm] of byte; + obnovA,obnovB: array [1..nk,1..mk] of boolean; + CountCells: integer; + obn: boolean; + gen: integer; + hn,hm: integer; + +/// Нарисовать ячейку +procedure DrawCell(i,j: integer); +begin + DrawInBuffer := False; + SetBrushColor(clBlack); + FillRectangle(x0+(j-1)*w,y0+(i-1)*w,x0+j*w-1,y0+i*w-1); + DrawInBuffer := True; +end; + +/// Стереть ячейку +procedure ClearCell(i,j: integer); +begin + DrawInBuffer := False; + SetBrushColor(clWhite); + FillRectangle(x0+(j-1)*w,y0+(i-1)*w,x0+j*w-1,y0+i*w-1); + DrawInBuffer := True; +end; + +/// Нарисовать все изменившиеся ячейки +procedure DrawConfiguration; +begin + for var i:=1 to n do + for var j:=1 to m do + begin + var bb := b[i,j]; + if a[i,j]<>bb then + if bb=1 then DrawCell(i,j) + else ClearCell(i,j); + end; +end; + +/// Нарисовать все ячейки +procedure DrawConfigurationFull; +begin + for var i:=1 to n do + for var j:=1 to m do + if b[i,j]=1 then DrawCell(i,j) + else ClearCell(i,j); +end; + +/// Нарисовать поле +procedure DrawField; +begin + Pen.Color := clLightGray; + for var i:=0 to m do + begin + if i mod hm = 0 then + Pen.Color := clGray + else Pen.Color := clLightGray; + Line(x0+i*w-1,y0,x0+i*w-1,y0+n*w); + end; + for var i:=0 to n do + begin + if i mod hn = 0 then + Pen.Color := clGray + else Pen.Color := clLightGray; + Line(x0,y0+i*w-1,x0+m*w,y0+i*w-1); + end; +end; + +/// Увеличить массив соседей для данной клетки +procedure IncSosedi(i,j: integer); +var i1,i2,j1,j2: integer; +begin + if i=1 then i1:=n else i1:=i-1; + if i=n then i2:=1 else i2:=i+1; + if j=1 then j1:=m else j1:=j-1; + if j=m then j2:=1 else j2:=j+1; + SosediB[i1,j1] += 1; + SosediB[i1,j] += 1; + SosediB[i1,j2] += 1; + SosediB[i,j1] += 1; + SosediB[i,j2] += 1; + SosediB[i2,j1] += 1; + SosediB[i2,j] += 1; + SosediB[i2,j2] += 1; +end; + +/// Уменьшить массив соседей для данной клетки +procedure DecSosedi(i,j: integer); +var i1,i2,j1,j2: integer; +begin + if i=1 then i1:=n else i1:=i-1; + if i=n then i2:=1 else i2:=i+1; + if j=1 then j1:=m else j1:=j-1; + if j=m then j2:=1 else j2:=j+1; + SosediB[i1,j1] -= 1; + SosediB[i1,j] -= 1; + SosediB[i1,j2] -= 1; + SosediB[i,j1] -= 1; + SosediB[i,j2] -= 1; + SosediB[i2,j1] -= 1; + SosediB[i2,j] -= 1; + SosediB[i2,j2] -= 1; +end; + +/// Поставить ячейку в клетку (i,j) +procedure SetCell(i,j: integer); +begin + if b[i,j]=0 then + begin + b[i,j] := 1; + obn := True; + IncSosedi(i,j); + end; + CountCells += 1; +end; + +/// Убрать ячейку из клетки (i,j) +procedure UnSetCell(i,j: integer); +begin + if b[i,j]=1 then + begin + b[i,j] := 0; + obn := True; + DecSosedi(i,j); + end; + CountCells -= 1; +end; + +/// Инициализировать массивы и конфигурацию поля +procedure Init; +var + xc := n div 2; + yc := m div 2; +begin + for var i:=0 to n+1 do + for var j:=0 to m+1 do + b[i,j] := 0; + a := b; + SosediB := b; + SosediA := SosediB; + for var ik:=1 to nk do + for var jk:=1 to mk do + obnovB[ik,jk] := True; + obnovA := obnovB; + CountCells := 0; + + SetCell(xc,yc); + SetCell(xc,yc+1); + SetCell(xc,yc+2); + SetCell(xc-1,yc+2); + SetCell(xc+1,yc+1); +end; + +/// Обработать ячейку +procedure ProcessCell(i,j: integer); +begin + case SosediA[i,j] of +0..1,4..9: + if b[i,j]=1 then + begin + b[i,j] := 0; + obn := True; + DecSosedi(i,j); + ClearCell(i,j); + Dec(CountCells); + end; +3: if b[i,j]=0 then + begin + b[i,j] := 1; + obn := True; + IncSosedi(i,j); + DrawCell(i,j); + Inc(CountCells); + end; + end; {case} +end; + +/// Перейти к следующему поколению +procedure NextGen; +begin + for var ik:=1 to nk do + begin + for var jk:=1 to mk do + begin + obn := False; + var ifirst := (ik-1)*hn+1; + var ilast := (ik-1)*hn+hn; + var jfirst := (jk-1)*hm+1; + var jlast := (jk-1)*hm+hm; + if obnovA[ik,jk] then + begin + for var i:=ifirst to ilast do + for var j:=jfirst to jlast do + ProcessCell(i,j); + end + else + begin + var ik1,jk1,ik2,jk2: integer; + if ik=1 then ik1:=nk else ik1:=ik-1; + if ik=nk then ik2:=1 else ik2:=ik+1; + if jk=1 then jk1:=mk else jk1:=jk-1; + if jk=mk then jk2:=1 else jk2:=jk+1; + var l := obnovA[ik,jk1]; + var r := obnovA[ik,jk2]; + var u := obnovA[ik1,jk]; + var d := obnovA[ik2,jk]; + var lu := obnovA[ik1,jk1]; + var ld := obnovA[ik2,jk1]; + var ru := obnovA[ik1,jk2]; + var rd := obnovA[ik2,jk2]; + if u then + for var j:=jfirst+1 to jlast-1 do + ProcessCell(ifirst,j); + if d then + for var j:=jfirst+1 to jlast-1 do + ProcessCell(ilast,j); + if l then + for var i:=ifirst+1 to ilast-1 do + ProcessCell(i,jfirst); + if r then + for var i:=ifirst+1 to ilast-1 do + ProcessCell(i,jlast); + if u or l or lu then + ProcessCell(ifirst,jfirst); + if u or r or ru then + ProcessCell(ifirst,jlast); + if d or l or ld then + ProcessCell(ilast,jfirst); + if d or r or rd then + ProcessCell(ilast,jlast); + end; + obnovB[ik,jk] := obn; + end; + end; +end; + +/// Перерисовка содержимого окна +procedure LifeRedrawProc; +begin + Redraw; + DrawConfigurationFull; +end; + +/// Вывод номера поколения и количества ячеек +procedure DrawInfo; +begin + Brush.Color := clWhite; + TextOut(25,0,'Поколение '+IntToStr(gen)); + TextOut(WindowWidth - 130,0,'Жителей: '+IntToStr(CountCells)+' '); +end; + +begin + SetConsoleIO; + if (m mod mk<>0) or (n mod nk<>0) then + begin + writeln('Размер кластера не согласован с размером поля. Программа завершена'); + exit + end; + hm := m div mk; + hn := n div nk; + SetWindowSize(x0+m*w,y0+n*w); + CenterWindow; + Window.Title := 'Игра "Жизнь"'; + Window.IsFixedSize := True; + Font.Name := 'Arial'; + Font.Size := 10; + Init; + + LockDrawing; + DrawInfo; + DrawField; + DrawConfiguration; + UnLockDrawing; + + var mil := Milliseconds; + gen := 0; + RedrawProc := LifeRedrawProc; + while True do + begin + gen += 1; + + if gen mod 11 = 0 then + DrawInfo; + + SosediA := SosediB; + obnovA := obnovB; + NextGen; + + if gen mod 1000 = 0 then + begin + var mil1 := Milliseconds; + writeln(gen,' ',(mil1-mil)/1000); + mil := mil1; + end; + end; +end. diff --git a/Games/Matches.pas b/Games/Matches.pas new file mode 100644 index 0000000..3ad8100 --- /dev/null +++ b/Games/Matches.pas @@ -0,0 +1,45 @@ +// Игра "Спички" +const InitialCount=15; + +var + /// Текущее количество спичек + Count: integer; + /// Количество спичек, которое берет игрок + Num: integer; + /// Номер текущего игрока + Player: integer; + +begin + Player := 1; + Count := InitialCount; + + repeat + if Player=1 then + begin + var Correct: boolean; + repeat + Write('Ваш ход. На столе ',Count,' спичек. '); + Write('Сколько спичек Вы берете? '); + Readln(Num); + Correct := (Num>=1) and (Num<=3) and (Num<=Count); + if not Correct then + writeln('Неверно! Повторите ввод!'); + until Correct; + end + else + begin + Num := Random(1,3); + if Num>Count then + Num := Count; + Writeln('Мой ход. Я взял ',Num,' спичек'); + end; + Count -= Num; + if Player=1 then + Player := 2 + else Player := 1; + until Count=0; + + if Player=1 then + Writeln('Вы победили!') + else Writeln('Вы проиграли!'); +end. diff --git a/Games/NewLife.pas b/Games/NewLife.pas new file mode 100644 index 0000000..e580795 --- /dev/null +++ b/Games/NewLife.pas @@ -0,0 +1,350 @@ +// Игра Жизнь на торе +// Оптимизация хешированием по равномерной сетке + +uses GraphABC; + +const + w =3; + w1=1; + k=20; + m=300; + n=220; + graphW=0; + mk=m div k;//15; + nk=n div k;//10; + mm=m+1; + nn=n+1; + x0=1; + y0=21; + ClearColor=clBlack; + FillColor=clLimeGreen; + +var + FiledColor := RGB(0,40,0); + FiledColor2 := RGB(0,70,0); + + {ClearColor=clWhite; + FillColor=clBlack; + FiledColor=clLightGray; + FiledColor2=clGray;{} + + +var + //a,b,sosedia,sosedib: array [0..nn,0..mm] of byte; + a,b,sosedia,sosedib:array of array of byte; + //obnovA,obnovB: array [1..nk,1..mk] of boolean; + obnovA,obnovB: array of array of boolean; + count: integer; + obn: boolean; + mil,mil1: integer; + hn,hm: integer; + +procedure AssignArray(var arr:array of array of boolean; n,m:integer); +begin + SetLength(arr,n); + for var i:=0 to n-1 do + SetLength(arr[i],m); +end; +procedure AssignArray(var arr:array of array of byte; n,m:integer); +begin + SetLength(arr,n); + for var i:=0 to n-1 do + SetLength(arr[i],m); +end; +procedure CopyArray(arr1,arr2:array of array of byte); +begin + for var i:=0 to arr1.Length-1 do + arr1[i].CopyTo(arr2[i],0); +end; +procedure CopyArray(arr1,arr2:array of array of boolean); +begin + for var i:=0 to arr1.Length-1 do + arr1[i].CopyTo(arr2[i],0); +end; + +procedure DrawCell(i,j: integer); +begin + if BrushColor<>FillColor then begin + SetBrushColor(FillColor); + SetPenColor(FillColor); + end; + FillRect(x0+(j-1)*w,y0+(i-1)*w,x0+j*w-w1,y0+i*w-w1); +end; + + +procedure ClearCell(i,j: integer); +begin + if BrushColor<>clearColor then begin + SetBrushColor(clearColor); + SetPenColor(clearColor); + end; + FillRect(x0+(j-1)*w,y0+(i-1)*w,x0+j*w-w1,y0+i*w-w1); +end; + +procedure DrawConfiguration; +begin + for var i:=1 to n do + for var j:=1 to m do + if a[i,j]=1 then + DrawCell(i,j) +end; + +procedure DrawField; +begin + SetBrushColor(ClearColor); + FillRectangle(x0,y0,x0+m*w,y0+n*w); + SetPenColor(FiledColor); + for var i:=0 to m do + Line(x0+i*w-1,y0,x0+i*w-1,y0+n*w); + for var i:=0 to n do + Line(x0,y0+i*w-1,x0+m*w,y0+i*w-1); + SetPenColor(FiledColor2); + for var i:=0 to m div hm do + Line(x0+i*w*hm-1,y0,x0+i*w*hm-1,y0+n*w); + for var i:=0 to n div hn do + Line(x0,y0+i*w*hn-1,x0+m*w,y0+i*w*hn-1); +end; + +procedure IncSosedi(i,j: integer); +begin + var i1 := i=1 ? n : i-1; + var i2 := i=n ? 1 : i+1; + var j1 := j=1 ? m : j-1; + var j2 := j=m ? 1 : j+1; + SosediB[i1,j1] += 1; + SosediB[i1,j] += 1; + SosediB[i1,j2] += 1; + SosediB[i,j1] += 1; + SosediB[i,j2] += 1; + SosediB[i2,j1] += 1; + SosediB[i2,j] += 1; + SosediB[i2,j2] += 1; +end; + +procedure DecSosedi(i,j: integer); +begin + var i1 := i=1 ? n : i-1; + var i2 := i=n ? 1 : i+1; + var j1 := j=1 ? m : j-1; + var j2 := j=m ? 1 : j+1; + SosediB[i1,j1] -= 1; + SosediB[i1,j] -= 1; + SosediB[i1,j2] -= 1; + SosediB[i,j1] -= 1; + SosediB[i,j2] -= 1; + SosediB[i2,j1] -= 1; + SosediB[i2,j] -= 1; + SosediB[i2,j2] -= 1; +end; + +procedure SetCell(i,j: integer); +begin + if b[i,j]=0 then + begin + b[i,j]:=1; + obn:=true; + IncSosedi(i,j); + end; + count += 1; +end; + +procedure UnSetCell(i,j: integer); +begin + if b[i,j]=1 then + begin + b[i,j]:=0; + obn:=true; + DecSosedi(i,j); + end; + count -= 1; +end; + +type + ColonyType = (Big, LD, RD, LU, RU); +procedure AddColonyType(xc,yc:integer; ctype:ColonyType); +begin + case ctype of + ColonyType.Big:begin + SetCell(xc,yc); + SetCell(xc,yc+1); + SetCell(xc,yc+2); + SetCell(xc-1,yc+2); + SetCell(xc+1,yc+1); + end; + ColonyType.LD:begin + SetCell(xc,yc-1); + SetCell(xc,yc); + SetCell(xc,yc+1); + SetCell(xc-1,yc-1); + SetCell(xc-2,yc); + end; + end; + //SosediA:=SosediB; + CopyArray(sosedib,sosedia); + for var ik:=1 to nk do + for var jk:=1 to mk do + obnovB[ik,jk]:=true; + //obnovA:=obnovB; + CopyArray(obnovB,obnovA); +end; + +procedure Init; +begin + Count:=0; + AddColonyType(n div 2,m div 2, ColonyType.Big); +end; + +procedure OnlyCase(i,j: integer); +begin + case SosediA[i,j] of +0..1,4..9: + if b[i,j]=1 then + begin + b[i,j]:=0; + obn:=true; + DecSosedi(i,j); + ClearCell(i,j); + count -= 1; + end; +3: if b[i,j]=0 then + begin + b[i,j]:=1; + obn:=true; + IncSosedi(i,j); + DrawCell(i,j); + count += 1; + end; + end; +end; + +procedure NextGen; +var + i,j,ik1,jk1,ik2,jk2,ifirst,jfirst,ilast,jlast: integer; + l,r,u,d,lu,ld,ru,rd: boolean; +begin + for var ik:=1 to nk do + begin + for var jk:=1 to mk do + begin + obn := false; + ifirst := (ik-1)*hn+1; + ilast := ik*hn; + jfirst := (jk-1)*hm+1; + jlast := jk*hm; + if obnovA[ik,jk] then + begin + for i:=ifirst to ilast do + for j:=jfirst to jlast do + OnlyCase(i,j); + end + else + begin + ik1 := ik=1 ? nk : ik-1; + ik2 := ik=nk ? 1 : ik+1; + jk1 := jk=1 ? mk : jk-1; + jk2 := jk=mk ? 1 : jk+1; + l:=obnovA[ik,jk1]; + r:=obnovA[ik,jk2]; + u:=obnovA[ik1,jk]; + d:=obnovA[ik2,jk]; + lu:=obnovA[ik1,jk1]; + ld:=obnovA[ik2,jk1]; + ru:=obnovA[ik1,jk2]; + rd:=obnovA[ik2,jk2]; + if u then + begin + i:=ifirst; + for j:=jfirst+1 to jlast-1 do + OnlyCase(i,j); + end; + if d then + begin + i:=ilast; + for j:=jfirst+1 to jlast-1 do + OnlyCase(i,j); + end; + if l then + begin + j:=jfirst; + for i:=ifirst+1 to ilast-1 do + OnlyCase(i,j); + end; + if r then + begin + j:=jlast; + for i:=ifirst+1 to ilast-1 do + OnlyCase(i,j); + end; + if u or l or lu then + OnlyCase(ifirst,jfirst); + if u or r or ru then + OnlyCase(ifirst,jlast); + if d or l or ld then + OnlyCase(ilast,jfirst); + if d or r or rd then + OnlyCase(ilast,jlast); + end; + obnovB[ik,jk]:=obn; + end; + end; +end; + +procedure MouseDown(x,y,b:integer); +begin + case b of + 1:AddColonyType((y-y0)div w,(x-x0)div w, ColonyType.LD); + + end; +end; + +begin + SetConsoleIO; + AssignArray(obnovA,nk+1,mk+1); + AssignArray(obnovB,nk+1,mk+1); + AssignArray(a,nn+1,mm+1); + AssignArray(b,nn+1,mm+1); + AssignArray(sosedia,nn+1,mm+1); + AssignArray(sosedib,nn+1,mm+1); + SetWindowCaption('Игра "Жизнь"'); + if (m mod mk<>0) or (n mod nk<>0) then + begin + writeln('Размер кластера не согласован с размером поля. Программа завершена'); + exit + end; + hm:=m div mk; + hn:=n div nk; + SetBrushColor(ClearColor); + SetWindowSize(x0+m*w,y0+n*w+graphW); + CenterWindow; + ClearWindow(ClearColor); + SetFontName('Courier New'); + SetFontSize(10); + Init; + DrawField; + DrawConfiguration; + OnMouseDown:=MouseDown; + mil:=Milliseconds; + var gen:=0; + DrawInBuffer := false; + while true do begin + gen+=1; + //SosediA:=SosediB; + //obnovA:=obnovB; + CopyArray(sosedib,sosedia); + CopyArray(obnovB,obnovA); + NextGen; + if gen mod 10 = 0 then begin + DrawInBuffer := True; + SetBrushColor(ClearColor); + SetFontColor(FillColor); + TextOut(25, 0,'Поколение: '+IntToStr(gen)); + TextOut(765,0,'Жителей: '+IntToStr(count)+' '); + if gen mod 1000 = 0 then begin + mil1:=Milliseconds; + writeln(gen,' ',(mil1-mil)/1000); + mil:=mil1; + end; + DrawInBuffer := false; + end; + end; +end. diff --git a/Games/PifTableExam.pas b/Games/PifTableExam.pas new file mode 100644 index 0000000..0ca2d64 --- /dev/null +++ b/Games/PifTableExam.pas @@ -0,0 +1,61 @@ +uses GraphWPF,Controls,Sounds; + +var x, y: integer; + +procedure NextQuestion; +begin + Window.Clear; + (x, y) := Random2(2, 9); + DrawText(GraphWindow.ClientRect,$'{x} × {y} = ?'); +end; + +function Оценка(ВерныхОтветов: integer): integer; +begin + case ВерныхОтветов of + 10, 9: Оценка := 5; + 8, 7: Оценка := 4; + 4..6: Оценка := 3; + else Оценка := 2; + end; +end; + +begin + Window.Title := 'Проверка таблицы умножения'; + Font.Size := 40; + var l := LeftPanel(200); + l.FontSize := 16; + var sb := StatusBar; + NextQuestion; + + var Результат := IntegerBox('Введите ответ:',0,100); + var b := Button('Ответить'); + var КоличествоОтветов := IntegerBlock('Ответов:'); + var ВерныхОтветов := IntegerBlock('Верных ответов:'); + + b.Click := procedure → begin + if x * y = Результат then + begin + sb.Text := 'Верно!'; + ВерныхОтветов += 1; + end + else + begin + sb.Text := 'Неверно :('; + end; + КоличествоОтветов += 1; + Результат := 0; + if КоличествоОтветов = 10 then // Конец опроса + begin + MessageBox.Show('Тест окончен.'#10#10'Верных ответов: ' + + ВерныхОтветов.Value + #10#10 + 'Оценка: ' + Оценка(ВерныхОтветов)); + // Переход к следующему тесту + ВерныхОтветов := 0; + КоличествоОтветов := 0; + end; + NextQuestion; + end; + OnResize := procedure → begin + Window.Clear; + DrawText(GraphWindow.ClientRect,$'{x} × {y} = ?'); + end; +end. \ No newline at end of file diff --git a/Games/PifTableExam1.pas b/Games/PifTableExam1.pas new file mode 100644 index 0000000..9227926 --- /dev/null +++ b/Games/PifTableExam1.pas @@ -0,0 +1,63 @@ +uses GraphWPF,Controls,Sounds; + +function Оценка(ВерныхОтветов: integer): integer; +begin + case ВерныхОтветов of + 10, 9: Оценка := 5; + 8, 7: Оценка := 4; + 4..6: Оценка := 3; + else Оценка := 2; + end; +end; + +begin + Window.Title := 'Проверка таблицы умножения'; + Font.Size := 60; + var l := LeftPanel(200); + l.FontSize := 16; + var sb := StatusBar; + + var Результат := IntegerBox('Введите ответ:',0,100); + var b := Button('Ответить'); + var КоличествоОтветов := IntegerBlock('Ответов:'); + var ВерныхОтветов := IntegerBlock('Верных ответов:'); + + var ТестОкончен := procedure → begin + MessageBox.Show('Тест окончен.'+#10#10+'Верных ответов: ' + + ВерныхОтветов.Value + #10#10 + 'Оценка: ' + Оценка(ВерныхОтветов)); + // Переход к следующему тесту + ВерныхОтветов := 0; + КоличествоОтветов := 0; + end; + + var x, y: integer; // сомножители + + var НарисоватьТест := procedure → begin + Window.Clear; + DrawText(GraphWindow.ClientRect,$'{x} × {y} = ?'); + end; + + var СледующийВопрос := procedure → begin + (x, y) := Random2(2, 9); + НарисоватьТест; + end; + СледующийВопрос; + + b.Click := procedure → begin + if x * y = Результат then + begin + sb.Text := 'Верно!'; + ВерныхОтветов += 1; + end + else + begin + sb.Text := 'Неверно :('; + end; + КоличествоОтветов += 1; + Результат := 0; + if КоличествоОтветов = 10 then // Конец опроса + ТестОкончен; + СледующийВопрос; + end; + OnResize := НарисоватьТест; +end. \ No newline at end of file diff --git a/Graph3D/All3DPrimitives.pas b/Graph3D/All3DPrimitives.pas new file mode 100644 index 0000000..dbb3d13 --- /dev/null +++ b/Graph3D/All3DPrimitives.pas @@ -0,0 +1,51 @@ +uses Graph3D; + +begin + Window.Title := '3D-'; + + var rr := Rectangle3D(-3.5,-2,0,3,2,Colors.MediumPurple); + rr.Rotate(v3d(0,1,0),30); + + var := CoordinateSystem(2); + + var Ar := Arrow(3,0,0,0,0,2,Colors.Tan); + + var p := P3D(5,-5,0); + var t := TruncatedCone(p,2,0.9,0.7,False,Colors.Red); + p := p.MoveX(-2); + TruncatedCone(p,2,0.9,0.7,Colors.BlueViolet); + p := p.MoveX(-2); + Cylinder(p,2,0.9,False,Colors.Crimson); + p := p.MoveX(-2); + var cc := Cylinder(p,2,0.9,Colors.Chocolate); + p := p.MoveX(-2); + var := Cone(p,2.5,0.9,Colors.DarkGreen); + p := p.MoveX(-2); + var c := Sphere(p.MoveZ(0.7),1,Colors.Crimson); + Text3D(p.MoveZ(2.3),'',0.7); + + p := P3D(5,-2,0); + var := Teapot(p.MoveZ(0.9),Colors.ForestGreen); + //.Rotate(V3D(0,1,0),45); + var bb := BillboardText(p.Move(2,0,0.7),'Billboard'+NewLine + '""',12); + p := p.MoveX(-2.75); + var cb := Cube(p.MoveZ(0.75),1.5,Colors.DodgerBlue); + cb.Scale(1.2); + cb.Rotate(V3D(0,0,1),45); + p := p.MoveX(-2.75); + var b := Box(p,Sz3D(2,1,1),Colors.PaleGreen); + b.Rotate(V3D(0,1,0),-30); + p := P3D(5,1,0); + var := Ellipsoid(p.MoveZ(0.6),1.3,0.8,0.6,Colors.Violet); + p := p.MoveX(-7); + var pp := Tube(p,2,0.7,0.5,Colors.DodgerBlue); + //View3D.Save('a2.jpg'); + + {while True do + begin + .Rotate(V3D(0,0,1),10.8); + .Rotate(V3D(0,0,1),-5.8); + .Rotate(V3D(0,0,1),1); + Sleep(50); + end;} +end. \ No newline at end of file diff --git a/Graph3D/Chess3D/bishop.obj b/Graph3D/Chess3D/bishop.obj new file mode 100644 index 0000000..d3f8be6 --- /dev/null +++ b/Graph3D/Chess3D/bishop.obj @@ -0,0 +1,3110 @@ +# Blender3D v245 OBJ File: chess2.blend +# www.blender3d.org +v 3.600000 -6.400000 0.000000 +v 3.705525 -6.528583 0.000000 +v 3.783938 -6.675282 0.000000 +v 3.832224 -6.834460 0.000000 +v 3.848528 -7.000000 0.000000 +v 3.832224 -7.165540 0.000000 +v 3.783938 -7.324718 0.000000 +v 3.705525 -7.471417 0.000000 +v 3.600000 -7.600000 0.000000 +v 3.471417 -7.705525 0.000000 +v 3.324718 -7.783938 0.000000 +v 3.165540 -7.832224 0.000000 +v 3.000000 -7.848528 0.000000 +v 2.834460 -7.832224 0.000000 +v 2.675282 -7.783937 0.000000 +v 2.528583 -7.705525 0.000000 +v 2.400000 -7.599999 0.000000 +v 2.294474 -7.471416 0.000000 +v 2.216062 -7.324717 0.000000 +v 2.167776 -7.165539 0.000000 +v 2.151472 -6.999999 0.000000 +v 2.167776 -6.834459 0.000000 +v 2.216063 -6.675282 0.000000 +v 2.294475 -6.528582 0.000000 +v 2.400001 -6.399999 0.000000 +v 2.528584 -6.294474 0.000000 +v 2.675283 -6.216062 0.000000 +v 2.834462 -6.167776 0.000000 +v 3.000001 -6.151472 0.000000 +v 3.165541 -6.167777 0.000000 +v 3.324719 -6.216063 0.000000 +v 3.471418 -6.294476 0.000000 +v 3.471418 -6.294476 0.100000 +v 3.324719 -6.216063 0.100000 +v 3.165541 -6.167777 0.100000 +v 3.000001 -6.151472 0.100000 +v 2.834462 -6.167776 0.100000 +v 2.675283 -6.216062 0.100000 +v 2.528584 -6.294474 0.100000 +v 2.400001 -6.399999 0.100000 +v 2.294475 -6.528582 0.100000 +v 2.216063 -6.675282 0.100000 +v 2.167776 -6.834459 0.100000 +v 2.151472 -6.999999 0.100000 +v 2.167776 -7.165539 0.100000 +v 2.216062 -7.324717 0.100000 +v 2.294474 -7.471416 0.100000 +v 2.400000 -7.599999 0.100000 +v 2.528583 -7.705525 0.100000 +v 2.675282 -7.783937 0.100000 +v 2.834460 -7.832224 0.100000 +v 3.000000 -7.848528 0.100000 +v 3.165540 -7.832224 0.100000 +v 3.324718 -7.783938 0.100000 +v 3.471417 -7.705525 0.100000 +v 3.600000 -7.600000 0.100000 +v 3.705525 -7.471417 0.100000 +v 3.783938 -7.324718 0.100000 +v 3.832224 -7.165540 0.100000 +v 3.848528 -7.000000 0.100000 +v 3.832224 -6.834460 0.100000 +v 3.783938 -6.675282 0.100000 +v 3.705525 -6.528583 0.100000 +v 3.600000 -6.400000 0.100000 +v 3.420000 -6.580000 0.200000 +v 3.493868 -6.670008 0.200000 +v 3.548756 -6.772697 0.200000 +v 3.582557 -6.884122 0.200000 +v 3.593970 -7.000000 0.200000 +v 3.582557 -7.115878 0.200000 +v 3.548757 -7.227302 0.200000 +v 3.493868 -7.329992 0.200000 +v 3.420000 -7.420000 0.200000 +v 3.329992 -7.493868 0.200000 +v 3.227302 -7.548757 0.200000 +v 3.115878 -7.582557 0.200000 +v 3.000000 -7.593970 0.200000 +v 2.884122 -7.582557 0.200000 +v 2.772697 -7.548757 0.200000 +v 2.670008 -7.493867 0.200000 +v 2.580000 -7.420000 0.200000 +v 2.506132 -7.329991 0.200000 +v 2.451243 -7.227302 0.200000 +v 2.417443 -7.115877 0.200000 +v 2.406030 -7.000000 0.200000 +v 2.417443 -6.884122 0.200000 +v 2.451244 -6.772697 0.200000 +v 2.506133 -6.670008 0.200000 +v 2.580000 -6.579999 0.200000 +v 2.670009 -6.506132 0.200000 +v 2.772698 -6.451243 0.200000 +v 2.884123 -6.417443 0.200000 +v 3.000001 -6.406030 0.200000 +v 3.115879 -6.417443 0.200000 +v 3.227303 -6.451244 0.200000 +v 3.329993 -6.506133 0.200000 +v 3.362992 -6.456746 0.300000 +v 3.250034 -6.396369 0.300000 +v 3.127467 -6.359188 0.300000 +v 3.000001 -6.346633 0.300000 +v 2.872535 -6.359187 0.300000 +v 2.749968 -6.396368 0.300000 +v 2.637010 -6.456745 0.300000 +v 2.538001 -6.537999 0.300000 +v 2.456746 -6.637008 0.300000 +v 2.396368 -6.749967 0.300000 +v 2.359188 -6.872534 0.300000 +v 2.346633 -7.000000 0.300000 +v 2.359188 -7.127465 0.300000 +v 2.396368 -7.250032 0.300000 +v 2.456745 -7.362991 0.300000 +v 2.538000 -7.462000 0.300000 +v 2.637009 -7.543254 0.300000 +v 2.749967 -7.603632 0.300000 +v 2.872534 -7.640812 0.300000 +v 3.000000 -7.653367 0.300000 +v 3.127465 -7.640812 0.300000 +v 3.250032 -7.603632 0.300000 +v 3.362991 -7.543254 0.300000 +v 3.462000 -7.462000 0.300000 +v 3.543255 -7.362991 0.300000 +v 3.603632 -7.250032 0.300000 +v 3.640812 -7.127465 0.300000 +v 3.653367 -7.000000 0.300000 +v 3.640812 -6.872534 0.300000 +v 3.603632 -6.749968 0.300000 +v 3.543255 -6.637009 0.300000 +v 3.462000 -6.538000 0.300000 +v 3.323400 -6.676600 0.400000 +v 3.380278 -6.745906 0.400000 +v 3.422543 -6.824977 0.400000 +v 3.448569 -6.910774 0.400000 +v 3.457357 -7.000000 0.400000 +v 3.448569 -7.089226 0.400000 +v 3.422543 -7.175023 0.400000 +v 3.380278 -7.254094 0.400000 +v 3.323400 -7.323400 0.400000 +v 3.254094 -7.380278 0.400000 +v 3.175023 -7.422543 0.400000 +v 3.089226 -7.448569 0.400000 +v 3.000000 -7.457356 0.400000 +v 2.910774 -7.448569 0.400000 +v 2.824977 -7.422543 0.400000 +v 2.745906 -7.380278 0.400000 +v 2.676600 -7.323400 0.400000 +v 2.619722 -7.254094 0.400000 +v 2.577457 -7.175023 0.400000 +v 2.551431 -7.089225 0.400000 +v 2.542643 -7.000000 0.400000 +v 2.551431 -6.910774 0.400000 +v 2.577458 -6.824977 0.400000 +v 2.619722 -6.745906 0.400000 +v 2.676600 -6.676600 0.400000 +v 2.745907 -6.619721 0.400000 +v 2.824978 -6.577457 0.400000 +v 2.910775 -6.551431 0.400000 +v 3.000001 -6.542644 0.400000 +v 3.089227 -6.551432 0.400000 +v 3.175024 -6.577458 0.400000 +v 3.254094 -6.619722 0.400000 +v 3.177866 -6.733806 1.400000 +v 3.122516 -6.704220 1.400000 +v 3.062459 -6.686002 1.400000 +v 3.000000 -6.679851 1.400000 +v 2.937542 -6.686002 1.400000 +v 2.877485 -6.704220 1.400000 +v 2.822135 -6.733805 1.400000 +v 2.773620 -6.773620 1.400000 +v 2.733805 -6.822134 1.400000 +v 2.704221 -6.877484 1.400000 +v 2.686002 -6.937541 1.400000 +v 2.679850 -7.000000 1.400000 +v 2.686002 -7.062458 1.400000 +v 2.704220 -7.122516 1.400000 +v 2.733805 -7.177866 1.400000 +v 2.773620 -7.226380 1.400000 +v 2.822134 -7.266195 1.400000 +v 2.877484 -7.295780 1.400000 +v 2.937542 -7.313998 1.400000 +v 3.000000 -7.320149 1.400000 +v 3.062458 -7.313998 1.400000 +v 3.122516 -7.295780 1.400000 +v 3.177866 -7.266195 1.400000 +v 3.226380 -7.226380 1.400000 +v 3.266195 -7.177866 1.400000 +v 3.295780 -7.122516 1.400000 +v 3.313998 -7.062458 1.400000 +v 3.320150 -7.000000 1.400000 +v 3.313998 -6.937542 1.400000 +v 3.295780 -6.877484 1.400000 +v 3.266195 -6.822134 1.400000 +v 3.226380 -6.773620 1.400000 +v 3.407484 -6.592516 1.400000 +v 3.479151 -6.679842 1.400000 +v 3.532403 -6.779471 1.400000 +v 3.565197 -6.887576 1.400000 +v 3.576269 -7.000000 1.400000 +v 3.565197 -7.112424 1.400000 +v 3.532403 -7.220529 1.400000 +v 3.479151 -7.320158 1.400000 +v 3.407484 -7.407484 1.400000 +v 3.320158 -7.479150 1.400000 +v 3.220529 -7.532403 1.400000 +v 3.112424 -7.565197 1.400000 +v 3.000000 -7.576269 1.400000 +v 2.887575 -7.565197 1.400000 +v 2.779471 -7.532403 1.400000 +v 2.679842 -7.479150 1.400000 +v 2.592516 -7.407484 1.400000 +v 2.520849 -7.320158 1.400000 +v 2.467596 -7.220528 1.400000 +v 2.434803 -7.112424 1.400000 +v 2.423731 -7.000000 1.400000 +v 2.434803 -6.887575 1.400000 +v 2.467597 -6.779470 1.400000 +v 2.520850 -6.679841 1.400000 +v 2.592516 -6.592515 1.400000 +v 2.679842 -6.520849 1.400000 +v 2.779472 -6.467596 1.400000 +v 2.887576 -6.434803 1.400000 +v 3.000001 -6.423731 1.400000 +v 3.112426 -6.434803 1.400000 +v 3.220530 -6.467597 1.400000 +v 3.320159 -6.520850 1.400000 +v 3.064032 -6.904170 2.300000 +v 3.044106 -6.893519 2.300000 +v 3.022485 -6.886961 2.300000 +v 3.000000 -6.884746 2.300000 +v 2.977515 -6.886961 2.300000 +v 2.955894 -6.893519 2.300000 +v 2.935968 -6.904170 2.300000 +v 2.918503 -6.918503 2.300000 +v 2.904170 -6.935968 2.300000 +v 2.893519 -6.955894 2.300000 +v 3.044106 -7.106481 2.300000 +v 3.064032 -7.095830 2.300000 +v 3.081497 -7.081497 2.300000 +v 3.095830 -7.064032 2.300000 +v 3.106481 -7.044106 2.300000 +v 3.113039 -7.022485 2.300000 +v 3.115254 -7.000000 2.300000 +v 3.113039 -6.977515 2.300000 +v 3.106481 -6.955894 2.300000 +v 3.095830 -6.935968 2.300000 +v 3.081497 -6.918503 2.300000 +v 3.000000 -7.000000 0.000000 +v 3.037939 -7.000000 2.486669 +v 3.050014 -7.000000 2.482349 +v 3.118423 -6.976445 2.311595 +v 3.122661 -6.975602 2.323670 +v 3.125717 -6.974994 2.336112 +v 3.127563 -6.974627 2.348798 +v 3.128180 -6.974504 2.361608 +v 3.127563 -6.974627 2.374417 +v 3.125717 -6.974994 2.387104 +v 3.122661 -6.975602 2.399545 +v 3.118423 -6.976445 2.411620 +v 3.113045 -6.977515 2.423214 +v 3.106578 -6.978801 2.434215 +v 3.099085 -6.980292 2.444516 +v 3.090637 -6.981972 2.454019 +v 3.081317 -6.983826 2.462632 +v 3.071214 -6.985836 2.470272 +v 3.060425 -6.987982 2.476866 +v 3.049053 -6.990243 2.482349 +v 3.037210 -6.992599 2.486669 +v 3.025008 -6.995027 2.489786 +v 3.012565 -6.997501 2.491668 +v 3.011836 -6.995099 2.491668 +v 3.023557 -6.990243 2.489786 +v 3.035051 -6.985483 2.486669 +v 3.046207 -6.980862 2.482349 +v 3.056919 -6.976425 2.476866 +v 3.067082 -6.972215 2.470272 +v 3.076599 -6.968273 2.462632 +v 3.085379 -6.964636 2.454019 +v 3.093336 -6.961340 2.444516 +v 3.100394 -6.958416 2.434215 +v 3.106486 -6.955894 2.423214 +v 3.111552 -6.953795 2.411620 +v 3.115544 -6.952141 2.399545 +v 3.118423 -6.950949 2.387104 +v 3.120162 -6.950229 2.374417 +v 3.120743 -6.949988 2.361608 +v 3.120162 -6.950229 2.348798 +v 3.118423 -6.950949 2.336112 +v 3.115544 -6.952141 2.323670 +v 3.111552 -6.953795 2.311595 +v 3.100394 -6.932920 2.311595 +v 3.103987 -6.930520 2.323670 +v 3.106578 -6.928789 2.336112 +v 3.108143 -6.927743 2.348798 +v 3.108666 -6.927393 2.361608 +v 3.108143 -6.927743 2.374417 +v 3.106578 -6.928789 2.387104 +v 3.103987 -6.930520 2.399545 +v 3.100394 -6.932920 2.411620 +v 3.095835 -6.935967 2.423214 +v 3.090353 -6.939630 2.434215 +v 3.084000 -6.943874 2.444516 +v 3.076839 -6.948659 2.454019 +v 3.068938 -6.953939 2.462632 +v 3.060372 -6.959662 2.470272 +v 3.051226 -6.965774 2.476866 +v 3.041586 -6.972215 2.482349 +v 3.031545 -6.978924 2.486669 +v 3.021201 -6.985836 2.489786 +v 3.010653 -6.992884 2.491668 +v 3.009059 -6.990943 2.491668 +v 3.018030 -6.981972 2.489786 +v 3.026827 -6.973175 2.486669 +v 3.035366 -6.964636 2.482349 +v 3.043564 -6.956438 2.476866 +v 3.051343 -6.948659 2.470272 +v 3.058627 -6.941375 2.462632 +v 3.065346 -6.934656 2.454019 +v 3.071437 -6.928566 2.444516 +v 3.076839 -6.923163 2.434215 +v 3.081501 -6.918501 2.423214 +v 3.085379 -6.914624 2.411620 +v 3.088434 -6.911569 2.399545 +v 3.090637 -6.909365 2.387104 +v 3.091968 -6.908034 2.374417 +v 3.092413 -6.907589 2.361608 +v 3.091968 -6.908034 2.348798 +v 3.090637 -6.909365 2.336112 +v 3.088434 -6.911569 2.323670 +v 3.085379 -6.914624 2.311595 +v 3.067082 -6.899608 2.311595 +v 3.069482 -6.896015 2.323670 +v 3.071214 -6.893424 2.336112 +v 3.072259 -6.891860 2.348798 +v 3.072609 -6.891336 2.361608 +v 3.072259 -6.891860 2.374417 +v 3.071214 -6.893424 2.387104 +v 3.069482 -6.896015 2.399545 +v 3.067082 -6.899608 2.411620 +v 3.064035 -6.904167 2.423214 +v 3.060372 -6.909649 2.434215 +v 3.056128 -6.916002 2.444516 +v 3.051343 -6.923163 2.454019 +v 3.046063 -6.931065 2.462632 +v 3.040340 -6.939630 2.470272 +v 3.034228 -6.948777 2.476866 +v 3.027787 -6.958416 2.482349 +v 3.021078 -6.968457 2.486669 +v 3.014167 -6.978801 2.489786 +v 3.007118 -6.989350 2.491668 +v 3.004904 -6.988166 2.491668 +v 3.009759 -6.976445 2.489786 +v 3.014519 -6.964951 2.486669 +v 3.019141 -6.953795 2.482349 +v 3.023577 -6.943084 2.476866 +v 3.027787 -6.932920 2.470272 +v 3.031729 -6.923403 2.462632 +v 3.035366 -6.914624 2.454019 +v 3.038662 -6.906666 2.444516 +v 3.041586 -6.899608 2.434215 +v 3.044109 -6.893516 2.423214 +v 3.046207 -6.888450 2.411620 +v 3.047861 -6.884459 2.399545 +v 3.049053 -6.881579 2.387104 +v 3.049773 -6.879841 2.374417 +v 3.050014 -6.879259 2.361608 +v 3.049773 -6.879841 2.348798 +v 3.049053 -6.881579 2.336112 +v 3.047861 -6.884459 2.323670 +v 3.046207 -6.888450 2.311595 +v 3.023557 -6.881579 2.311595 +v 3.024400 -6.877342 2.323670 +v 3.025008 -6.874285 2.336112 +v 3.025375 -6.872439 2.348798 +v 3.025498 -6.871822 2.361608 +v 3.025375 -6.872439 2.374417 +v 3.025008 -6.874285 2.387104 +v 3.024400 -6.877342 2.399545 +v 3.023557 -6.881579 2.411620 +v 3.022487 -6.886958 2.423214 +v 3.021201 -6.893424 2.434215 +v 3.019711 -6.900918 2.444516 +v 3.018030 -6.909365 2.454019 +v 3.016176 -6.918685 2.462632 +v 3.014167 -6.928789 2.470272 +v 3.012021 -6.939578 2.476866 +v 3.009759 -6.950949 2.482349 +v 3.007403 -6.962792 2.486669 +v 3.004976 -6.974994 2.489786 +v 3.002501 -6.987437 2.491668 +v 3.000002 -6.987191 2.491668 +v 3.000002 -6.974504 2.489786 +v 3.000002 -6.962063 2.486669 +v 3.000002 -6.949988 2.482349 +v 3.000002 -6.938394 2.476866 +v 3.000002 -6.927393 2.470272 +v 3.000002 -6.917092 2.462632 +v 3.000002 -6.907589 2.454019 +v 3.000002 -6.898976 2.444516 +v 3.000002 -6.891336 2.434215 +v 3.000002 -6.884743 2.423214 +v 3.000002 -6.879259 2.411620 +v 3.000002 -6.874938 2.399545 +v 3.000002 -6.871822 2.387104 +v 3.000002 -6.869940 2.374417 +v 3.000002 -6.869311 2.361608 +v 3.000002 -6.869940 2.348798 +v 3.000002 -6.871822 2.336112 +v 3.000002 -6.874938 2.323670 +v 3.000002 -6.879259 2.311595 +v 2.976446 -6.881579 2.311595 +v 2.975603 -6.877342 2.323670 +v 2.974995 -6.874285 2.336112 +v 2.974628 -6.872439 2.348798 +v 2.974505 -6.871822 2.361608 +v 2.974628 -6.872439 2.374417 +v 2.974995 -6.874285 2.387104 +v 2.975603 -6.877342 2.399545 +v 2.976446 -6.881579 2.411620 +v 2.977516 -6.886958 2.423214 +v 2.978802 -6.893424 2.434215 +v 2.980293 -6.900918 2.444516 +v 2.981973 -6.909365 2.454019 +v 2.983827 -6.918685 2.462632 +v 2.985837 -6.928789 2.470272 +v 2.987983 -6.939578 2.476866 +v 2.990245 -6.950949 2.482349 +v 2.992600 -6.962792 2.486669 +v 2.995028 -6.974994 2.489786 +v 2.997503 -6.987437 2.491668 +v 2.995100 -6.988166 2.491668 +v 2.990245 -6.976445 2.489786 +v 2.985484 -6.964952 2.486669 +v 2.980863 -6.953795 2.482349 +v 2.976426 -6.943084 2.476866 +v 2.972216 -6.932920 2.470272 +v 2.968274 -6.923403 2.462632 +v 2.964637 -6.914624 2.454019 +v 2.961341 -6.906666 2.444516 +v 2.958418 -6.899608 2.434215 +v 2.955894 -6.893516 2.423214 +v 2.953796 -6.888450 2.411620 +v 2.952142 -6.884459 2.399545 +v 2.950950 -6.881579 2.387104 +v 2.950230 -6.879841 2.374417 +v 2.949989 -6.879259 2.361608 +v 2.950230 -6.879841 2.348798 +v 2.950950 -6.881579 2.336112 +v 2.952142 -6.884459 2.323670 +v 2.953796 -6.888450 2.311595 +v 2.932921 -6.899608 2.311595 +v 2.930521 -6.896015 2.323670 +v 2.928790 -6.893425 2.336112 +v 2.927744 -6.891860 2.348798 +v 2.927394 -6.891336 2.361608 +v 2.927744 -6.891860 2.374417 +v 2.928790 -6.893425 2.387104 +v 2.930521 -6.896015 2.399545 +v 2.932921 -6.899608 2.411620 +v 2.935968 -6.904167 2.423214 +v 2.939631 -6.909649 2.434215 +v 2.943876 -6.916002 2.444516 +v 2.948661 -6.923163 2.454019 +v 2.953940 -6.931065 2.462632 +v 2.959663 -6.939630 2.470272 +v 2.965775 -6.948777 2.476866 +v 2.972216 -6.958416 2.482349 +v 2.978925 -6.968457 2.486669 +v 2.985837 -6.978801 2.489786 +v 2.992885 -6.989350 2.491668 +v 2.990944 -6.990943 2.491668 +v 2.981973 -6.981972 2.489786 +v 2.973176 -6.973175 2.486669 +v 2.964637 -6.964636 2.482349 +v 2.956439 -6.956438 2.476866 +v 2.948661 -6.948659 2.470272 +v 2.941376 -6.941375 2.462632 +v 2.934657 -6.934656 2.454019 +v 2.928567 -6.928566 2.444516 +v 2.923164 -6.923163 2.434215 +v 2.918502 -6.918501 2.423214 +v 2.914625 -6.914624 2.411620 +v 2.911569 -6.911569 2.399545 +v 2.909366 -6.909365 2.387104 +v 2.908035 -6.908034 2.374417 +v 2.907590 -6.907589 2.361608 +v 2.908035 -6.908034 2.348798 +v 2.909366 -6.909365 2.336112 +v 2.911569 -6.911569 2.323670 +v 2.914625 -6.914624 2.311595 +v 2.899609 -6.932920 2.311595 +v 2.896016 -6.930520 2.323670 +v 2.893425 -6.928789 2.336112 +v 2.891860 -6.927743 2.348798 +v 2.891337 -6.927393 2.361608 +v 2.891860 -6.927743 2.374417 +v 2.893425 -6.928789 2.387104 +v 2.896016 -6.930520 2.399545 +v 2.899609 -6.932920 2.411620 +v 2.904168 -6.935967 2.423214 +v 2.909651 -6.939630 2.434215 +v 2.916003 -6.943874 2.444516 +v 2.923164 -6.948659 2.454019 +v 2.931066 -6.953939 2.462632 +v 2.939631 -6.959662 2.470272 +v 2.948778 -6.965774 2.476866 +v 2.958418 -6.972215 2.482349 +v 2.968458 -6.978924 2.486669 +v 2.978802 -6.985836 2.489786 +v 2.989351 -6.992884 2.491668 +v 2.988167 -6.995099 2.491668 +v 2.976446 -6.990243 2.489786 +v 2.964952 -6.985483 2.486669 +v 2.953796 -6.980862 2.482349 +v 2.943084 -6.976425 2.476866 +v 2.932921 -6.972215 2.470272 +v 2.923404 -6.968273 2.462632 +v 2.914625 -6.964636 2.454019 +v 2.906667 -6.961340 2.444516 +v 2.899609 -6.958416 2.434215 +v 2.893517 -6.955894 2.423214 +v 2.888451 -6.953795 2.411620 +v 2.884459 -6.952141 2.399545 +v 2.881580 -6.950949 2.387104 +v 2.879842 -6.950229 2.374417 +v 2.879260 -6.949988 2.361608 +v 2.879842 -6.950229 2.348798 +v 2.881580 -6.950949 2.336112 +v 2.884459 -6.952141 2.323670 +v 2.888451 -6.953795 2.311595 +v 2.886958 -6.977515 2.300001 +v 2.881580 -6.976445 2.311595 +v 2.877343 -6.975602 2.323670 +v 2.874286 -6.974994 2.336112 +v 2.872441 -6.974627 2.348798 +v 2.871823 -6.974504 2.361608 +v 2.872441 -6.974627 2.374417 +v 2.874286 -6.974994 2.387104 +v 2.877343 -6.975602 2.399545 +v 2.881580 -6.976445 2.411620 +v 2.886958 -6.977515 2.423214 +v 2.893425 -6.978801 2.434215 +v 2.900918 -6.980292 2.444516 +v 2.909366 -6.981972 2.454019 +v 2.918686 -6.983826 2.462632 +v 2.928790 -6.985836 2.470272 +v 2.939579 -6.987982 2.476866 +v 2.950950 -6.990243 2.482349 +v 2.962793 -6.992599 2.486669 +v 2.974995 -6.995027 2.489786 +v 2.987438 -6.997501 2.491668 +v 2.987192 -7.000000 2.491668 +v 2.974505 -7.000000 2.489786 +v 2.962065 -7.000000 2.486669 +v 2.949989 -7.000000 2.482349 +v 2.938395 -7.000000 2.476866 +v 2.927394 -7.000000 2.470272 +v 2.917093 -7.000000 2.462632 +v 2.907590 -7.000000 2.454019 +v 2.898977 -7.000000 2.444516 +v 2.891337 -7.000000 2.434215 +v 2.884744 -7.000000 2.423214 +v 2.879260 -7.000000 2.411620 +v 2.874940 -7.000000 2.399545 +v 2.871823 -7.000000 2.387104 +v 2.869941 -7.000000 2.374417 +v 2.869312 -7.000000 2.361608 +v 2.869941 -7.000000 2.348798 +v 2.871823 -7.000000 2.336112 +v 2.874940 -7.000000 2.323670 +v 2.879260 -7.000000 2.311595 +v 2.884744 -7.000000 2.300001 +v 2.886959 -7.022486 2.300001 +v 2.881580 -7.023556 2.311595 +v 2.877343 -7.024399 2.323670 +v 2.874286 -7.025007 2.336112 +v 2.872441 -7.025374 2.348798 +v 2.871823 -7.025497 2.361608 +v 2.872441 -7.025374 2.374417 +v 2.874286 -7.025007 2.387104 +v 2.877343 -7.024399 2.399545 +v 2.881580 -7.023556 2.411620 +v 2.886958 -7.022486 2.423214 +v 2.893425 -7.021200 2.434215 +v 2.900918 -7.019710 2.444516 +v 2.909366 -7.018029 2.454019 +v 2.918686 -7.016175 2.462632 +v 2.928790 -7.014165 2.470272 +v 2.939579 -7.012020 2.476866 +v 2.950950 -7.009758 2.482349 +v 2.962793 -7.007402 2.486669 +v 2.974995 -7.004975 2.489786 +v 2.987438 -7.002500 2.491668 +v 3.000002 -7.000000 2.492297 +v 2.988167 -7.004903 2.491668 +v 2.976446 -7.009758 2.489786 +v 2.964952 -7.014519 2.486669 +v 2.953796 -7.019140 2.482349 +v 2.943084 -7.023576 2.476866 +v 2.932921 -7.027786 2.470272 +v 2.923404 -7.031728 2.462632 +v 2.914625 -7.035365 2.454019 +v 2.906667 -7.038661 2.444516 +v 2.899609 -7.041584 2.434215 +v 2.893517 -7.044108 2.423214 +v 2.888451 -7.046206 2.411620 +v 2.884459 -7.047860 2.399545 +v 2.881580 -7.049052 2.387104 +v 2.879842 -7.049772 2.374417 +v 2.879260 -7.050014 2.361608 +v 2.879842 -7.049772 2.348798 +v 2.881580 -7.049052 2.336112 +v 2.884459 -7.047860 2.323670 +v 2.888451 -7.046206 2.311595 +v 2.893517 -7.044108 2.300001 +v 2.904168 -7.064034 2.300001 +v 2.899609 -7.067081 2.311595 +v 2.896016 -7.069481 2.323670 +v 2.893425 -7.071213 2.336112 +v 2.891861 -7.072258 2.348798 +v 2.891337 -7.072608 2.361608 +v 2.891861 -7.072258 2.374417 +v 2.893425 -7.071213 2.387104 +v 2.896016 -7.069481 2.399545 +v 2.899609 -7.067081 2.411620 +v 2.904168 -7.064034 2.423214 +v 2.909651 -7.060371 2.434215 +v 2.916003 -7.056127 2.444516 +v 2.923164 -7.051342 2.454019 +v 2.931066 -7.046062 2.462632 +v 2.939631 -7.040339 2.470272 +v 2.948778 -7.034227 2.476866 +v 2.958418 -7.027786 2.482349 +v 2.968458 -7.021077 2.486669 +v 2.978802 -7.014165 2.489786 +v 2.989351 -7.007117 2.491668 +v 2.990944 -7.009058 2.491668 +v 2.981973 -7.018029 2.489786 +v 2.973176 -7.026826 2.486669 +v 2.964637 -7.035365 2.482349 +v 2.956439 -7.043563 2.476866 +v 2.948661 -7.051342 2.470272 +v 2.941376 -7.058626 2.462632 +v 2.934657 -7.065345 2.454019 +v 2.928567 -7.071435 2.444516 +v 2.923164 -7.076838 2.434215 +v 2.918502 -7.081500 2.423214 +v 2.914625 -7.085378 2.411620 +v 2.911569 -7.088433 2.399545 +v 2.909366 -7.090636 2.387104 +v 2.908035 -7.091967 2.374417 +v 2.907590 -7.092412 2.361608 +v 2.908035 -7.091967 2.348798 +v 2.909366 -7.090636 2.336112 +v 2.911569 -7.088433 2.323670 +v 2.914625 -7.085378 2.311595 +v 2.918502 -7.081500 2.300001 +v 2.935968 -7.095834 2.300001 +v 2.932921 -7.100393 2.311595 +v 2.930521 -7.103986 2.323670 +v 2.928790 -7.106577 2.336112 +v 2.927744 -7.108142 2.348798 +v 2.927394 -7.108665 2.361608 +v 2.927744 -7.108142 2.374417 +v 2.928790 -7.106577 2.387104 +v 2.930521 -7.103986 2.399545 +v 2.932921 -7.100393 2.411620 +v 2.935968 -7.095834 2.423214 +v 2.939631 -7.090352 2.434215 +v 2.943876 -7.083999 2.444516 +v 2.948661 -7.076838 2.454019 +v 2.953940 -7.068936 2.462632 +v 2.959663 -7.060371 2.470272 +v 2.965775 -7.051225 2.476866 +v 2.972216 -7.041584 2.482349 +v 2.978925 -7.031544 2.486669 +v 2.985837 -7.021200 2.489786 +v 2.992885 -7.010652 2.491668 +v 2.995100 -7.011836 2.491668 +v 2.990245 -7.023556 2.489786 +v 2.985484 -7.035050 2.486669 +v 2.980863 -7.046206 2.482349 +v 2.976426 -7.056918 2.476866 +v 2.972216 -7.067081 2.470272 +v 2.968274 -7.076598 2.462632 +v 2.964637 -7.085378 2.454019 +v 2.961341 -7.093335 2.444516 +v 2.958418 -7.100393 2.434215 +v 2.955894 -7.106485 2.423214 +v 2.953796 -7.111551 2.411620 +v 2.952142 -7.115543 2.399545 +v 2.950950 -7.118422 2.387104 +v 2.950230 -7.120161 2.374417 +v 2.949989 -7.120742 2.361608 +v 2.950230 -7.120161 2.348798 +v 2.950950 -7.118422 2.336112 +v 2.952142 -7.115543 2.323670 +v 2.953796 -7.111551 2.311595 +v 2.955894 -7.106485 2.300001 +v 2.977516 -7.113044 2.300001 +v 2.976446 -7.118422 2.311595 +v 2.975603 -7.122660 2.323670 +v 2.974995 -7.125716 2.336112 +v 2.974628 -7.127562 2.348798 +v 2.974505 -7.128179 2.361608 +v 2.974628 -7.127562 2.374417 +v 2.974995 -7.125716 2.387104 +v 2.975603 -7.122660 2.399545 +v 2.976446 -7.118422 2.411620 +v 2.977516 -7.113044 2.423214 +v 2.978802 -7.106577 2.434215 +v 2.980293 -7.099084 2.444516 +v 2.981973 -7.090636 2.454019 +v 2.983827 -7.081316 2.462632 +v 2.985837 -7.071213 2.470272 +v 2.987983 -7.060423 2.476866 +v 2.990245 -7.049052 2.482349 +v 2.992600 -7.037209 2.486669 +v 2.995028 -7.025007 2.489786 +v 2.997503 -7.012564 2.491668 +v 3.000002 -7.012810 2.491668 +v 3.000002 -7.025497 2.489786 +v 3.000002 -7.037938 2.486669 +v 3.000002 -7.050014 2.482349 +v 3.000002 -7.061607 2.476866 +v 3.000002 -7.072608 2.470272 +v 3.000002 -7.082909 2.462632 +v 3.000002 -7.092412 2.454019 +v 3.000002 -7.101025 2.444516 +v 3.000002 -7.108665 2.434215 +v 3.000002 -7.115258 2.423214 +v 3.000002 -7.120742 2.411620 +v 3.000002 -7.125062 2.399545 +v 3.000002 -7.128179 2.387104 +v 3.000002 -7.130061 2.374417 +v 3.000002 -7.130690 2.361608 +v 3.000002 -7.130061 2.348798 +v 3.000002 -7.128179 2.336112 +v 3.000002 -7.125062 2.323670 +v 3.000002 -7.120742 2.311595 +v 3.000002 -7.115258 2.300001 +v 3.022487 -7.113044 2.300001 +v 3.023557 -7.118422 2.311595 +v 3.024400 -7.122660 2.323670 +v 3.025008 -7.125716 2.336112 +v 3.025375 -7.127562 2.348798 +v 3.025498 -7.128179 2.361608 +v 3.025375 -7.127562 2.374417 +v 3.025008 -7.125716 2.387104 +v 3.024400 -7.122660 2.399545 +v 3.023557 -7.118422 2.411620 +v 3.022487 -7.113044 2.423214 +v 3.021201 -7.106577 2.434215 +v 3.019711 -7.099084 2.444516 +v 3.018030 -7.090636 2.454019 +v 3.016176 -7.081316 2.462632 +v 3.014167 -7.071213 2.470272 +v 3.012021 -7.060423 2.476866 +v 3.009759 -7.049052 2.482349 +v 3.007403 -7.037209 2.486669 +v 3.004976 -7.025007 2.489786 +v 3.002501 -7.012564 2.491668 +v 3.004904 -7.011836 2.491668 +v 3.009759 -7.023556 2.489786 +v 3.014519 -7.035050 2.486669 +v 3.019141 -7.046206 2.482349 +v 3.023577 -7.056918 2.476866 +v 3.027787 -7.067081 2.470272 +v 3.031729 -7.076598 2.462632 +v 3.035366 -7.085378 2.454019 +v 3.038662 -7.093335 2.444516 +v 3.041586 -7.100393 2.434215 +v 3.044109 -7.106485 2.423214 +v 3.046207 -7.111551 2.411620 +v 3.047861 -7.115543 2.399545 +v 3.049053 -7.118422 2.387104 +v 3.049773 -7.120161 2.374417 +v 3.050014 -7.120742 2.361608 +v 3.049773 -7.120161 2.348798 +v 3.049053 -7.118422 2.336112 +v 3.047861 -7.115543 2.323670 +v 3.046207 -7.111551 2.311595 +v 3.067082 -7.100393 2.311595 +v 3.069482 -7.103986 2.323670 +v 3.071214 -7.106577 2.336112 +v 3.072259 -7.108141 2.348798 +v 3.072609 -7.108665 2.361608 +v 3.072259 -7.108141 2.374417 +v 3.071214 -7.106577 2.387104 +v 3.069482 -7.103986 2.399545 +v 3.067082 -7.100393 2.411620 +v 3.064035 -7.095834 2.423214 +v 3.060372 -7.090352 2.434215 +v 3.056128 -7.083999 2.444516 +v 3.051343 -7.076838 2.454019 +v 3.046063 -7.068936 2.462632 +v 3.040340 -7.060371 2.470272 +v 3.034228 -7.051225 2.476866 +v 3.027787 -7.041584 2.482349 +v 3.021078 -7.031544 2.486669 +v 3.014167 -7.021200 2.489786 +v 3.007118 -7.010652 2.491668 +v 3.009059 -7.009058 2.491668 +v 3.018030 -7.018029 2.489786 +v 3.026827 -7.026826 2.486669 +v 3.035366 -7.035365 2.482349 +v 3.043564 -7.043563 2.476866 +v 3.051343 -7.051342 2.470272 +v 3.058627 -7.058626 2.462632 +v 3.065346 -7.065345 2.454019 +v 3.071437 -7.071435 2.444516 +v 3.076839 -7.076838 2.434215 +v 3.081501 -7.081500 2.423214 +v 3.085379 -7.085378 2.411620 +v 3.088434 -7.088433 2.399545 +v 3.090637 -7.090636 2.387104 +v 3.091968 -7.091967 2.374417 +v 3.092413 -7.092412 2.361608 +v 3.091968 -7.091967 2.348798 +v 3.090637 -7.090636 2.336112 +v 3.088434 -7.088433 2.323670 +v 3.085379 -7.085378 2.311595 +v 3.100394 -7.067081 2.311595 +v 3.103987 -7.069481 2.323670 +v 3.106578 -7.071213 2.336112 +v 3.108143 -7.072258 2.348798 +v 3.108666 -7.072608 2.361608 +v 3.108143 -7.072258 2.374417 +v 3.106578 -7.071213 2.387104 +v 3.103987 -7.069481 2.399545 +v 3.100394 -7.067081 2.411620 +v 3.095835 -7.064034 2.423214 +v 3.090353 -7.060371 2.434215 +v 3.084000 -7.056127 2.444516 +v 3.076839 -7.051342 2.454019 +v 3.068938 -7.046062 2.462632 +v 3.060372 -7.040339 2.470272 +v 3.051226 -7.034227 2.476866 +v 3.041586 -7.027786 2.482349 +v 3.031545 -7.021077 2.486669 +v 3.021201 -7.014165 2.489786 +v 3.010653 -7.007117 2.491668 +v 3.011836 -7.004903 2.491668 +v 3.023557 -7.009758 2.489786 +v 3.035051 -7.014519 2.486669 +v 3.046207 -7.019140 2.482349 +v 3.056919 -7.023576 2.476866 +v 3.067082 -7.027786 2.470272 +v 3.076599 -7.031728 2.462632 +v 3.085379 -7.035365 2.454019 +v 3.093336 -7.038661 2.444516 +v 3.100394 -7.041584 2.434215 +v 3.106486 -7.044108 2.423214 +v 3.111552 -7.046206 2.411620 +v 3.115544 -7.047860 2.399545 +v 3.118423 -7.049052 2.387104 +v 3.120162 -7.049772 2.374417 +v 3.120743 -7.050013 2.361608 +v 3.120162 -7.049772 2.348798 +v 3.118423 -7.049052 2.336112 +v 3.115544 -7.047860 2.323670 +v 3.111552 -7.046206 2.311595 +v 3.118423 -7.023556 2.311595 +v 3.122661 -7.024399 2.323670 +v 3.125717 -7.025007 2.336112 +v 3.127563 -7.025374 2.348798 +v 3.128180 -7.025497 2.361608 +v 3.127563 -7.025374 2.374417 +v 3.125717 -7.025007 2.387104 +v 3.122660 -7.024399 2.399545 +v 3.118423 -7.023556 2.411620 +v 3.113045 -7.022486 2.423214 +v 3.106578 -7.021200 2.434215 +v 3.099085 -7.019710 2.444516 +v 3.090637 -7.018029 2.454019 +v 3.081317 -7.016175 2.462632 +v 3.071214 -7.014165 2.470272 +v 3.060424 -7.012020 2.476866 +v 3.049053 -7.009758 2.482349 +v 3.037210 -7.007402 2.486669 +v 3.025008 -7.004975 2.489786 +v 3.012565 -7.002500 2.491668 +v 3.012811 -7.000000 2.491668 +v 3.025498 -7.000000 2.489786 +v 3.061608 -7.000000 2.476866 +v 3.072609 -7.000000 2.470272 +v 3.082910 -7.000000 2.462632 +v 3.092413 -7.000000 2.454019 +v 3.101026 -7.000000 2.444516 +v 3.108666 -7.000000 2.434215 +v 3.115259 -7.000000 2.423214 +v 3.120743 -7.000000 2.411620 +v 3.125063 -7.000000 2.399545 +v 3.128180 -7.000000 2.387104 +v 3.130062 -7.000000 2.374417 +v 3.130691 -7.000000 2.361608 +v 3.130062 -7.000000 2.348798 +v 3.128180 -7.000000 2.336112 +v 3.125063 -7.000000 2.323670 +v 3.120743 -7.000000 2.311595 +v 3.209384 -6.686636 1.980807 +v 3.266495 -6.733505 1.980807 +v 3.144227 -6.651808 1.980807 +v 3.073526 -6.630362 1.980807 +v 3.000001 -6.623120 1.980807 +v 2.926475 -6.630361 1.980807 +v 2.855775 -6.651808 1.980807 +v 2.790617 -6.686635 1.980807 +v 2.733506 -6.733505 1.980807 +v 2.686636 -6.790616 1.980807 +v 2.651808 -6.855774 1.980807 +v 2.630360 -6.926474 1.980808 +v 2.623119 -7.000000 1.980808 +v 2.630360 -7.073526 1.980808 +v 2.651807 -7.144227 1.980808 +v 2.686635 -7.209384 1.980808 +v 2.733505 -7.266496 1.980808 +v 2.790616 -7.313366 1.980808 +v 2.855774 -7.348194 1.980808 +v 2.926475 -7.369641 1.980808 +v 3.000001 -7.376883 1.980808 +v 3.073527 -7.369641 1.980808 +v 3.144226 -7.348192 1.980807 +v 3.209383 -7.313365 1.980807 +v 3.266495 -7.266494 1.980807 +v 3.262367 -7.209383 1.980807 +v 3.348192 -7.144226 1.980807 +v 3.369639 -7.073525 1.980807 +v 3.376880 -7.000000 1.980807 +v 3.369639 -6.926474 1.980807 +v 3.348192 -6.855774 1.980807 +v 3.262367 -6.790617 1.980807 +v 3.278045 -6.721955 1.714060 +v 3.326947 -6.781541 1.714060 +v 3.363284 -6.849523 1.714060 +v 3.385660 -6.923287 1.714060 +v 3.393216 -7.000000 1.714060 +v 3.385660 -7.076713 1.714060 +v 3.363284 -7.150477 1.714060 +v 3.326947 -7.218459 1.714060 +v 3.278045 -7.278046 1.714060 +v 3.218459 -7.326947 1.714060 +v 3.150477 -7.363284 1.714060 +v 3.076713 -7.385661 1.714061 +v 3.000000 -7.393217 1.714061 +v 2.923287 -7.385661 1.714061 +v 2.849523 -7.363285 1.714061 +v 2.781541 -7.326948 1.714061 +v 2.721954 -7.278046 1.714061 +v 2.673053 -7.218460 1.714061 +v 2.636715 -7.150477 1.714061 +v 2.614339 -7.076713 1.714061 +v 2.606784 -7.000000 1.714061 +v 2.614339 -6.923287 1.714061 +v 2.636716 -6.849523 1.714060 +v 2.673053 -6.781541 1.714060 +v 2.721955 -6.721954 1.714060 +v 2.781542 -6.673053 1.714060 +v 2.849523 -6.636716 1.714060 +v 2.923288 -6.614340 1.714060 +v 3.000000 -6.606784 1.714060 +v 3.076713 -6.614340 1.714060 +v 3.150478 -6.636716 1.714060 +v 3.218459 -6.673054 1.714060 +v 3.205112 -6.794888 2.169626 +v 3.241186 -6.838845 2.169626 +v 3.267991 -6.888994 2.169626 +v 3.284498 -6.943409 2.169626 +v 3.290071 -7.000000 2.169626 +v 3.284498 -7.056590 2.169626 +v 3.267991 -7.111005 2.169626 +v 3.241186 -7.161154 2.169626 +v 3.205112 -7.205111 2.169626 +v 3.161155 -7.241185 2.169626 +v 3.111006 -7.267991 2.169626 +v 3.056592 -7.284501 2.169627 +v 3.000002 -7.290075 2.169627 +v 2.943411 -7.284501 2.169627 +v 2.888995 -7.267994 2.169627 +v 2.838845 -7.241189 2.169627 +v 2.794888 -7.205114 2.169627 +v 2.758813 -7.161157 2.169627 +v 2.732008 -7.111007 2.169627 +v 2.715501 -7.056591 2.169627 +v 2.709927 -7.000000 2.169627 +v 2.715501 -6.943409 2.169627 +v 2.732010 -6.888994 2.169626 +v 2.758815 -6.838844 2.169626 +v 2.794889 -6.794888 2.169626 +v 2.838846 -6.758814 2.169626 +v 2.888995 -6.732008 2.169626 +v 2.943411 -6.715502 2.169626 +v 3.000001 -6.709929 2.169626 +v 3.056591 -6.715502 2.169626 +v 3.111006 -6.732009 2.169626 +v 3.161155 -6.758814 2.169626 +v 3.124862 -6.813131 2.254295 +v 3.158919 -6.841081 2.254295 +v 3.086007 -6.792362 2.254295 +v 3.043846 -6.779573 2.254295 +v 3.000001 -6.775254 2.254295 +v 2.956155 -6.779572 2.254295 +v 2.913994 -6.792362 2.254295 +v 2.875139 -6.813130 2.254295 +v 2.841082 -6.841081 2.254295 +v 2.813132 -6.875137 2.254295 +v 2.792363 -6.913993 2.254295 +v 2.779571 -6.956153 2.254296 +v 2.775253 -7.000000 2.254296 +v 2.779571 -7.043847 2.254296 +v 2.792361 -7.086008 2.254296 +v 2.813130 -7.124864 2.254296 +v 2.841080 -7.158922 2.254296 +v 2.875138 -7.186872 2.254296 +v 2.913994 -7.207642 2.254296 +v 2.956156 -7.220431 2.254296 +v 3.000002 -7.224750 2.254296 +v 3.043849 -7.220431 2.254296 +v 3.086006 -7.207637 2.254295 +v 3.124862 -7.186868 2.254295 +v 3.158919 -7.158918 2.254295 +v 3.186869 -7.124861 2.254295 +v 3.207638 -7.086006 2.254295 +v 3.220427 -7.043845 2.254295 +v 3.224745 -7.000000 2.254295 +v 3.220427 -6.956154 2.254295 +v 3.207638 -6.913993 2.254295 +v 3.186869 -6.875138 2.254295 +v 3.600000 -6.400000 0.016596 +v 3.471418 -6.294476 0.016596 +v 3.324719 -6.216063 0.016596 +v 3.165541 -6.167777 0.016596 +v 3.000001 -6.151472 0.016596 +v 2.834462 -6.167776 0.016596 +v 2.675283 -6.216062 0.016596 +v 2.528584 -6.294474 0.016596 +v 2.400001 -6.399999 0.016596 +v 2.294475 -6.528582 0.016596 +v 2.216063 -6.675282 0.016596 +v 2.167776 -6.834459 0.016596 +v 2.151472 -6.999999 0.016596 +v 2.167776 -7.165539 0.016596 +v 2.216062 -7.324717 0.016596 +v 2.294474 -7.471416 0.016596 +v 2.400000 -7.599999 0.016596 +v 2.528583 -7.705525 0.016596 +v 2.675282 -7.783937 0.016596 +v 2.834460 -7.832224 0.016596 +v 3.000000 -7.848528 0.016596 +v 3.165540 -7.832224 0.016596 +v 3.324718 -7.783938 0.016596 +v 3.471417 -7.705525 0.016596 +v 3.600000 -7.600000 0.016596 +v 3.705525 -7.471417 0.016596 +v 3.783938 -7.324718 0.016596 +v 3.832224 -7.165540 0.016596 +v 3.848528 -7.000000 0.016596 +v 3.832224 -6.834460 0.016596 +v 3.783938 -6.675282 0.016596 +v 3.705525 -6.528583 0.016596 +v 3.600000 -6.400000 0.088361 +v 3.705525 -6.528583 0.088361 +v 3.783938 -6.675282 0.088361 +v 3.832224 -6.834460 0.088361 +v 3.848528 -7.000000 0.088361 +v 3.832224 -7.165540 0.088361 +v 3.783938 -7.324718 0.088361 +v 3.705525 -7.471417 0.088361 +v 3.600000 -7.600000 0.088361 +v 3.471417 -7.705525 0.088361 +v 3.324718 -7.783938 0.088361 +v 3.165540 -7.832224 0.088361 +v 3.000000 -7.848528 0.088361 +v 2.834460 -7.832224 0.088361 +v 2.675282 -7.783937 0.088361 +v 2.528583 -7.705525 0.088361 +v 2.400000 -7.599999 0.088361 +v 2.294474 -7.471416 0.088361 +v 2.216062 -7.324717 0.088361 +v 2.167776 -7.165539 0.088361 +v 2.151472 -6.999999 0.088361 +v 2.167776 -6.834459 0.088361 +v 2.216063 -6.675282 0.088361 +v 2.294475 -6.528582 0.088361 +v 2.400001 -6.399999 0.088361 +v 2.528584 -6.294474 0.088361 +v 2.675283 -6.216062 0.088361 +v 2.834462 -6.167776 0.088361 +v 3.000001 -6.151472 0.088361 +v 3.165541 -6.167777 0.088361 +v 3.324719 -6.216063 0.088361 +v 3.471418 -6.294476 0.088361 +v 3.231044 -6.768956 2.098873 +v 3.271678 -6.818470 2.098873 +v 3.301873 -6.874960 2.098873 +v 3.320467 -6.936255 2.098873 +v 3.326745 -7.000000 2.098873 +v 3.320467 -7.063745 2.098873 +v 3.301873 -7.125040 2.098873 +v 3.271678 -7.181530 2.098873 +v 3.231044 -7.231043 2.098873 +v 3.181530 -7.271678 2.098873 +v 3.125040 -7.301873 2.098873 +v 3.063746 -7.320469 2.098874 +v 3.000001 -7.326748 2.098874 +v 2.936256 -7.320469 2.098874 +v 2.874960 -7.301876 2.098874 +v 2.818470 -7.271681 2.098874 +v 2.768956 -7.231046 2.098874 +v 2.728321 -7.181531 2.098874 +v 2.698126 -7.125041 2.098874 +v 2.679532 -7.063745 2.098874 +v 2.673254 -7.000000 2.098874 +v 2.679532 -6.936255 2.098874 +v 2.698128 -6.874959 2.098873 +v 2.728322 -6.818470 2.098873 +v 2.768957 -6.768956 2.098873 +v 2.818471 -6.728321 2.098873 +v 2.874961 -6.698127 2.098873 +v 2.936256 -6.679533 2.098873 +v 3.000001 -6.673255 2.098873 +v 3.063745 -6.679533 2.098873 +v 3.125041 -6.698127 2.098873 +v 3.181530 -6.728322 2.098873 +v 3.285447 -6.714553 1.837693 +v 3.335650 -6.775726 1.837693 +v 3.372955 -6.845517 1.837693 +v 3.344929 -6.921245 1.837693 +v 3.403683 -7.000000 1.837693 +v 3.344929 -7.078754 1.837693 +v 3.372955 -7.154483 1.837693 +v 3.335650 -7.224274 1.837693 +v 3.285447 -7.285447 1.837693 +v 3.224274 -7.335650 1.837693 +v 3.154483 -7.372954 1.837693 +v 3.078755 -7.395928 1.837693 +v 3.000000 -7.403685 1.837693 +v 2.921246 -7.395928 1.837693 +v 2.845517 -7.372956 1.837693 +v 2.775725 -7.335651 1.837693 +v 2.714552 -7.285448 1.837693 +v 2.664349 -7.224275 1.837693 +v 2.627045 -7.154483 1.837693 +v 2.604073 -7.078755 1.837693 +v 2.596316 -7.000000 1.837693 +v 2.604073 -6.921245 1.837693 +v 2.627046 -6.845517 1.837693 +v 2.664350 -6.775725 1.837693 +v 2.714553 -6.714552 1.837693 +v 2.775726 -6.664350 1.837693 +v 2.845518 -6.627045 1.837693 +v 2.921246 -6.604074 1.837693 +v 3.000001 -6.596317 1.837693 +v 3.078755 -6.604074 1.837693 +v 3.154484 -6.627046 1.837693 +v 3.224275 -6.664350 1.837693 +v 3.223631 -6.665314 1.893943 +v 3.284628 -6.715373 1.893943 +v 3.154040 -6.628116 1.893943 +v 3.078529 -6.605210 1.893943 +v 3.000001 -6.597476 1.893943 +v 2.921472 -6.605210 1.893943 +v 2.845961 -6.628116 1.893943 +v 2.776370 -6.665313 1.893943 +v 2.715373 -6.715372 1.893943 +v 2.665314 -6.776369 1.893943 +v 2.628116 -6.845960 1.893943 +v 2.605209 -6.921471 1.893943 +v 2.597475 -7.000000 1.893943 +v 2.605209 -7.078529 1.893943 +v 2.628115 -7.154040 1.893943 +v 2.665313 -7.223631 1.893943 +v 2.715372 -7.284629 1.893943 +v 2.776369 -7.334688 1.893943 +v 2.845961 -7.371886 1.893943 +v 2.921472 -7.394792 1.893943 +v 3.000001 -7.402526 1.893943 +v 3.078530 -7.394792 1.893943 +v 3.154039 -7.371884 1.893943 +v 3.223630 -7.334686 1.893943 +v 3.284628 -7.284627 1.893943 +v 3.334687 -7.223630 1.893943 +v 3.320886 -7.154039 1.893943 +v 3.394790 -7.078528 1.893943 +v 3.402524 -7.000000 1.893943 +v 3.394790 -6.921471 1.893943 +v 3.320886 -6.845961 1.893943 +v 3.334687 -6.776370 1.893943 +v 3.195457 -6.707479 2.056539 +v 3.248769 -6.751231 2.056539 +v 3.134634 -6.674968 2.056539 +v 3.068636 -6.654947 2.056539 +v 3.000001 -6.648187 2.056539 +v 2.931365 -6.654947 2.056539 +v 2.865368 -6.674967 2.056539 +v 2.804544 -6.707478 2.056539 +v 2.751231 -6.751231 2.056539 +v 2.707479 -6.804543 2.056539 +v 2.674968 -6.865366 2.056539 +v 2.654946 -6.931364 2.056540 +v 2.648186 -7.000000 2.056540 +v 2.654946 -7.068636 2.056540 +v 2.674966 -7.134634 2.056540 +v 2.707478 -7.195458 2.056540 +v 2.751230 -7.248771 2.056540 +v 2.804543 -7.292523 2.056540 +v 2.865367 -7.325035 2.056540 +v 2.931365 -7.345055 2.056540 +v 3.000001 -7.351815 2.056540 +v 3.068637 -7.345055 2.056540 +v 3.134633 -7.325032 2.056539 +v 3.195457 -7.292521 2.056539 +v 3.248769 -7.248769 2.056539 +v 3.292521 -7.195457 2.056539 +v 3.325032 -7.134633 2.056539 +v 3.345053 -7.068635 2.056539 +v 3.351813 -7.000000 2.056539 +v 3.345053 -6.931365 2.056539 +v 3.325032 -6.865367 2.056539 +v 3.292521 -6.804543 2.056539 +v 3.166701 -6.750515 1.512500 +v 3.212169 -6.787831 1.512500 +v 3.114826 -6.722788 1.512500 +v 3.058538 -6.705713 1.512500 +v 3.000000 -6.699947 1.512500 +v 2.941463 -6.705713 1.512500 +v 2.885175 -6.722787 1.512500 +v 2.833300 -6.750515 1.512500 +v 2.787831 -6.787830 1.512500 +v 2.750515 -6.833300 1.512500 +v 2.722787 -6.885175 1.512500 +v 2.705713 -6.941463 1.512500 +v 2.699947 -7.000000 1.512500 +v 2.705712 -7.058537 1.512500 +v 2.722787 -7.114825 1.512500 +v 2.750515 -7.166700 1.512500 +v 2.787830 -7.212170 1.512500 +v 2.833299 -7.249485 1.512500 +v 2.885175 -7.277213 1.512500 +v 2.941463 -7.294288 1.512500 +v 3.000000 -7.300053 1.512500 +v 3.058537 -7.294288 1.512500 +v 3.114825 -7.277213 1.512500 +v 3.166700 -7.249485 1.512500 +v 3.212169 -7.212170 1.512500 +v 3.249485 -7.166700 1.512500 +v 3.277213 -7.114825 1.512500 +v 3.294287 -7.058537 1.512500 +v 3.300053 -7.000000 1.512500 +v 3.294287 -6.941463 1.512500 +v 3.277213 -6.885175 1.512500 +v 3.249485 -6.833300 1.512500 +v 3.288443 -6.711557 1.775877 +v 3.339173 -6.773372 1.775877 +v 3.376869 -6.843896 1.775877 +v 3.400082 -6.920419 1.775877 +v 3.356922 -7.000000 1.775877 +v 3.400082 -7.079581 1.775877 +v 3.376869 -7.156105 1.775877 +v 3.339173 -7.226628 1.775877 +v 3.288443 -7.288443 1.775877 +v 3.226628 -7.339173 1.775877 +v 3.156104 -7.376869 1.775877 +v 3.079582 -7.400084 1.775877 +v 3.000000 -7.407922 1.775877 +v 2.920419 -7.400084 1.775877 +v 2.843895 -7.376871 1.775877 +v 2.773371 -7.339174 1.775877 +v 2.711556 -7.288444 1.775877 +v 2.660826 -7.226629 1.775877 +v 2.623130 -7.156105 1.775877 +v 2.599917 -7.079581 1.775877 +v 2.592079 -7.000000 1.775877 +v 2.599917 -6.920418 1.775877 +v 2.623131 -6.843895 1.775877 +v 2.660827 -6.773371 1.775877 +v 2.711557 -6.711556 1.775877 +v 2.773372 -6.660826 1.775877 +v 2.843896 -6.623130 1.775877 +v 2.920419 -6.599917 1.775877 +v 3.000001 -6.592080 1.775877 +v 3.079582 -6.599918 1.775877 +v 3.156105 -6.623131 1.775877 +v 3.226629 -6.660827 1.775877 +v 3.250918 -6.749082 1.613280 +v 3.295049 -6.802855 1.613280 +v 3.327841 -6.864204 1.613280 +v 3.348034 -6.930772 1.613280 +v 3.354852 -7.000000 1.613280 +v 3.348034 -7.069228 1.613280 +v 3.327841 -7.135796 1.613280 +v 3.295049 -7.197145 1.613280 +v 3.250918 -7.250919 1.613280 +v 3.197145 -7.295049 1.613280 +v 3.135796 -7.327841 1.613280 +v 3.069228 -7.348035 1.613280 +v 3.000000 -7.354853 1.613280 +v 2.930772 -7.348035 1.613280 +v 2.864204 -7.327842 1.613280 +v 2.802854 -7.295050 1.613280 +v 2.749081 -7.250919 1.613280 +v 2.704951 -7.197146 1.613280 +v 2.672159 -7.135796 1.613280 +v 2.651966 -7.069228 1.613280 +v 2.645147 -7.000000 1.613280 +v 2.651966 -6.930771 1.613280 +v 2.672159 -6.864203 1.613280 +v 2.704951 -6.802855 1.613280 +v 2.749082 -6.749081 1.613280 +v 2.802855 -6.704951 1.613280 +v 2.864204 -6.672159 1.613280 +v 2.930772 -6.651966 1.613280 +v 3.000000 -6.645148 1.613280 +v 3.069229 -6.651966 1.613280 +v 3.135797 -6.672160 1.613280 +v 3.197146 -6.704951 1.613280 +v 3.209958 -6.685777 1.663670 +v 3.267225 -6.732775 1.663670 +v 3.144622 -6.650854 1.663670 +v 3.073728 -6.629348 1.663670 +v 3.000000 -6.622087 1.663670 +v 2.926273 -6.629348 1.663670 +v 2.855379 -6.650853 1.663670 +v 2.790043 -6.685776 1.663670 +v 2.732775 -6.732775 1.663670 +v 2.685777 -6.790042 1.663670 +v 2.650854 -6.855379 1.663670 +v 2.629348 -6.926272 1.663670 +v 2.622086 -7.000000 1.663670 +v 2.629348 -7.073727 1.663670 +v 2.650853 -7.144621 1.663670 +v 2.685776 -7.209958 1.663670 +v 2.732774 -7.267226 1.663670 +v 2.790042 -7.314224 1.663670 +v 2.855379 -7.349147 1.663670 +v 2.926273 -7.370653 1.663670 +v 3.000000 -7.377914 1.663670 +v 3.073728 -7.370653 1.663670 +v 3.144621 -7.349147 1.663670 +v 3.209957 -7.314224 1.663670 +v 3.267225 -7.267225 1.663670 +v 3.314224 -7.209958 1.663670 +v 3.349146 -7.144621 1.663670 +v 3.370652 -7.073727 1.663670 +v 3.377913 -7.000000 1.663670 +v 3.370652 -6.926273 1.663670 +v 3.349146 -6.855379 1.663670 +v 3.314224 -6.790043 1.663670 +v 3.180250 -6.730238 1.562890 +v 3.229414 -6.770586 1.562890 +v 3.124158 -6.700257 1.562890 +v 3.063296 -6.681794 1.562890 +v 3.000000 -6.675560 1.562890 +v 2.936705 -6.681794 1.562890 +v 2.875843 -6.700256 1.562890 +v 2.819751 -6.730238 1.562890 +v 2.770586 -6.770586 1.562890 +v 2.730238 -6.819751 1.562890 +v 2.700257 -6.875842 1.562890 +v 2.681794 -6.936705 1.562890 +v 2.675560 -7.000000 1.562890 +v 2.681794 -7.063295 1.562890 +v 2.700256 -7.124158 1.562890 +v 2.730238 -7.180249 1.562890 +v 2.770586 -7.229414 1.562890 +v 2.819751 -7.269763 1.562890 +v 2.875842 -7.299744 1.562890 +v 2.936705 -7.318206 1.562890 +v 3.000000 -7.324440 1.562890 +v 3.063295 -7.318206 1.562890 +v 3.124158 -7.299744 1.562890 +v 3.180249 -7.269762 1.562890 +v 3.229414 -7.229414 1.562890 +v 3.269762 -7.180249 1.562890 +v 3.299743 -7.124158 1.562890 +v 3.318206 -7.063295 1.562890 +v 3.324440 -7.000000 1.562890 +v 3.318206 -6.936705 1.562890 +v 3.299743 -6.875842 1.562890 +v 3.269762 -6.819751 1.562890 +v 3.408971 -6.591029 1.456250 +v 3.480899 -6.678673 1.456250 +v 3.534347 -6.778666 1.456250 +v 3.567259 -6.887165 1.456250 +v 3.578373 -7.000000 1.456250 +v 3.567259 -7.112835 1.456250 +v 3.534347 -7.221334 1.456250 +v 3.480899 -7.321327 1.456250 +v 3.408971 -7.408971 1.456250 +v 3.321327 -7.480899 1.456250 +v 3.221334 -7.534347 1.456250 +v 3.112835 -7.567260 1.456250 +v 3.000000 -7.578373 1.456250 +v 2.887165 -7.567260 1.456250 +v 2.778666 -7.534347 1.456250 +v 2.678673 -7.480899 1.456250 +v 2.591028 -7.408971 1.456250 +v 2.519100 -7.321326 1.456250 +v 2.465653 -7.221334 1.456250 +v 2.432740 -7.112834 1.456250 +v 2.421627 -7.000000 1.456250 +v 2.432741 -6.887165 1.456250 +v 2.465654 -6.778666 1.456250 +v 2.519101 -6.678673 1.456250 +v 2.591029 -6.591028 1.456250 +v 2.678674 -6.519100 1.456250 +v 2.778667 -6.465653 1.456250 +v 2.887166 -6.432741 1.456250 +v 3.000001 -6.421628 1.456250 +v 3.112836 -6.432741 1.456250 +v 3.221334 -6.465654 1.456250 +v 3.321327 -6.519101 1.456250 +v 3.408228 -6.591773 1.428125 +v 3.480025 -6.679258 1.428125 +v 3.533375 -6.779069 1.428125 +v 3.566228 -6.887370 1.428125 +v 3.577321 -7.000000 1.428125 +v 3.566228 -7.112630 1.428125 +v 3.533375 -7.220931 1.428125 +v 3.480025 -7.320743 1.428125 +v 3.408228 -7.408227 1.428125 +v 3.320742 -7.480025 1.428125 +v 3.220931 -7.533375 1.428125 +v 3.112630 -7.566228 1.428125 +v 3.000000 -7.577321 1.428125 +v 2.887370 -7.566228 1.428125 +v 2.779068 -7.533375 1.428125 +v 2.679257 -7.480025 1.428125 +v 2.591772 -7.408227 1.428125 +v 2.519975 -7.320742 1.428125 +v 2.466625 -7.220931 1.428125 +v 2.433772 -7.112629 1.428125 +v 2.422679 -7.000000 1.428125 +v 2.433772 -6.887370 1.428125 +v 2.466625 -6.779068 1.428125 +v 2.519975 -6.679257 1.428125 +v 2.591773 -6.591772 1.428125 +v 2.679258 -6.519975 1.428125 +v 2.779069 -6.466624 1.428125 +v 2.887371 -6.433772 1.428125 +v 3.000001 -6.422679 1.428125 +v 3.112631 -6.433772 1.428125 +v 3.220932 -6.466625 1.428125 +v 3.320743 -6.519976 1.428125 +v 3.215980 -6.676764 0.900000 +v 3.274890 -6.725110 0.900000 +v 3.148770 -6.640839 0.900000 +v 3.075843 -6.618717 0.900000 +v 3.000001 -6.611247 0.900000 +v 2.924159 -6.618716 0.900000 +v 2.851231 -6.640839 0.900000 +v 2.784021 -6.676763 0.900000 +v 2.725110 -6.725110 0.900000 +v 2.676764 -6.784020 0.900000 +v 2.640839 -6.851230 0.900000 +v 2.618717 -6.924158 0.900000 +v 2.611247 -7.000000 0.900000 +v 2.618716 -7.075841 0.900000 +v 2.640839 -7.148769 0.900000 +v 2.676764 -7.215980 0.900000 +v 2.725110 -7.274890 0.900000 +v 2.784020 -7.323236 0.900000 +v 2.851230 -7.359161 0.900000 +v 2.924158 -7.381283 0.900000 +v 3.000000 -7.388753 0.900000 +v 3.075842 -7.381283 0.900000 +v 3.148769 -7.359161 0.900000 +v 3.215980 -7.323236 0.900000 +v 3.274890 -7.274890 0.900000 +v 3.323236 -7.215980 0.900000 +v 3.359161 -7.148769 0.900000 +v 3.381283 -7.075842 0.900000 +v 3.388753 -7.000000 0.900000 +v 3.381283 -6.924158 0.900000 +v 3.359161 -6.851231 0.900000 +v 3.323236 -6.784020 0.900000 +v 3.250635 -6.749365 1.150000 +v 3.294716 -6.803077 1.150000 +v 3.327470 -6.864357 1.150000 +v 3.347641 -6.930850 1.150000 +v 3.354451 -7.000000 1.150000 +v 3.347641 -7.069150 1.150000 +v 3.327471 -7.135643 1.150000 +v 3.294716 -7.196923 1.150000 +v 3.250635 -7.250635 1.150000 +v 3.196923 -7.294715 1.150000 +v 3.135643 -7.327470 1.150000 +v 3.069150 -7.347641 1.150000 +v 3.000000 -7.354451 1.150000 +v 2.930850 -7.347641 1.150000 +v 2.864357 -7.327470 1.150000 +v 2.803077 -7.294715 1.150000 +v 2.749365 -7.250635 1.150000 +v 2.705284 -7.196922 1.150000 +v 2.672529 -7.135643 1.150000 +v 2.652359 -7.069150 1.150000 +v 2.645549 -7.000000 1.150000 +v 2.652359 -6.930850 1.150000 +v 2.672530 -6.864357 1.150000 +v 2.705285 -6.803077 1.150000 +v 2.749365 -6.749365 1.150000 +v 2.803078 -6.705284 1.150000 +v 2.864358 -6.672529 1.150000 +v 2.930851 -6.652359 1.150000 +v 3.000000 -6.645549 1.150000 +v 3.069151 -6.652359 1.150000 +v 3.135643 -6.672530 1.150000 +v 3.196923 -6.705285 1.150000 +v 3.187395 -6.719545 1.275000 +v 3.238508 -6.761493 1.275000 +v 3.129080 -6.688375 1.275000 +v 3.065805 -6.669181 1.275000 +v 3.000000 -6.662700 1.275000 +v 2.934196 -6.669180 1.275000 +v 2.870921 -6.688375 1.275000 +v 2.812606 -6.719544 1.275000 +v 2.761493 -6.761492 1.275000 +v 2.719545 -6.812605 1.275000 +v 2.688375 -6.870920 1.275000 +v 2.669181 -6.934196 1.275000 +v 2.662699 -7.000000 1.275000 +v 2.669180 -7.065804 1.275000 +v 2.688375 -7.129079 1.275000 +v 2.719545 -7.187394 1.275000 +v 2.761492 -7.238507 1.275000 +v 2.812606 -7.280455 1.275000 +v 2.870921 -7.311625 1.275000 +v 2.934196 -7.330819 1.275000 +v 3.000000 -7.337300 1.275000 +v 3.065804 -7.330820 1.275000 +v 3.129079 -7.311625 1.275000 +v 3.187394 -7.280455 1.275000 +v 3.238508 -7.238507 1.275000 +v 3.280455 -7.187394 1.275000 +v 3.311625 -7.129079 1.275000 +v 3.330819 -7.065804 1.275000 +v 3.337301 -7.000000 1.275000 +v 3.330819 -6.934196 1.275000 +v 3.311625 -6.870921 1.275000 +v 3.280455 -6.812606 1.275000 +usemtl Material +s 1 +f 64 1059 1090 33 +f 31 1029 1028 32 +f 30 1030 1029 31 +f 30 29 1031 1030 +f 28 1032 1031 29 +f 27 1033 1032 28 +f 26 1034 1033 27 +f 26 25 1035 1034 +f 24 1036 1035 25 +f 24 23 1037 1036 +f 22 1038 1037 23 +f 21 1039 1038 22 +f 20 1040 1039 21 +f 20 19 1041 1040 +f 18 1042 1041 19 +f 18 17 1043 1042 +f 16 1044 1043 17 +f 16 15 1045 1044 +f 14 1046 1045 15 +f 14 13 1047 1046 +f 12 1048 1047 13 +f 11 1049 1048 12 +f 10 1050 1049 11 +f 10 9 1051 1050 +f 9 8 1052 1051 +f 7 1053 1052 8 +f 7 6 1054 1053 +f 5 1055 1054 6 +f 5 4 1056 1055 +f 3 1057 1056 4 +f 3 2 1058 1057 +f 2 1 1027 1058 +f 63 64 65 66 +f 62 63 66 67 +f 62 67 68 61 +f 60 61 68 69 +f 60 69 70 59 +f 58 59 70 71 +f 58 71 72 57 +f 56 57 72 73 +f 55 56 73 74 +f 55 74 75 54 +f 54 75 76 53 +f 53 76 77 52 +f 51 52 77 78 +f 51 78 79 50 +f 49 50 79 80 +f 49 80 81 48 +f 47 48 81 82 +f 47 82 83 46 +f 45 46 83 84 +f 45 84 85 44 +f 44 85 86 43 +f 43 86 87 42 +f 41 42 87 88 +f 41 88 89 40 +f 39 40 89 90 +f 39 90 91 38 +f 38 91 92 37 +f 37 92 93 36 +f 35 36 93 94 +f 35 94 95 34 +f 34 95 96 33 +f 33 96 65 64 +f 96 97 128 65 +f 95 98 97 96 +f 94 99 98 95 +f 94 93 100 99 +f 92 101 100 93 +f 91 102 101 92 +f 90 103 102 91 +f 90 89 104 103 +f 88 105 104 89 +f 88 87 106 105 +f 86 107 106 87 +f 85 108 107 86 +f 84 109 108 85 +f 84 83 110 109 +f 82 111 110 83 +f 82 81 112 111 +f 80 113 112 81 +f 80 79 114 113 +f 78 115 114 79 +f 78 77 116 115 +f 76 117 116 77 +f 75 118 117 76 +f 74 119 118 75 +f 74 73 120 119 +f 73 72 121 120 +f 71 122 121 72 +f 71 70 123 122 +f 69 124 123 70 +f 69 68 125 124 +f 67 126 125 68 +f 67 66 127 126 +f 66 65 128 127 +f 127 128 129 130 +f 126 127 130 131 +f 126 131 132 125 +f 124 125 132 133 +f 124 133 134 123 +f 122 123 134 135 +f 122 135 136 121 +f 120 121 136 137 +f 119 120 137 138 +f 119 138 139 118 +f 118 139 140 117 +f 117 140 141 116 +f 115 116 141 142 +f 115 142 143 114 +f 113 114 143 144 +f 113 144 145 112 +f 111 112 145 146 +f 111 146 147 110 +f 109 110 147 148 +f 109 148 149 108 +f 108 149 150 107 +f 107 150 151 106 +f 105 106 151 152 +f 105 152 153 104 +f 103 104 153 154 +f 103 154 155 102 +f 102 155 156 101 +f 101 156 157 100 +f 99 100 157 158 +f 99 158 159 98 +f 98 159 160 97 +f 97 160 129 128 +f 160 1443 1444 129 +f 159 1445 1443 160 +f 158 1446 1445 159 +f 158 157 1447 1446 +f 156 1448 1447 157 +f 155 1449 1448 156 +f 154 1450 1449 155 +f 154 153 1451 1450 +f 152 1452 1451 153 +f 152 151 1453 1452 +f 150 1454 1453 151 +f 149 1455 1454 150 +f 148 1456 1455 149 +f 148 147 1457 1456 +f 146 1458 1457 147 +f 146 145 1459 1458 +f 144 1460 1459 145 +f 144 143 1461 1460 +f 142 1462 1461 143 +f 142 141 1463 1462 +f 140 1464 1463 141 +f 139 1465 1464 140 +f 138 1466 1465 139 +f 138 137 1467 1466 +f 137 136 1468 1467 +f 135 1469 1468 136 +f 135 134 1470 1469 +f 133 1471 1470 134 +f 133 132 1472 1471 +f 131 1473 1472 132 +f 131 130 1474 1473 +f 130 129 1444 1474 +f 191 192 193 194 +f 190 191 194 195 +f 190 195 196 189 +f 188 189 196 197 +f 188 197 198 187 +f 186 187 198 199 +f 186 199 200 185 +f 184 185 200 201 +f 183 184 201 202 +f 183 202 203 182 +f 182 203 204 181 +f 181 204 205 180 +f 179 180 205 206 +f 179 206 207 178 +f 177 178 207 208 +f 177 208 209 176 +f 175 176 209 210 +f 175 210 211 174 +f 173 174 211 212 +f 173 212 213 172 +f 172 213 214 171 +f 171 214 215 170 +f 169 170 215 216 +f 169 216 217 168 +f 167 168 217 218 +f 167 218 219 166 +f 166 219 220 165 +f 165 220 221 164 +f 163 164 221 222 +f 163 222 223 162 +f 162 223 224 161 +f 161 224 193 192 +f 224 1442 1411 193 +f 223 1441 1442 224 +f 222 1440 1441 223 +f 222 221 1439 1440 +f 220 1438 1439 221 +f 219 1437 1438 220 +f 218 1436 1437 219 +f 218 217 1435 1436 +f 216 1434 1435 217 +f 216 215 1433 1434 +f 214 1432 1433 215 +f 213 1431 1432 214 +f 212 1430 1431 213 +f 212 211 1429 1430 +f 210 1428 1429 211 +f 210 209 1427 1428 +f 208 1426 1427 209 +f 208 207 1425 1426 +f 206 1424 1425 207 +f 206 205 1423 1424 +f 204 1422 1423 205 +f 203 1421 1422 204 +f 202 1420 1421 203 +f 202 201 1419 1420 +f 201 200 1418 1419 +f 199 1417 1418 200 +f 199 198 1416 1417 +f 197 1415 1416 198 +f 197 196 1414 1415 +f 195 1413 1414 196 +f 195 194 1412 1413 +f 194 193 1411 1412 +f 1 2 246 +f 2 3 246 +f 4 246 3 +f 4 5 246 +f 6 246 5 +f 6 7 246 +f 8 246 7 +f 8 9 246 +f 9 10 246 +f 11 246 10 +f 12 246 11 +f 13 246 12 +f 13 14 246 +f 15 246 14 +f 15 16 246 +f 17 246 16 +f 17 18 246 +f 19 246 18 +f 19 20 246 +f 21 246 20 +f 22 246 21 +f 23 246 22 +f 23 24 246 +f 25 246 24 +f 25 26 246 +f 27 246 26 +f 28 246 27 +f 29 246 28 +f 29 30 246 +f 31 246 30 +f 32 246 31 +f 1 246 32 +f 241 242 249 898 +f 898 249 250 897 +f 897 250 251 896 +f 896 251 252 895 +f 895 252 253 894 +f 894 253 254 893 +f 893 254 255 892 +f 892 255 256 891 +f 891 256 257 890 +f 890 257 258 889 +f 889 258 259 888 +f 888 259 260 887 +f 887 260 261 886 +f 886 261 262 885 +f 885 262 263 884 +f 884 263 264 883 +f 883 264 265 248 +f 248 265 266 247 +f 247 266 267 882 +f 882 267 268 881 +f 881 268 592 +f 268 269 592 +f 267 270 269 268 +f 266 271 270 267 +f 265 272 271 266 +f 264 273 272 265 +f 263 274 273 264 +f 262 275 274 263 +f 261 276 275 262 +f 260 277 276 261 +f 259 278 277 260 +f 258 279 278 259 +f 257 280 279 258 +f 256 281 280 257 +f 255 282 281 256 +f 254 283 282 255 +f 253 284 283 254 +f 252 285 284 253 +f 251 286 285 252 +f 250 287 286 251 +f 249 288 287 250 +f 242 243 288 249 +f 243 244 289 288 +f 288 289 290 287 +f 287 290 291 286 +f 286 291 292 285 +f 285 292 293 284 +f 284 293 294 283 +f 283 294 295 282 +f 282 295 296 281 +f 281 296 297 280 +f 280 297 298 279 +f 279 298 299 278 +f 278 299 300 277 +f 277 300 301 276 +f 276 301 302 275 +f 275 302 303 274 +f 274 303 304 273 +f 273 304 305 272 +f 272 305 306 271 +f 271 306 307 270 +f 270 307 308 269 +f 269 308 592 +f 308 309 592 +f 307 310 309 308 +f 306 311 310 307 +f 305 312 311 306 +f 304 313 312 305 +f 303 314 313 304 +f 302 315 314 303 +f 301 316 315 302 +f 300 317 316 301 +f 299 318 317 300 +f 298 319 318 299 +f 297 320 319 298 +f 296 321 320 297 +f 295 322 321 296 +f 294 323 322 295 +f 293 324 323 294 +f 292 325 324 293 +f 291 326 325 292 +f 290 327 326 291 +f 289 328 327 290 +f 244 245 328 289 +f 245 225 329 328 +f 328 329 330 327 +f 327 330 331 326 +f 326 331 332 325 +f 325 332 333 324 +f 324 333 334 323 +f 323 334 335 322 +f 322 335 336 321 +f 321 336 337 320 +f 320 337 338 319 +f 319 338 339 318 +f 318 339 340 317 +f 317 340 341 316 +f 316 341 342 315 +f 315 342 343 314 +f 314 343 344 313 +f 313 344 345 312 +f 312 345 346 311 +f 311 346 347 310 +f 310 347 348 309 +f 309 348 592 +f 348 349 592 +f 347 350 349 348 +f 346 351 350 347 +f 345 352 351 346 +f 344 353 352 345 +f 343 354 353 344 +f 342 355 354 343 +f 341 356 355 342 +f 340 357 356 341 +f 339 358 357 340 +f 338 359 358 339 +f 337 360 359 338 +f 336 361 360 337 +f 335 362 361 336 +f 334 363 362 335 +f 333 364 363 334 +f 332 365 364 333 +f 331 366 365 332 +f 330 367 366 331 +f 329 368 367 330 +f 225 226 368 329 +f 226 227 369 368 +f 368 369 370 367 +f 367 370 371 366 +f 366 371 372 365 +f 365 372 373 364 +f 364 373 374 363 +f 363 374 375 362 +f 362 375 376 361 +f 361 376 377 360 +f 360 377 378 359 +f 359 378 379 358 +f 358 379 380 357 +f 357 380 381 356 +f 356 381 382 355 +f 355 382 383 354 +f 354 383 384 353 +f 353 384 385 352 +f 352 385 386 351 +f 351 386 387 350 +f 350 387 388 349 +f 349 388 592 +f 388 389 592 +f 387 390 389 388 +f 386 391 390 387 +f 385 392 391 386 +f 384 393 392 385 +f 383 394 393 384 +f 382 395 394 383 +f 381 396 395 382 +f 380 397 396 381 +f 379 398 397 380 +f 378 399 398 379 +f 377 400 399 378 +f 376 401 400 377 +f 375 402 401 376 +f 374 403 402 375 +f 373 404 403 374 +f 372 405 404 373 +f 371 406 405 372 +f 370 407 406 371 +f 369 408 407 370 +f 227 228 408 369 +f 228 229 409 408 +f 408 409 410 407 +f 407 410 411 406 +f 406 411 412 405 +f 405 412 413 404 +f 404 413 414 403 +f 403 414 415 402 +f 402 415 416 401 +f 401 416 417 400 +f 400 417 418 399 +f 399 418 419 398 +f 398 419 420 397 +f 397 420 421 396 +f 396 421 422 395 +f 395 422 423 394 +f 394 423 424 393 +f 393 424 425 392 +f 392 425 426 391 +f 391 426 427 390 +f 390 427 428 389 +f 389 428 592 +f 428 429 592 +f 427 430 429 428 +f 426 431 430 427 +f 425 432 431 426 +f 424 433 432 425 +f 423 434 433 424 +f 422 435 434 423 +f 421 436 435 422 +f 420 437 436 421 +f 419 438 437 420 +f 418 439 438 419 +f 417 440 439 418 +f 416 441 440 417 +f 415 442 441 416 +f 414 443 442 415 +f 413 444 443 414 +f 412 445 444 413 +f 411 446 445 412 +f 410 447 446 411 +f 409 448 447 410 +f 229 230 448 409 +f 230 231 449 448 +f 448 449 450 447 +f 447 450 451 446 +f 446 451 452 445 +f 445 452 453 444 +f 444 453 454 443 +f 443 454 455 442 +f 442 455 456 441 +f 441 456 457 440 +f 440 457 458 439 +f 439 458 459 438 +f 438 459 460 437 +f 437 460 461 436 +f 436 461 462 435 +f 435 462 463 434 +f 434 463 464 433 +f 433 464 465 432 +f 432 465 466 431 +f 431 466 467 430 +f 430 467 468 429 +f 429 468 592 +f 468 469 592 +f 467 470 469 468 +f 466 471 470 467 +f 465 472 471 466 +f 464 473 472 465 +f 463 474 473 464 +f 462 475 474 463 +f 461 476 475 462 +f 460 477 476 461 +f 459 478 477 460 +f 458 479 478 459 +f 457 480 479 458 +f 456 481 480 457 +f 455 482 481 456 +f 454 483 482 455 +f 453 484 483 454 +f 452 485 484 453 +f 451 486 485 452 +f 450 487 486 451 +f 449 488 487 450 +f 231 232 488 449 +f 232 233 489 488 +f 488 489 490 487 +f 487 490 491 486 +f 486 491 492 485 +f 485 492 493 484 +f 484 493 494 483 +f 483 494 495 482 +f 482 495 496 481 +f 481 496 497 480 +f 480 497 498 479 +f 479 498 499 478 +f 478 499 500 477 +f 477 500 501 476 +f 476 501 502 475 +f 475 502 503 474 +f 474 503 504 473 +f 473 504 505 472 +f 472 505 506 471 +f 471 506 507 470 +f 470 507 508 469 +f 469 508 592 +f 508 509 592 +f 507 510 509 508 +f 506 511 510 507 +f 505 512 511 506 +f 504 513 512 505 +f 503 514 513 504 +f 502 515 514 503 +f 501 516 515 502 +f 500 517 516 501 +f 499 518 517 500 +f 498 519 518 499 +f 497 520 519 498 +f 496 521 520 497 +f 495 522 521 496 +f 494 523 522 495 +f 493 524 523 494 +f 492 525 524 493 +f 491 526 525 492 +f 490 527 526 491 +f 489 528 527 490 +f 233 234 528 489 +f 234 529 530 528 +f 528 530 531 527 +f 527 531 532 526 +f 526 532 533 525 +f 525 533 534 524 +f 524 534 535 523 +f 523 535 536 522 +f 522 536 537 521 +f 521 537 538 520 +f 520 538 539 519 +f 519 539 540 518 +f 518 540 541 517 +f 517 541 542 516 +f 516 542 543 515 +f 515 543 544 514 +f 514 544 545 513 +f 513 545 546 512 +f 512 546 547 511 +f 511 547 548 510 +f 510 548 549 509 +f 509 549 592 +f 549 550 592 +f 548 551 550 549 +f 547 552 551 548 +f 546 553 552 547 +f 545 554 553 546 +f 544 555 554 545 +f 543 556 555 544 +f 542 557 556 543 +f 541 558 557 542 +f 540 559 558 541 +f 539 560 559 540 +f 538 561 560 539 +f 537 562 561 538 +f 536 563 562 537 +f 535 564 563 536 +f 534 565 564 535 +f 533 566 565 534 +f 532 567 566 533 +f 531 568 567 532 +f 530 569 568 531 +f 529 570 569 530 +f 570 571 572 569 +f 569 572 573 568 +f 568 573 574 567 +f 567 574 575 566 +f 566 575 576 565 +f 565 576 577 564 +f 564 577 578 563 +f 563 578 579 562 +f 562 579 580 561 +f 561 580 581 560 +f 560 581 582 559 +f 559 582 583 558 +f 558 583 584 557 +f 557 584 585 556 +f 556 585 586 555 +f 555 586 587 554 +f 554 587 588 553 +f 553 588 589 552 +f 552 589 590 551 +f 551 590 591 550 +f 550 591 592 +f 591 593 592 +f 590 594 593 591 +f 589 595 594 590 +f 588 596 595 589 +f 587 597 596 588 +f 586 598 597 587 +f 585 599 598 586 +f 584 600 599 585 +f 583 601 600 584 +f 582 602 601 583 +f 581 603 602 582 +f 580 604 603 581 +f 579 605 604 580 +f 578 606 605 579 +f 577 607 606 578 +f 576 608 607 577 +f 575 609 608 576 +f 574 610 609 575 +f 573 611 610 574 +f 572 612 611 573 +f 571 613 612 572 +f 613 614 615 612 +f 612 615 616 611 +f 611 616 617 610 +f 610 617 618 609 +f 609 618 619 608 +f 608 619 620 607 +f 607 620 621 606 +f 606 621 622 605 +f 605 622 623 604 +f 604 623 624 603 +f 603 624 625 602 +f 602 625 626 601 +f 601 626 627 600 +f 600 627 628 599 +f 599 628 629 598 +f 598 629 630 597 +f 597 630 631 596 +f 596 631 632 595 +f 595 632 633 594 +f 594 633 634 593 +f 593 634 592 +f 634 635 592 +f 633 636 635 634 +f 632 637 636 633 +f 631 638 637 632 +f 630 639 638 631 +f 629 640 639 630 +f 628 641 640 629 +f 627 642 641 628 +f 626 643 642 627 +f 625 644 643 626 +f 624 645 644 625 +f 623 646 645 624 +f 622 647 646 623 +f 621 648 647 622 +f 620 649 648 621 +f 619 650 649 620 +f 618 651 650 619 +f 617 652 651 618 +f 616 653 652 617 +f 615 654 653 616 +f 614 655 654 615 +f 655 656 657 654 +f 654 657 658 653 +f 653 658 659 652 +f 652 659 660 651 +f 651 660 661 650 +f 650 661 662 649 +f 649 662 663 648 +f 648 663 664 647 +f 647 664 665 646 +f 646 665 666 645 +f 645 666 667 644 +f 644 667 668 643 +f 643 668 669 642 +f 642 669 670 641 +f 641 670 671 640 +f 640 671 672 639 +f 639 672 673 638 +f 638 673 674 637 +f 637 674 675 636 +f 636 675 676 635 +f 635 676 592 +f 676 677 592 +f 675 678 677 676 +f 674 679 678 675 +f 673 680 679 674 +f 672 681 680 673 +f 671 682 681 672 +f 670 683 682 671 +f 669 684 683 670 +f 668 685 684 669 +f 667 686 685 668 +f 666 687 686 667 +f 665 688 687 666 +f 664 689 688 665 +f 663 690 689 664 +f 662 691 690 663 +f 661 692 691 662 +f 660 693 692 661 +f 659 694 693 660 +f 658 695 694 659 +f 657 696 695 658 +f 656 697 696 657 +f 697 698 699 696 +f 696 699 700 695 +f 695 700 701 694 +f 694 701 702 693 +f 693 702 703 692 +f 692 703 704 691 +f 691 704 705 690 +f 690 705 706 689 +f 689 706 707 688 +f 688 707 708 687 +f 687 708 709 686 +f 686 709 710 685 +f 685 710 711 684 +f 684 711 712 683 +f 683 712 713 682 +f 682 713 714 681 +f 681 714 715 680 +f 680 715 716 679 +f 679 716 717 678 +f 678 717 718 677 +f 677 718 592 +f 718 719 592 +f 717 720 719 718 +f 716 721 720 717 +f 715 722 721 716 +f 714 723 722 715 +f 713 724 723 714 +f 712 725 724 713 +f 711 726 725 712 +f 710 727 726 711 +f 709 728 727 710 +f 708 729 728 709 +f 707 730 729 708 +f 706 731 730 707 +f 705 732 731 706 +f 704 733 732 705 +f 703 734 733 704 +f 702 735 734 703 +f 701 736 735 702 +f 700 737 736 701 +f 699 738 737 700 +f 698 739 738 699 +f 739 740 741 738 +f 738 741 742 737 +f 737 742 743 736 +f 736 743 744 735 +f 735 744 745 734 +f 734 745 746 733 +f 733 746 747 732 +f 732 747 748 731 +f 731 748 749 730 +f 730 749 750 729 +f 729 750 751 728 +f 728 751 752 727 +f 727 752 753 726 +f 726 753 754 725 +f 725 754 755 724 +f 724 755 756 723 +f 723 756 757 722 +f 722 757 758 721 +f 721 758 759 720 +f 720 759 760 719 +f 719 760 592 +f 760 761 592 +f 759 762 761 760 +f 758 763 762 759 +f 757 764 763 758 +f 756 765 764 757 +f 755 766 765 756 +f 754 767 766 755 +f 753 768 767 754 +f 752 769 768 753 +f 751 770 769 752 +f 750 771 770 751 +f 749 772 771 750 +f 748 773 772 749 +f 747 774 773 748 +f 746 775 774 747 +f 745 776 775 746 +f 744 777 776 745 +f 743 778 777 744 +f 742 779 778 743 +f 741 780 779 742 +f 740 235 780 741 +f 235 236 781 780 +f 780 781 782 779 +f 779 782 783 778 +f 778 783 784 777 +f 777 784 785 776 +f 776 785 786 775 +f 775 786 787 774 +f 774 787 788 773 +f 773 788 789 772 +f 772 789 790 771 +f 771 790 791 770 +f 770 791 792 769 +f 769 792 793 768 +f 768 793 794 767 +f 767 794 795 766 +f 766 795 796 765 +f 765 796 797 764 +f 764 797 798 763 +f 763 798 799 762 +f 762 799 800 761 +f 761 800 592 +f 800 801 592 +f 799 802 801 800 +f 798 803 802 799 +f 797 804 803 798 +f 796 805 804 797 +f 795 806 805 796 +f 794 807 806 795 +f 793 808 807 794 +f 792 809 808 793 +f 791 810 809 792 +f 790 811 810 791 +f 789 812 811 790 +f 788 813 812 789 +f 787 814 813 788 +f 786 815 814 787 +f 785 816 815 786 +f 784 817 816 785 +f 783 818 817 784 +f 782 819 818 783 +f 781 820 819 782 +f 236 237 820 781 +f 237 238 821 820 +f 820 821 822 819 +f 819 822 823 818 +f 818 823 824 817 +f 817 824 825 816 +f 816 825 826 815 +f 815 826 827 814 +f 814 827 828 813 +f 813 828 829 812 +f 812 829 830 811 +f 811 830 831 810 +f 810 831 832 809 +f 809 832 833 808 +f 808 833 834 807 +f 807 834 835 806 +f 806 835 836 805 +f 805 836 837 804 +f 804 837 838 803 +f 803 838 839 802 +f 802 839 840 801 +f 801 840 592 +f 840 841 592 +f 839 842 841 840 +f 838 843 842 839 +f 837 844 843 838 +f 836 845 844 837 +f 835 846 845 836 +f 834 847 846 835 +f 833 848 847 834 +f 832 849 848 833 +f 831 850 849 832 +f 830 851 850 831 +f 829 852 851 830 +f 828 853 852 829 +f 827 854 853 828 +f 826 855 854 827 +f 825 856 855 826 +f 824 857 856 825 +f 823 858 857 824 +f 822 859 858 823 +f 821 860 859 822 +f 238 239 860 821 +f 239 240 861 860 +f 860 861 862 859 +f 859 862 863 858 +f 858 863 864 857 +f 857 864 865 856 +f 856 865 866 855 +f 855 866 867 854 +f 854 867 868 853 +f 853 868 869 852 +f 852 869 870 851 +f 851 870 871 850 +f 850 871 872 849 +f 849 872 873 848 +f 848 873 874 847 +f 847 874 875 846 +f 846 875 876 845 +f 845 876 877 844 +f 844 877 878 843 +f 843 878 879 842 +f 842 879 880 841 +f 841 880 592 +f 880 881 592 +f 879 882 881 880 +f 878 247 882 879 +f 877 248 247 878 +f 876 883 248 877 +f 875 884 883 876 +f 874 885 884 875 +f 873 886 885 874 +f 872 887 886 873 +f 871 888 887 872 +f 870 889 888 871 +f 869 890 889 870 +f 868 891 890 869 +f 867 892 891 868 +f 866 893 892 867 +f 865 894 893 866 +f 864 895 894 865 +f 863 896 895 864 +f 862 897 896 863 +f 861 898 897 862 +f 240 241 898 861 +f 900 1188 1218 930 +f 930 1218 1217 929 +f 929 1217 1216 928 +f 928 1216 1215 927 +f 927 1215 1214 926 +f 926 1214 1213 925 +f 925 1213 1212 924 +f 924 1212 1211 923 +f 923 1211 1210 922 +f 922 1210 1209 921 +f 921 1209 1208 920 +f 920 1208 1207 919 +f 919 1207 1206 918 +f 918 1206 1205 917 +f 917 1205 1204 916 +f 916 1204 1203 915 +f 915 1203 1202 914 +f 914 1202 1201 913 +f 913 1201 1200 912 +f 912 1200 1199 911 +f 911 1199 1198 910 +f 910 1198 1197 909 +f 909 1197 1196 908 +f 908 1196 1195 907 +f 907 1195 1194 906 +f 906 1194 1193 905 +f 905 1193 1192 904 +f 904 1192 1191 903 +f 903 1191 1190 902 +f 902 1190 1189 901 +f 901 1189 1187 899 +f 899 1187 1188 900 +f 931 1251 1252 932 +f 932 1252 1253 933 +f 933 1253 1254 934 +f 934 1254 1255 935 +f 935 1255 1256 936 +f 936 1256 1257 937 +f 937 1257 1258 938 +f 938 1258 1259 939 +f 939 1259 1260 940 +f 940 1260 1261 941 +f 941 1261 1262 942 +f 942 1262 1263 943 +f 943 1263 1264 944 +f 944 1264 1265 945 +f 945 1265 1266 946 +f 946 1266 1267 947 +f 947 1267 1268 948 +f 948 1268 1269 949 +f 949 1269 1270 950 +f 950 1270 1271 951 +f 951 1271 1272 952 +f 952 1272 1273 953 +f 953 1273 1274 954 +f 954 1274 1275 955 +f 955 1275 1276 956 +f 956 1276 1277 957 +f 957 1277 1278 958 +f 958 1278 1279 959 +f 959 1279 1280 960 +f 960 1280 1281 961 +f 961 1281 1282 962 +f 962 1282 1251 931 +f 994 995 996 963 +f 993 997 995 994 +f 992 998 997 993 +f 991 999 998 992 +f 990 1000 999 991 +f 989 1001 1000 990 +f 988 1002 1001 989 +f 987 1003 1002 988 +f 986 1004 1003 987 +f 985 1005 1004 986 +f 984 1006 1005 985 +f 983 1007 1006 984 +f 982 1008 1007 983 +f 981 1009 1008 982 +f 980 1010 1009 981 +f 979 1011 1010 980 +f 978 1012 1011 979 +f 977 1013 1012 978 +f 976 1014 1013 977 +f 975 1015 1014 976 +f 974 1016 1015 975 +f 973 1017 1016 974 +f 972 1018 1017 973 +f 971 1019 1018 972 +f 970 1020 1019 971 +f 969 1021 1020 970 +f 968 1022 1021 969 +f 967 1023 1022 968 +f 966 1024 1023 967 +f 965 1025 1024 966 +f 964 1026 1025 965 +f 963 996 1026 964 +f 996 245 244 1026 +f 1026 244 243 1025 +f 1025 243 242 1024 +f 1024 242 241 1023 +f 1023 241 240 1022 +f 1022 240 239 1021 +f 1021 239 238 1020 +f 1020 238 237 1019 +f 1019 237 236 1018 +f 1018 236 235 1017 +f 1017 235 740 1016 +f 1016 740 739 1015 +f 1015 739 698 1014 +f 1014 698 697 1013 +f 1013 697 656 1012 +f 1012 656 655 1011 +f 1011 655 614 1010 +f 1010 614 613 1009 +f 1009 613 571 1008 +f 1008 571 570 1007 +f 1007 570 529 1006 +f 1006 529 234 1005 +f 1005 234 233 1004 +f 1004 233 232 1003 +f 1003 232 231 1002 +f 1002 231 230 1001 +f 1001 230 229 1000 +f 1000 229 228 999 +f 999 228 227 998 +f 998 227 226 997 +f 997 226 225 995 +f 995 225 245 996 +f 1027 1059 1060 1058 +f 1058 1060 1061 1057 +f 1057 1061 1062 1056 +f 1056 1062 1063 1055 +f 1055 1063 1064 1054 +f 1054 1064 1065 1053 +f 1053 1065 1066 1052 +f 1052 1066 1067 1051 +f 1051 1067 1068 1050 +f 1050 1068 1069 1049 +f 1049 1069 1070 1048 +f 1048 1070 1071 1047 +f 1047 1071 1072 1046 +f 1046 1072 1073 1045 +f 1045 1073 1074 1044 +f 1044 1074 1075 1043 +f 1043 1075 1076 1042 +f 1042 1076 1077 1041 +f 1041 1077 1078 1040 +f 1040 1078 1079 1039 +f 1039 1079 1080 1038 +f 1038 1080 1081 1037 +f 1037 1081 1082 1036 +f 1036 1082 1083 1035 +f 1035 1083 1084 1034 +f 1034 1084 1085 1033 +f 1033 1085 1086 1032 +f 1032 1086 1087 1031 +f 1031 1087 1088 1030 +f 1030 1088 1089 1029 +f 1029 1089 1090 1028 +f 1027 1 32 1028 +f 1089 34 33 1090 +f 1088 35 34 1089 +f 1087 36 35 1088 +f 1086 37 36 1087 +f 1085 38 37 1086 +f 1084 39 38 1085 +f 1083 40 39 1084 +f 1082 41 40 1083 +f 1081 42 41 1082 +f 1080 43 42 1081 +f 1079 44 43 1080 +f 1078 45 44 1079 +f 1077 46 45 1078 +f 1076 47 46 1077 +f 1075 48 47 1076 +f 1074 49 48 1075 +f 1073 50 49 1074 +f 1072 51 50 1073 +f 1071 52 51 1072 +f 1070 53 52 1071 +f 1069 54 53 1070 +f 1068 55 54 1069 +f 1067 56 55 1068 +f 1066 57 56 1067 +f 1065 58 57 1066 +f 1064 59 58 1065 +f 1063 60 59 1064 +f 1062 61 60 1063 +f 1061 62 61 1062 +f 1060 63 62 1061 +f 1059 64 63 1060 +f 1059 1027 1028 1090 +f 1154 1155 1156 1123 +f 1153 1157 1155 1154 +f 1152 1158 1157 1153 +f 1151 1159 1158 1152 +f 1150 1160 1159 1151 +f 1149 1161 1160 1150 +f 1148 1162 1161 1149 +f 1147 1163 1162 1148 +f 1146 1164 1163 1147 +f 1145 1165 1164 1146 +f 1144 1166 1165 1145 +f 1143 1167 1166 1144 +f 1142 1168 1167 1143 +f 1141 1169 1168 1142 +f 1140 1170 1169 1141 +f 1139 1171 1170 1140 +f 1138 1172 1171 1139 +f 1137 1173 1172 1138 +f 1136 1174 1173 1137 +f 1135 1175 1174 1136 +f 1134 1176 1175 1135 +f 1133 1177 1176 1134 +f 1132 1178 1177 1133 +f 1131 1179 1178 1132 +f 1130 1180 1179 1131 +f 1129 1181 1180 1130 +f 1128 1182 1181 1129 +f 1127 1183 1182 1128 +f 1126 1184 1183 1127 +f 1125 1185 1184 1126 +f 1124 1186 1185 1125 +f 1123 1156 1186 1124 +f 1122 994 963 1091 +f 1121 993 994 1122 +f 1120 992 993 1121 +f 1119 991 992 1120 +f 1118 990 991 1119 +f 1117 989 990 1118 +f 1116 988 989 1117 +f 1115 987 988 1116 +f 1114 986 987 1115 +f 1113 985 986 1114 +f 1112 984 985 1113 +f 1111 983 984 1112 +f 1110 982 983 1111 +f 1109 981 982 1110 +f 1108 980 981 1109 +f 1107 979 980 1108 +f 1106 978 979 1107 +f 1105 977 978 1106 +f 1104 976 977 1105 +f 1103 975 976 1104 +f 1102 974 975 1103 +f 1101 973 974 1102 +f 1100 972 973 1101 +f 1099 971 972 1100 +f 1098 970 971 1099 +f 1097 969 970 1098 +f 1096 968 969 1097 +f 1095 967 968 1096 +f 1094 966 967 1095 +f 1093 965 966 1094 +f 1092 964 965 1093 +f 1091 963 964 1092 +f 1156 900 930 1186 +f 1186 930 929 1185 +f 1185 929 928 1184 +f 1184 928 927 1183 +f 1183 927 926 1182 +f 1182 926 925 1181 +f 1181 925 924 1180 +f 1180 924 923 1179 +f 1179 923 922 1178 +f 1178 922 921 1177 +f 1177 921 920 1176 +f 1176 920 919 1175 +f 1175 919 918 1174 +f 1174 918 917 1173 +f 1173 917 916 1172 +f 1172 916 915 1171 +f 1171 915 914 1170 +f 1170 914 913 1169 +f 1169 913 912 1168 +f 1168 912 911 1167 +f 1167 911 910 1166 +f 1166 910 909 1165 +f 1165 909 908 1164 +f 1164 908 907 1163 +f 1163 907 906 1162 +f 1162 906 905 1161 +f 1161 905 904 1160 +f 1160 904 903 1159 +f 1159 903 902 1158 +f 1158 902 901 1157 +f 1157 901 899 1155 +f 1155 899 900 1156 +f 1187 1122 1091 1188 +f 1189 1121 1122 1187 +f 1190 1120 1121 1189 +f 1191 1119 1120 1190 +f 1192 1118 1119 1191 +f 1193 1117 1118 1192 +f 1194 1116 1117 1193 +f 1195 1115 1116 1194 +f 1196 1114 1115 1195 +f 1197 1113 1114 1196 +f 1198 1112 1113 1197 +f 1199 1111 1112 1198 +f 1200 1110 1111 1199 +f 1201 1109 1110 1200 +f 1202 1108 1109 1201 +f 1203 1107 1108 1202 +f 1204 1106 1107 1203 +f 1205 1105 1106 1204 +f 1206 1104 1105 1205 +f 1207 1103 1104 1206 +f 1208 1102 1103 1207 +f 1209 1101 1102 1208 +f 1210 1100 1101 1209 +f 1211 1099 1100 1210 +f 1212 1098 1099 1211 +f 1213 1097 1098 1212 +f 1214 1096 1097 1213 +f 1215 1095 1096 1214 +f 1216 1094 1095 1215 +f 1217 1093 1094 1216 +f 1218 1092 1093 1217 +f 1188 1091 1092 1218 +f 1220 1348 1378 1250 +f 1250 1378 1377 1249 +f 1249 1377 1376 1248 +f 1248 1376 1375 1247 +f 1247 1375 1374 1246 +f 1246 1374 1373 1245 +f 1245 1373 1372 1244 +f 1244 1372 1371 1243 +f 1243 1371 1370 1242 +f 1242 1370 1369 1241 +f 1241 1369 1368 1240 +f 1240 1368 1367 1239 +f 1239 1367 1366 1238 +f 1238 1366 1365 1237 +f 1237 1365 1364 1236 +f 1236 1364 1363 1235 +f 1235 1363 1362 1234 +f 1234 1362 1361 1233 +f 1233 1361 1360 1232 +f 1232 1360 1359 1231 +f 1231 1359 1358 1230 +f 1230 1358 1357 1229 +f 1229 1357 1356 1228 +f 1228 1356 1355 1227 +f 1227 1355 1354 1226 +f 1226 1354 1353 1225 +f 1225 1353 1352 1224 +f 1224 1352 1351 1223 +f 1223 1351 1350 1222 +f 1222 1350 1349 1221 +f 1221 1349 1347 1219 +f 1219 1347 1348 1220 +f 1282 1154 1123 1251 +f 1281 1153 1154 1282 +f 1280 1152 1153 1281 +f 1279 1151 1152 1280 +f 1278 1150 1151 1279 +f 1277 1149 1150 1278 +f 1276 1148 1149 1277 +f 1275 1147 1148 1276 +f 1274 1146 1147 1275 +f 1273 1145 1146 1274 +f 1272 1144 1145 1273 +f 1271 1143 1144 1272 +f 1270 1142 1143 1271 +f 1269 1141 1142 1270 +f 1268 1140 1141 1269 +f 1267 1139 1140 1268 +f 1266 1138 1139 1267 +f 1265 1137 1138 1266 +f 1264 1136 1137 1265 +f 1263 1135 1136 1264 +f 1262 1134 1135 1263 +f 1261 1133 1134 1262 +f 1260 1132 1133 1261 +f 1259 1131 1132 1260 +f 1258 1130 1131 1259 +f 1257 1129 1130 1258 +f 1256 1128 1129 1257 +f 1255 1127 1128 1256 +f 1254 1126 1127 1255 +f 1253 1125 1126 1254 +f 1252 1124 1125 1253 +f 1251 1123 1124 1252 +f 1314 1315 1316 1283 +f 1313 1317 1315 1314 +f 1312 1318 1317 1313 +f 1311 1319 1318 1312 +f 1310 1320 1319 1311 +f 1309 1321 1320 1310 +f 1308 1322 1321 1309 +f 1307 1323 1322 1308 +f 1306 1324 1323 1307 +f 1305 1325 1324 1306 +f 1304 1326 1325 1305 +f 1303 1327 1326 1304 +f 1302 1328 1327 1303 +f 1301 1329 1328 1302 +f 1300 1330 1329 1301 +f 1299 1331 1330 1300 +f 1298 1332 1331 1299 +f 1297 1333 1332 1298 +f 1296 1334 1333 1297 +f 1295 1335 1334 1296 +f 1294 1336 1335 1295 +f 1293 1337 1336 1294 +f 1292 1338 1337 1293 +f 1291 1339 1338 1292 +f 1290 1340 1339 1291 +f 1289 1341 1340 1290 +f 1288 1342 1341 1289 +f 1287 1343 1342 1288 +f 1286 1344 1343 1287 +f 1285 1345 1344 1286 +f 1284 1346 1345 1285 +f 1283 1316 1346 1284 +f 1316 931 932 1346 +f 1346 932 933 1345 +f 1345 933 934 1344 +f 1344 934 935 1343 +f 1343 935 936 1342 +f 1342 936 937 1341 +f 1341 937 938 1340 +f 1340 938 939 1339 +f 1339 939 940 1338 +f 1338 940 941 1337 +f 1337 941 942 1336 +f 1336 942 943 1335 +f 1335 943 944 1334 +f 1334 944 945 1333 +f 1333 945 946 1332 +f 1332 946 947 1331 +f 1331 947 948 1330 +f 1330 948 949 1329 +f 1329 949 950 1328 +f 1328 950 951 1327 +f 1327 951 952 1326 +f 1326 952 953 1325 +f 1325 953 954 1324 +f 1324 954 955 1323 +f 1323 955 956 1322 +f 1322 956 957 1321 +f 1321 957 958 1320 +f 1320 958 959 1319 +f 1319 959 960 1318 +f 1318 960 961 1317 +f 1317 961 962 1315 +f 1315 962 931 1316 +f 1347 1314 1283 1348 +f 1349 1313 1314 1347 +f 1350 1312 1313 1349 +f 1351 1311 1312 1350 +f 1352 1310 1311 1351 +f 1353 1309 1310 1352 +f 1354 1308 1309 1353 +f 1355 1307 1308 1354 +f 1356 1306 1307 1355 +f 1357 1305 1306 1356 +f 1358 1304 1305 1357 +f 1359 1303 1304 1358 +f 1360 1302 1303 1359 +f 1361 1301 1302 1360 +f 1362 1300 1301 1361 +f 1363 1299 1300 1362 +f 1364 1298 1299 1363 +f 1365 1297 1298 1364 +f 1366 1296 1297 1365 +f 1367 1295 1296 1366 +f 1368 1294 1295 1367 +f 1369 1293 1294 1368 +f 1370 1292 1293 1369 +f 1371 1291 1292 1370 +f 1372 1290 1291 1371 +f 1373 1289 1290 1372 +f 1374 1288 1289 1373 +f 1375 1287 1288 1374 +f 1376 1286 1287 1375 +f 1377 1285 1286 1376 +f 1378 1284 1285 1377 +f 1348 1283 1284 1378 +f 1379 1220 1250 1380 +f 1380 1250 1249 1381 +f 1381 1249 1248 1382 +f 1382 1248 1247 1383 +f 1383 1247 1246 1384 +f 1384 1246 1245 1385 +f 1385 1245 1244 1386 +f 1386 1244 1243 1387 +f 1387 1243 1242 1388 +f 1388 1242 1241 1389 +f 1389 1241 1240 1390 +f 1390 1240 1239 1391 +f 1391 1239 1238 1392 +f 1392 1238 1237 1393 +f 1393 1237 1236 1394 +f 1394 1236 1235 1395 +f 1395 1235 1234 1396 +f 1396 1234 1233 1397 +f 1397 1233 1232 1398 +f 1398 1232 1231 1399 +f 1399 1231 1230 1400 +f 1400 1230 1229 1401 +f 1401 1229 1228 1402 +f 1402 1228 1227 1403 +f 1403 1227 1226 1404 +f 1404 1226 1225 1405 +f 1405 1225 1224 1406 +f 1406 1224 1223 1407 +f 1407 1223 1222 1408 +f 1408 1222 1221 1409 +f 1409 1221 1219 1410 +f 1410 1219 1220 1379 +f 1411 1379 1380 1412 +f 1412 1380 1381 1413 +f 1413 1381 1382 1414 +f 1414 1382 1383 1415 +f 1415 1383 1384 1416 +f 1416 1384 1385 1417 +f 1417 1385 1386 1418 +f 1418 1386 1387 1419 +f 1419 1387 1388 1420 +f 1420 1388 1389 1421 +f 1421 1389 1390 1422 +f 1422 1390 1391 1423 +f 1423 1391 1392 1424 +f 1424 1392 1393 1425 +f 1425 1393 1394 1426 +f 1426 1394 1395 1427 +f 1427 1395 1396 1428 +f 1428 1396 1397 1429 +f 1429 1397 1398 1430 +f 1430 1398 1399 1431 +f 1431 1399 1400 1432 +f 1432 1400 1401 1433 +f 1433 1401 1402 1434 +f 1434 1402 1403 1435 +f 1435 1403 1404 1436 +f 1436 1404 1405 1437 +f 1437 1405 1406 1438 +f 1438 1406 1407 1439 +f 1439 1407 1408 1440 +f 1440 1408 1409 1441 +f 1441 1409 1410 1442 +f 1442 1410 1379 1411 +f 1444 1475 1476 1474 +f 1474 1476 1477 1473 +f 1473 1477 1478 1472 +f 1472 1478 1479 1471 +f 1471 1479 1480 1470 +f 1470 1480 1481 1469 +f 1469 1481 1482 1468 +f 1468 1482 1483 1467 +f 1467 1483 1484 1466 +f 1466 1484 1485 1465 +f 1465 1485 1486 1464 +f 1464 1486 1487 1463 +f 1463 1487 1488 1462 +f 1462 1488 1489 1461 +f 1461 1489 1490 1460 +f 1460 1490 1491 1459 +f 1459 1491 1492 1458 +f 1458 1492 1493 1457 +f 1457 1493 1494 1456 +f 1456 1494 1495 1455 +f 1455 1495 1496 1454 +f 1454 1496 1497 1453 +f 1453 1497 1498 1452 +f 1452 1498 1499 1451 +f 1451 1499 1500 1450 +f 1450 1500 1501 1449 +f 1449 1501 1502 1448 +f 1448 1502 1503 1447 +f 1447 1503 1504 1446 +f 1446 1504 1505 1445 +f 1445 1505 1506 1443 +f 1443 1506 1475 1444 +f 1506 1507 1508 1475 +f 1505 1509 1507 1506 +f 1504 1510 1509 1505 +f 1503 1511 1510 1504 +f 1502 1512 1511 1503 +f 1501 1513 1512 1502 +f 1500 1514 1513 1501 +f 1499 1515 1514 1500 +f 1498 1516 1515 1499 +f 1497 1517 1516 1498 +f 1496 1518 1517 1497 +f 1495 1519 1518 1496 +f 1494 1520 1519 1495 +f 1493 1521 1520 1494 +f 1492 1522 1521 1493 +f 1491 1523 1522 1492 +f 1490 1524 1523 1491 +f 1489 1525 1524 1490 +f 1488 1526 1525 1489 +f 1487 1527 1526 1488 +f 1486 1528 1527 1487 +f 1485 1529 1528 1486 +f 1484 1530 1529 1485 +f 1483 1531 1530 1484 +f 1482 1532 1531 1483 +f 1481 1533 1532 1482 +f 1480 1534 1533 1481 +f 1479 1535 1534 1480 +f 1478 1536 1535 1479 +f 1477 1537 1536 1478 +f 1476 1538 1537 1477 +f 1475 1508 1538 1476 +f 1508 192 191 1538 +f 1538 191 190 1537 +f 1537 190 189 1536 +f 1536 189 188 1535 +f 1535 188 187 1534 +f 1534 187 186 1533 +f 1533 186 185 1532 +f 1532 185 184 1531 +f 1531 184 183 1530 +f 1530 183 182 1529 +f 1529 182 181 1528 +f 1528 181 180 1527 +f 1527 180 179 1526 +f 1526 179 178 1525 +f 1525 178 177 1524 +f 1524 177 176 1523 +f 1523 176 175 1522 +f 1522 175 174 1521 +f 1521 174 173 1520 +f 1520 173 172 1519 +f 1519 172 171 1518 +f 1518 171 170 1517 +f 1517 170 169 1516 +f 1516 169 168 1515 +f 1515 168 167 1514 +f 1514 167 166 1513 +f 1513 166 165 1512 +f 1512 165 164 1511 +f 1511 164 163 1510 +f 1510 163 162 1509 +f 1509 162 161 1507 +f 1507 161 192 1508 diff --git a/Graph3D/Chess3D/board.obj b/Graph3D/Chess3D/board.obj new file mode 100644 index 0000000..a56b3bd --- /dev/null +++ b/Graph3D/Chess3D/board.obj @@ -0,0 +1,164 @@ +# Blender3D v245 OBJ File: chess2.blend +# www.blender3d.org +v -6.000000 6.000000 0.000000 +v -8.000000 6.000000 0.000000 +v -8.000001 8.000000 0.000000 +v -6.000000 7.999999 0.000000 +v -6.000000 3.999999 0.000000 +v -8.000000 3.999999 0.000000 +v -8.000000 1.999999 0.000000 +v -6.000000 2.000000 0.000000 +v -6.000000 -2.000000 0.000000 +v -8.000000 -2.000001 0.000000 +v -8.000000 -0.000001 0.000000 +v -6.000000 -0.000001 0.000000 +v -5.999999 -4.000001 0.000000 +v -8.000000 -4.000000 0.000000 +v -8.000000 -6.000000 0.000000 +v -6.000000 -6.000000 0.000000 +v -3.999999 -8.000000 0.000000 +v -6.000000 -8.000000 0.000000 +v -6.000000 -6.000000 0.000000 +v -3.999999 -6.000001 0.000000 +v -3.999999 -2.000001 0.000000 +v -6.000000 -2.000000 0.000000 +v -6.000000 -4.000000 0.000000 +v -4.000000 -4.000000 0.000000 +v -4.000000 -0.000000 0.000000 +v -6.000000 -0.000000 0.000000 +v -6.000000 2.000000 0.000000 +v -4.000000 1.999999 0.000000 +v -4.000000 5.999999 0.000000 +v -6.000000 6.000000 0.000000 +v -6.000000 4.000000 0.000000 +v -4.000000 4.000000 0.000000 +v -0.000000 4.000000 0.000000 +v -2.000000 4.000000 0.000000 +v -2.000000 6.000000 0.000000 +v 0.000000 6.000000 0.000000 +v 0.000000 2.000000 0.000000 +v -2.000000 2.000000 0.000000 +v -2.000000 -0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 0.000000 -4.000000 0.000000 +v -2.000000 -4.000000 0.000000 +v -2.000000 -2.000000 0.000000 +v 0.000001 -2.000000 0.000000 +v 0.000001 -6.000000 0.000000 +v -2.000000 -6.000000 0.000000 +v -1.999999 -8.000000 0.000000 +v 0.000001 -8.000000 0.000000 +v -2.000000 -6.000000 0.000000 +v -4.000000 -6.000000 0.000000 +v -4.000000 -4.000000 0.000000 +v -1.999999 -4.000000 0.000000 +v -2.000000 -0.000001 0.000000 +v -4.000000 -0.000000 0.000000 +v -4.000000 -2.000000 0.000000 +v -2.000000 -2.000000 0.000000 +v -2.000000 2.000000 0.000000 +v -4.000000 2.000000 0.000000 +v -4.000000 4.000000 0.000000 +v -2.000000 3.999999 0.000000 +v -2.000000 8.000000 0.000000 +v -4.000000 8.000000 0.000000 +v -4.000000 6.000000 0.000000 +v -2.000000 6.000000 0.000000 +v 6.000000 6.000000 0.000000 +v 4.000000 6.000000 0.000000 +v 3.999999 8.000000 0.000000 +v 6.000000 8.000000 0.000000 +v 6.000000 4.000000 0.000000 +v 4.000000 4.000000 0.000000 +v 4.000000 2.000000 0.000000 +v 6.000000 2.000000 0.000000 +v 6.000000 -2.000000 0.000000 +v 4.000000 -2.000000 0.000000 +v 4.000000 0.000000 0.000000 +v 6.000000 -0.000000 0.000000 +v 6.000001 -4.000000 0.000000 +v 4.000000 -4.000000 0.000000 +v 4.000000 -6.000000 0.000000 +v 6.000000 -6.000000 0.000000 +v 8.000001 -8.000000 0.000000 +v 6.000000 -8.000000 0.000000 +v 6.000000 -6.000000 0.000000 +v 8.000000 -6.000000 0.000000 +v 8.000000 -2.000000 0.000000 +v 6.000000 -2.000000 0.000000 +v 6.000000 -4.000000 0.000000 +v 8.000000 -3.999999 0.000000 +v 8.000000 0.000001 0.000000 +v 6.000000 0.000000 0.000000 +v 6.000000 2.000000 0.000000 +v 8.000000 2.000000 0.000000 +v 8.000000 6.000000 0.000000 +v 6.000000 6.000000 0.000000 +v 6.000000 4.000000 0.000000 +v 8.000000 4.000000 0.000000 +v 4.000000 4.000000 0.000000 +v 2.000000 4.000000 0.000000 +v 2.000000 6.000000 0.000000 +v 4.000000 6.000000 0.000000 +v 4.000000 2.000000 0.000000 +v 2.000000 2.000000 0.000000 +v 2.000000 0.000000 0.000000 +v 4.000000 0.000000 0.000000 +v 4.000000 -4.000000 0.000000 +v 2.000000 -4.000000 0.000000 +v 2.000000 -2.000000 0.000000 +v 4.000000 -2.000000 0.000000 +v 4.000001 -6.000000 0.000000 +v 2.000000 -6.000000 0.000000 +v 2.000001 -8.000000 0.000000 +v 4.000000 -8.000000 0.000000 +v 2.000000 -6.000000 0.000000 +v 0.000000 -6.000000 0.000000 +v 0.000000 -4.000000 0.000000 +v 2.000001 -4.000000 0.000000 +v 2.000000 -0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 0.000000 -2.000000 0.000000 +v 2.000000 -2.000000 0.000000 +v 2.000000 2.000000 0.000000 +v -0.000000 2.000000 0.000000 +v -0.000000 4.000000 0.000000 +v 2.000000 4.000000 0.000000 +v 2.000000 8.000000 0.000000 +v -0.000001 8.000000 0.000000 +v -0.000000 6.000000 0.000000 +v 2.000000 6.000000 0.000000 +usemtl Material.001 +s off +f 1 4 3 2 +f 6 7 8 5 +f 11 10 9 12 +f 14 15 16 13 +f 30 31 32 29 +f 27 26 25 28 +f 22 23 24 21 +f 19 18 17 20 +f 62 63 64 61 +f 59 58 57 60 +f 54 55 56 53 +f 51 50 49 52 +f 35 34 33 36 +f 38 39 40 37 +f 43 42 41 44 +f 46 47 48 45 +f 126 127 128 125 +f 123 122 121 124 +f 118 119 120 117 +f 115 114 113 116 +f 99 98 97 100 +f 102 103 104 101 +f 107 106 105 108 +f 110 111 112 109 +f 67 66 65 68 +f 70 71 72 69 +f 75 74 73 76 +f 78 79 80 77 +f 94 95 96 93 +f 91 90 89 92 +f 86 87 88 85 +f 83 82 81 84 diff --git a/Graph3D/Chess3D/game2.pas b/Graph3D/Chess3D/game2.pas new file mode 100644 index 0000000..cefad7a --- /dev/null +++ b/Graph3D/Chess3D/game2.pas @@ -0,0 +1,182 @@ +uses Graph3D; + +type + FigureColor = (Black,White); + FigureKind = (BishopK, HorseK, KingK, PownK, QueenK, RockK); + +var + BlackC := GrayColor(60); + WhiteC := Colors.White; + delay := 1000; + +type ChessFigure = class + f: FileModelT; +public + color: FigureColor; + k: FigureKind; + x,y: integer; + constructor Create(kk: FigureKind; cc: FigureColor); + function MoveTo(xx,yy: integer): ChessFigure; + function AnimMoveTo(xx,yy: integer): ChessFigure; + procedure Destroy; + begin + f.Destroy; + end; +end; + +var a := new ChessFigure[8,8]; + +constructor ChessFigure.Create(kk: FigureKind; cc: FigureColor); +begin + color := cc; + var c := cc=Black ? BlackC : WhiteC; + case kk of +bishopK: f := FileModel3D(4,14,0,'bishop.obj',c); +horseK : f := FileModel3D(2,14,0,'horse.obj',c); +kingK : f := FileModel3D(6,14,0,'king.obj',c); +pownK : f := FileModel3D(0,12,0,'pawn.obj',c); +queenK : f := FileModel3D(8,14,0,'queen.obj',c); +rockK : f := FileModel3D(0,14,0,'rook.obj',c); + end; + k := kk; +end; + +function ChessFigure.MoveTo(xx,yy: integer): ChessFigure; +begin + a[y,x] := nil; + if a[yy,xx]<>nil then + a[yy,xx].Destroy; + a[yy,xx] := Self; + var dx := xx - x; + var dy := yy - y; + f.MoveBy(-dx*2,-dy*2,0); + (x,y) := (xx,yy); + Result := Self; +end; + +function ChessFigure.AnimMoveTo(xx,yy: integer): ChessFigure; +begin + var dx := xx - x; + var dy := yy - y; + f.AnimMoveBy(-dx*2,-dy*2,0,delay/1000).WhenCompleted(procedure -> begin + a[y,x] := nil; + if a[yy,xx]<>nil then + a[yy,xx].Destroy; + a[yy,xx] := Self; + end + ).Begin; + (x,y) := (xx,yy); + Result := Self; +end; + +function Bishop(x,y: integer; c: FigureColor) := ChessFigure.Create(FigureKind.BishopK,c).MoveTo(x,y); +function Horse(x,y: integer; c: FigureColor) := ChessFigure.Create(FigureKind.HorseK,c).MoveTo(x,y); +function King(x,y: integer; c: FigureColor) := ChessFigure.Create(FigureKind.KingK,c).MoveTo(x,y); +function Queen(x,y: integer; c: FigureColor) := ChessFigure.Create(FigureKind.QueenK,c).MoveTo(x,y); +function Rock(x,y: integer; c: FigureColor) := ChessFigure.Create(FigureKind.RockK,c).MoveTo(x,y); +function Pown(x,y: integer; c: FigureColor) := ChessFigure.Create(FigureKind.PownK,c).MoveTo(x,y); + +procedure InitScene; +begin + var d := 7; + for var c := 'A' to 'H' do + begin + var t := Text3D(d,8.5,0,c,0.5); + t.UpDirection := v3d(0,-1,0); + d -= 2; + end; + d := 7; + for var c := '1' to '8' do + begin + var t := Text3D(8.3,d,0,c,0.5); + t.UpDirection := v3d(0,-1,0); + d -= 2; + end; + View3D.ShowGridLines := False; + var f := FileModel3D(0,0,0,'board.obj',GrayColor(100)); + f.Rotate(OrtZ,90); +end; + +procedure StartupPosition; +begin + Rock(0,0,White); + Horse(1,0,White); + Bishop(2,0,White); + Queen(3,0,White); + King(4,0,White); + Bishop(5,0,White); + Horse(6,0,White); + Rock(7,0,White); + for var i:=0 to 7 do + Pown(i,1,White); + + Rock(0,7,Black); + Horse(1,7,Black); + Bishop(2,7,Black); + Queen(3,7,Black); + King(4,7,Black); + Bishop(5,7,Black); + Horse(6,7,Black); + Rock(7,7,Black); + for var i:=0 to 7 do + Pown(i,6,Black); +end; + +procedure Turn(x,y,x1,y1: integer); +begin + if a[y,x]=nil then + begin + Println('>',y,x); + exit; + end; + + //Print(a[y,x],a[y1,x1]); + a[y,x].AnimMoveTo(x1,y1); + + //Println('->',a[y,x],a[y1,x1]); + Sleep(delay); +end; + +procedure TurnB(s1,s2: string); +begin + //Println(s1,s2); + Turn(Ord(s1[1])-Ord('a'),s1[2].ToDigit-1,Ord(s2[1])-Ord('a'),s2[2].ToDigit-1); +end; + +procedure Turns(s: string); +begin + var ss := s.ToWords.Batch(3).SelectMany(d->d.ToArray[1:]); + var i := 0; + foreach var d in ss do + begin + var p := Pos('-',d); + var p1 := d[:p]; + if Length(p1)=3 then + p1 := p1[2:]; + var p2 := d[p+1:]; + if Length(p2)=3 then + p2 := p2[2:]; + if (p1 = '0') and (p2 = '0') then + begin + if i mod 2 = 0 then + begin + TurnB('e1','g1'); + TurnB('h1','f1'); + end + else + begin + TurnB('e8','g8'); + TurnB('h8','f8'); + end + end + else TurnB(p1,p2); + i += 1; + end; +end; + +begin + InitScene; + StartupPosition; + //Turns('1. c2-c4 g7-g6 2. e2-e4 Cf8-g7 3. d2-d4 d7-d6 4. Kb1-c3 Kg8-f6 5. Kg1-f3 0-0 6. Cf1-e2 e7-e5 7. Cc1-e3 Kf6-g4 8. Ce3-g5 f7-f6 9. Cg5-h4 g6-g5 10. Ch4-g3 Kg4-h6'); + Turns('1. e2-e4 e7-e5 2. f1-c4 g8-f6 3. d2-d4 e5-d4 4. g1-f3 d7-d5 5. e4-d5 f8-b4 6. c2-c3 d8-e7'); +end. \ No newline at end of file diff --git a/Graph3D/Chess3D/horse.obj b/Graph3D/Chess3D/horse.obj new file mode 100644 index 0000000..5f2e04e --- /dev/null +++ b/Graph3D/Chess3D/horse.obj @@ -0,0 +1,2557 @@ +# Blender3D v245 OBJ File: chess2.blend +# www.blender3d.org +v 5.600000 -6.400000 0.000000 +v 5.705525 -6.528583 0.000000 +v 5.783938 -6.675282 0.000000 +v 5.832224 -6.834460 0.000000 +v 5.848528 -7.000000 0.000000 +v 5.832224 -7.165540 0.000000 +v 5.783938 -7.324718 0.000000 +v 5.705525 -7.471417 0.000000 +v 5.600000 -7.600000 0.000000 +v 5.471417 -7.705525 0.000000 +v 5.324718 -7.783938 0.000000 +v 5.165539 -7.832224 0.000000 +v 5.000000 -7.848528 0.000000 +v 4.834460 -7.832224 0.000000 +v 4.675282 -7.783937 0.000000 +v 4.528583 -7.705525 0.000000 +v 4.400000 -7.599999 0.000000 +v 4.294474 -7.471416 0.000000 +v 4.216062 -7.324717 0.000000 +v 4.167776 -7.165539 0.000000 +v 4.151472 -6.999999 0.000000 +v 4.167776 -6.834459 0.000000 +v 4.216063 -6.675282 0.000000 +v 4.294475 -6.528582 0.000000 +v 4.400001 -6.399999 0.000000 +v 4.528584 -6.294474 0.000000 +v 4.675283 -6.216062 0.000000 +v 4.834462 -6.167776 0.000000 +v 5.000001 -6.151472 0.000000 +v 5.165541 -6.167777 0.000000 +v 5.324719 -6.216063 0.000000 +v 5.471418 -6.294476 0.000000 +v 5.471418 -6.294476 0.100000 +v 5.324719 -6.216063 0.100000 +v 5.165541 -6.167777 0.100000 +v 5.000001 -6.151472 0.100000 +v 4.834462 -6.167776 0.100000 +v 4.675283 -6.216062 0.100000 +v 4.528584 -6.294474 0.100000 +v 4.400001 -6.399999 0.100000 +v 4.294475 -6.528582 0.100000 +v 4.216063 -6.675282 0.100000 +v 4.167776 -6.834459 0.100000 +v 4.151472 -6.999999 0.100000 +v 4.167776 -7.165539 0.100000 +v 4.216062 -7.324717 0.100000 +v 4.294474 -7.471416 0.100000 +v 4.400000 -7.599999 0.100000 +v 4.528583 -7.705525 0.100000 +v 4.675282 -7.783937 0.100000 +v 4.834460 -7.832224 0.100000 +v 5.000000 -7.848528 0.100000 +v 5.165539 -7.832224 0.100000 +v 5.324718 -7.783938 0.100000 +v 5.471417 -7.705525 0.100000 +v 5.600000 -7.600000 0.100000 +v 5.705525 -7.471417 0.100000 +v 5.783938 -7.324718 0.100000 +v 5.832224 -7.165540 0.100000 +v 5.848528 -7.000000 0.100000 +v 5.832224 -6.834460 0.100000 +v 5.783938 -6.675282 0.100000 +v 5.705525 -6.528583 0.100000 +v 5.600000 -6.400000 0.100000 +v 5.360000 -6.640000 0.300000 +v 5.423315 -6.717150 0.300000 +v 5.470363 -6.805170 0.300000 +v 5.499334 -6.900676 0.300000 +v 5.509117 -7.000000 0.300000 +v 5.499334 -7.099324 0.300000 +v 5.470363 -7.194830 0.300000 +v 5.423315 -7.282850 0.300000 +v 5.360000 -7.360000 0.300000 +v 5.282850 -7.423315 0.300000 +v 5.194830 -7.470363 0.300000 +v 5.099324 -7.499334 0.300000 +v 5.000000 -7.509117 0.300000 +v 4.900676 -7.499334 0.300000 +v 4.805169 -7.470363 0.300000 +v 4.717150 -7.423315 0.300000 +v 4.640000 -7.360000 0.300000 +v 4.576684 -7.282850 0.300000 +v 4.529637 -7.194830 0.300000 +v 4.500666 -7.099323 0.300000 +v 4.490883 -7.000000 0.300000 +v 4.500666 -6.900676 0.300000 +v 4.529637 -6.805169 0.300000 +v 4.576685 -6.717149 0.300000 +v 4.640000 -6.639999 0.300000 +v 4.717150 -6.576684 0.300000 +v 4.805170 -6.529637 0.300000 +v 4.900677 -6.500666 0.300000 +v 5.000001 -6.490883 0.300000 +v 5.099325 -6.500666 0.300000 +v 5.194831 -6.529638 0.300000 +v 5.282851 -6.576685 0.300000 +v 5.339421 -6.492023 0.400000 +v 5.233798 -6.435565 0.400000 +v 5.119190 -6.400799 0.400000 +v 5.000001 -6.389060 0.400000 +v 4.880812 -6.400798 0.400000 +v 4.766204 -6.435565 0.400000 +v 4.660581 -6.492021 0.400000 +v 4.568000 -6.567999 0.400000 +v 4.492022 -6.660579 0.400000 +v 4.435565 -6.766202 0.400000 +v 4.400799 -6.880811 0.400000 +v 4.389060 -7.000000 0.400000 +v 4.400799 -7.119188 0.400000 +v 4.435565 -7.233796 0.400000 +v 4.492022 -7.339420 0.400000 +v 4.568000 -7.432000 0.400000 +v 4.660580 -7.507978 0.400000 +v 4.766203 -7.564435 0.400000 +v 4.880811 -7.599201 0.400000 +v 5.000000 -7.610940 0.400000 +v 5.119188 -7.599201 0.400000 +v 5.233797 -7.564435 0.400000 +v 5.339420 -7.507978 0.400000 +v 5.432000 -7.432000 0.400000 +v 5.507978 -7.339420 0.400000 +v 5.564435 -7.233797 0.400000 +v 5.599201 -7.119188 0.400000 +v 5.610940 -7.000000 0.400000 +v 5.599201 -6.880811 0.400000 +v 5.564435 -6.766203 0.400000 +v 5.507978 -6.660580 0.400000 +v 5.432000 -6.568000 0.400000 +v 5.360000 -6.640000 0.500000 +v 4.640000 -7.360000 0.500000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.000000 -7.000000 0.000000 +v 5.183636 -6.540046 0.527802 +v 5.183636 -7.459509 0.527802 +v 4.817259 -7.459509 0.527802 +v 4.817259 -6.540046 0.527802 +v 5.000448 -7.459509 0.527802 +v 5.183636 -6.999778 0.527802 +v 5.000448 -6.540046 0.527802 +v 4.817259 -6.999777 0.527802 +v 4.908854 -7.459509 0.527802 +v 5.092042 -7.459509 0.527802 +v 5.183636 -6.769912 0.527802 +v 5.183636 -7.229643 0.527802 +v 4.908854 -6.540046 0.527802 +v 5.092042 -6.540046 0.527802 +v 4.817259 -6.769912 0.527802 +v 4.817259 -7.229643 0.527802 +v 4.817259 -6.654979 0.527802 +v 4.817259 -6.884845 0.527802 +v 4.863057 -6.540046 0.527802 +v 4.954651 -6.540046 0.527802 +v 5.137839 -6.540046 0.527802 +v 5.046245 -6.540046 0.527802 +v 5.183636 -6.654979 0.527802 +v 5.183636 -6.884845 0.527802 +v 5.183636 -7.344576 0.527802 +v 5.183636 -7.114710 0.527802 +v 5.046245 -7.459509 0.527802 +v 5.137839 -7.459509 0.527802 +v 4.954651 -7.459509 0.527802 +v 4.863057 -7.459509 0.527802 +v 4.817259 -7.114710 0.527802 +v 4.817259 -7.344576 0.527802 +v 4.793812 -7.330590 0.627802 +v 4.793812 -7.077738 0.627802 +v 4.845471 -7.457016 0.627802 +v 4.948789 -7.457016 0.627802 +v 5.155425 -7.457016 0.627802 +v 5.052107 -7.457016 0.627802 +v 5.207084 -7.077738 0.627802 +v 5.207084 -7.330590 0.627802 +v 5.207084 -6.824885 0.627802 +v 5.207084 -6.572033 0.627802 +v 5.052107 -6.445607 0.627802 +v 5.155425 -6.445607 0.627802 +v 4.948789 -6.445607 0.627802 +v 4.845471 -6.445607 0.627802 +v 4.793812 -6.824885 0.627802 +v 4.793812 -6.572033 0.627802 +v 4.793812 -7.204164 0.627802 +v 4.793812 -6.698459 0.627802 +v 5.103766 -6.445607 0.627802 +v 4.897130 -6.445607 0.627802 +v 5.207084 -7.204164 0.627802 +v 5.207084 -6.698459 0.627802 +v 5.103766 -7.457016 0.627802 +v 4.897130 -7.457016 0.627802 +v 4.793812 -6.951312 0.627802 +v 5.000448 -6.445607 0.627802 +v 5.207084 -6.951312 0.627802 +v 5.000448 -7.457016 0.627802 +v 4.793812 -6.445607 0.627802 +v 4.793812 -7.457016 0.627802 +v 5.207084 -7.457016 0.627802 +v 5.207084 -6.445607 0.627802 +v 5.250720 -6.333743 0.727803 +v 5.250720 -7.485795 0.727803 +v 4.750176 -7.485795 0.727803 +v 4.750176 -6.333743 0.727803 +v 5.000448 -7.485795 0.727803 +v 5.250720 -6.909769 0.727803 +v 5.000448 -6.333743 0.727803 +v 4.750176 -6.909769 0.727803 +v 4.875312 -7.485795 0.727803 +v 5.125584 -7.485795 0.727803 +v 5.250720 -6.621756 0.727803 +v 5.250720 -7.197783 0.727803 +v 4.875312 -6.333743 0.727803 +v 5.125584 -6.333743 0.727803 +v 4.750176 -6.621756 0.727803 +v 4.750176 -7.197783 0.727803 +v 4.750176 -6.477749 0.727803 +v 4.750176 -6.765762 0.727803 +v 4.812744 -6.333743 0.727803 +v 4.937880 -6.333743 0.727803 +v 5.188151 -6.333743 0.727803 +v 5.063016 -6.333743 0.727803 +v 5.250720 -6.477749 0.727803 +v 5.250720 -6.765763 0.727803 +v 5.250720 -7.341789 0.727803 +v 5.250720 -7.053776 0.727803 +v 5.063016 -7.485795 0.727803 +v 5.188151 -7.485795 0.727803 +v 4.937880 -7.485795 0.727803 +v 4.812744 -7.485795 0.727803 +v 4.750176 -7.053776 0.727803 +v 4.750176 -7.341789 0.727803 +v 4.736209 -7.367824 0.827803 +v 4.736209 -7.108612 0.827803 +v 4.802269 -7.497430 0.827803 +v 4.934388 -7.497430 0.827803 +v 5.198627 -7.497430 0.827803 +v 5.066507 -7.497430 0.827803 +v 5.264686 -7.108613 0.827803 +v 5.264686 -7.367825 0.827803 +v 5.264686 -6.849401 0.827803 +v 5.264686 -6.590189 0.827803 +v 5.066507 -6.460583 0.827803 +v 5.198627 -6.460583 0.827803 +v 4.934388 -6.460583 0.827803 +v 4.802269 -6.460583 0.827803 +v 4.736210 -6.849401 0.827803 +v 4.736210 -6.590189 0.827803 +v 4.736209 -7.238218 0.827803 +v 4.736210 -6.719794 0.827803 +v 5.132567 -6.460583 0.827803 +v 4.868329 -6.460583 0.827803 +v 5.264686 -7.238218 0.827803 +v 5.264686 -6.719794 0.827803 +v 5.132567 -7.497430 0.827803 +v 4.868329 -7.497430 0.827803 +v 4.736210 -6.979006 0.827803 +v 5.000448 -6.460583 0.827803 +v 5.264686 -6.979006 0.827803 +v 5.000448 -7.497430 0.827803 +v 4.736210 -6.460583 0.827803 +v 4.736209 -7.497430 0.827803 +v 5.264686 -7.497430 0.827803 +v 5.264686 -6.460583 0.827803 +v 5.250861 -6.511444 0.927803 +v 5.250861 -7.513036 0.927803 +v 4.750035 -7.513036 0.927803 +v 4.750035 -6.511444 0.927803 +v 5.000448 -7.513036 0.927803 +v 5.250861 -7.012240 0.927803 +v 5.000448 -6.511444 0.927803 +v 4.750035 -7.012240 0.927803 +v 4.875241 -7.513036 0.927803 +v 5.125654 -7.513036 0.927803 +v 5.250861 -6.761842 0.927803 +v 5.250861 -7.262638 0.927803 +v 4.875241 -6.511444 0.927803 +v 5.125654 -6.511444 0.927803 +v 4.750035 -6.761842 0.927803 +v 4.750035 -7.262638 0.927803 +v 4.750035 -6.636642 0.927803 +v 4.750035 -6.887041 0.927803 +v 4.812638 -6.511444 0.927803 +v 4.937845 -6.511444 0.927803 +v 5.188258 -6.511444 0.927803 +v 5.063051 -6.511444 0.927803 +v 5.250861 -6.636642 0.927803 +v 5.250861 -6.887041 0.927803 +v 5.250861 -7.387837 0.927803 +v 5.250861 -7.137439 0.927803 +v 5.063051 -7.513036 0.927803 +v 5.188258 -7.513036 0.927803 +v 4.937845 -7.513036 0.927803 +v 4.812638 -7.513036 0.927803 +v 4.750035 -7.137439 0.927803 +v 4.750035 -7.387837 0.927803 +v 4.768347 -7.411865 1.027803 +v 4.768347 -7.167604 1.027803 +v 4.826373 -7.533997 1.027803 +v 4.942423 -7.533997 1.027803 +v 5.174523 -7.533997 1.027803 +v 5.058473 -7.533997 1.027803 +v 5.232548 -7.167604 1.027803 +v 5.232548 -7.411866 1.027803 +v 5.232548 -6.923343 1.027803 +v 5.232548 -6.679081 1.027803 +v 5.058473 -6.556951 1.027803 +v 5.174523 -6.556951 1.027803 +v 4.942423 -6.556951 1.027803 +v 4.826373 -6.556951 1.027803 +v 4.768347 -6.923342 1.027803 +v 4.768347 -6.679081 1.027803 +v 4.768347 -7.289735 1.027803 +v 4.768347 -6.801212 1.027803 +v 5.116498 -6.556951 1.027803 +v 4.884398 -6.556951 1.027803 +v 5.232548 -7.289735 1.027803 +v 5.232548 -6.801212 1.027803 +v 5.116498 -7.533997 1.027803 +v 4.884398 -7.533997 1.027803 +v 4.768347 -7.045473 1.027803 +v 5.000448 -6.556951 1.027803 +v 5.232548 -7.045474 1.027803 +v 5.000448 -7.533997 1.027803 +v 4.768347 -6.556950 1.027803 +v 4.768347 -7.533997 1.027803 +v 5.232548 -7.533997 1.027803 +v 5.232548 -6.556951 1.027803 +v 5.211981 -6.610044 1.127803 +v 5.211981 -7.541831 1.127803 +v 4.788915 -7.541831 1.127803 +v 4.788915 -6.610044 1.127803 +v 5.000448 -7.541831 1.127803 +v 5.211981 -7.075937 1.127803 +v 5.000448 -6.610044 1.127803 +v 4.788915 -7.075937 1.127803 +v 4.894681 -7.541831 1.127803 +v 5.106215 -7.541831 1.127803 +v 5.211981 -6.842990 1.127803 +v 5.211981 -7.308884 1.127803 +v 4.894681 -6.610044 1.127803 +v 5.106215 -6.610044 1.127803 +v 4.788915 -6.842990 1.127803 +v 4.788915 -7.308884 1.127803 +v 4.788915 -6.726517 1.127803 +v 4.788915 -6.959464 1.127803 +v 4.841798 -6.610044 1.127803 +v 4.947565 -6.610044 1.127803 +v 5.159098 -6.610044 1.127803 +v 5.053331 -6.610044 1.127803 +v 5.211981 -6.726517 1.127803 +v 5.211981 -6.959464 1.127803 +v 5.211981 -7.425357 1.127803 +v 5.211981 -7.192410 1.127803 +v 5.053331 -7.541831 1.127803 +v 5.159098 -7.541831 1.127803 +v 4.947565 -7.541831 1.127803 +v 4.841798 -7.541831 1.127803 +v 4.788915 -7.192410 1.127803 +v 4.788915 -7.425357 1.127803 +v 4.811215 -7.425329 1.227803 +v 4.811215 -7.205607 1.227803 +v 4.858523 -7.535190 1.227803 +v 4.953140 -7.535190 1.227803 +v 5.142373 -7.535190 1.227803 +v 5.047756 -7.535190 1.227803 +v 5.189681 -7.205607 1.227803 +v 5.189681 -7.425329 1.227803 +v 5.189681 -6.985885 1.227803 +v 5.189681 -6.766163 1.227803 +v 5.047756 -6.656302 1.227803 +v 5.142373 -6.656302 1.227803 +v 4.953140 -6.656302 1.227803 +v 4.858523 -6.656302 1.227803 +v 4.811215 -6.985885 1.227803 +v 4.811215 -6.766163 1.227803 +v 4.811215 -7.315468 1.227803 +v 4.811215 -6.876024 1.227803 +v 5.095065 -6.656302 1.227803 +v 4.905831 -6.656302 1.227803 +v 5.189681 -7.315468 1.227803 +v 5.189681 -6.876024 1.227803 +v 5.095064 -7.535190 1.227803 +v 4.905831 -7.535190 1.227803 +v 4.811215 -7.095746 1.227803 +v 5.000448 -6.656302 1.227803 +v 5.189681 -7.095746 1.227803 +v 5.000448 -7.535190 1.227803 +v 4.811215 -6.656302 1.227803 +v 4.811215 -7.535190 1.227803 +v 5.189681 -7.535190 1.227803 +v 5.189681 -6.656302 1.227803 +v 5.166361 -6.719011 1.327803 +v 5.166361 -7.520361 1.327803 +v 4.834535 -7.520361 1.327803 +v 4.834535 -6.719011 1.327803 +v 5.000448 -7.520361 1.327803 +v 5.166361 -7.119686 1.327803 +v 5.000448 -6.719011 1.327803 +v 4.834535 -7.119686 1.327803 +v 4.917491 -7.520361 1.327803 +v 5.083404 -7.520361 1.327803 +v 5.166361 -6.919349 1.327803 +v 5.166361 -7.320024 1.327803 +v 4.917491 -6.719011 1.327803 +v 5.083405 -6.719011 1.327803 +v 4.834535 -6.919349 1.327803 +v 4.834535 -7.320024 1.327803 +v 4.834535 -6.819180 1.327803 +v 4.834535 -7.019517 1.327803 +v 4.876013 -6.719011 1.327803 +v 4.958970 -6.719011 1.327803 +v 5.124883 -6.719011 1.327803 +v 5.041926 -6.719011 1.327803 +v 5.166361 -6.819180 1.327803 +v 5.166361 -7.019517 1.327803 +v 5.166361 -7.420193 1.327803 +v 5.166361 -7.219855 1.327803 +v 5.041926 -7.520361 1.327803 +v 5.124883 -7.520361 1.327803 +v 4.958970 -7.520361 1.327803 +v 4.876013 -7.520361 1.327803 +v 4.834535 -7.219855 1.327803 +v 4.834535 -7.420193 1.327803 +v 4.849163 -7.407565 1.427803 +v 4.849163 -7.215646 1.427803 +v 4.886984 -7.503525 1.427803 +v 4.962627 -7.503525 1.427803 +v 5.113911 -7.503525 1.427803 +v 5.038269 -7.503525 1.427803 +v 5.151732 -7.215646 1.427803 +v 5.151732 -7.407565 1.427803 +v 5.151732 -7.023726 1.427803 +v 5.151732 -6.831807 1.427803 +v 5.038269 -6.735847 1.427803 +v 5.113911 -6.735847 1.427803 +v 4.962627 -6.735847 1.427803 +v 4.886984 -6.735847 1.427803 +v 4.849163 -7.023726 1.427803 +v 4.849163 -6.831807 1.427803 +v 4.849163 -7.311605 1.427803 +v 4.849163 -6.927767 1.427803 +v 5.076090 -6.735847 1.427803 +v 4.924806 -6.735847 1.427803 +v 5.151732 -7.311605 1.427803 +v 5.151732 -6.927767 1.427803 +v 5.076090 -7.503525 1.427803 +v 4.924806 -7.503525 1.427803 +v 4.849163 -7.119686 1.427803 +v 5.000448 -6.735847 1.427803 +v 5.151732 -7.119686 1.427803 +v 5.000448 -7.503525 1.427803 +v 4.849164 -6.735847 1.427803 +v 4.849163 -7.503525 1.427803 +v 5.151732 -7.503525 1.427803 +v 5.151732 -6.735847 1.427803 +v 5.151732 -6.755233 1.527803 +v 5.151732 -7.484139 1.527803 +v 4.849163 -7.484139 1.527803 +v 4.849164 -6.755233 1.527803 +v 5.000448 -7.583217 1.430341 +v 5.151732 -7.119686 1.527803 +v 5.000448 -6.755233 1.527803 +v 4.849163 -7.119686 1.527803 +v 4.924806 -7.484139 1.527803 +v 5.076090 -7.484139 1.527803 +v 5.151732 -6.937459 1.527803 +v 5.151732 -7.301913 1.527803 +v 4.924806 -6.755233 1.527803 +v 5.076090 -6.755233 1.527803 +v 4.849163 -6.937459 1.527803 +v 4.849163 -7.301913 1.527803 +v 4.849163 -6.846346 1.527803 +v 4.849163 -7.028573 1.527803 +v 4.886984 -6.755233 1.527803 +v 4.962627 -6.755233 1.527803 +v 5.113911 -6.755233 1.527803 +v 5.038269 -6.755233 1.527803 +v 5.151732 -6.846346 1.527803 +v 5.151732 -7.028573 1.527803 +v 5.151732 -7.393026 1.527803 +v 5.151732 -7.210800 1.527803 +v 5.038269 -7.484139 1.527803 +v 5.113911 -7.484139 1.527803 +v 4.962627 -7.484139 1.527803 +v 4.886984 -7.484139 1.527803 +v 4.849163 -7.210800 1.527803 +v 4.849163 -7.393026 1.527803 +v 4.849163 -7.380989 1.627803 +v 4.849163 -7.206787 1.627803 +v 4.886984 -7.468090 1.627803 +v 4.962627 -7.468090 1.627803 +v 5.113911 -7.468090 1.627803 +v 5.038269 -7.468090 1.627803 +v 5.151732 -7.206787 1.627803 +v 5.151732 -7.380989 1.627803 +v 5.151732 -7.032585 1.627803 +v 5.151732 -6.858383 1.627803 +v 5.038269 -6.771282 1.627803 +v 5.113911 -6.771282 1.627803 +v 4.962627 -6.771282 1.627803 +v 4.886984 -6.771282 1.627803 +v 4.849163 -7.032585 1.627803 +v 4.849163 -6.858383 1.627803 +v 4.849163 -7.293888 1.627803 +v 4.849163 -6.945484 1.627803 +v 5.076090 -6.771282 1.627803 +v 4.924806 -6.771282 1.627803 +v 5.151732 -7.293888 1.627803 +v 5.151732 -6.945484 1.627803 +v 5.076090 -7.468090 1.627803 +v 4.924806 -7.468090 1.627803 +v 4.849163 -7.119686 1.627803 +v 5.000448 -6.771282 1.627803 +v 5.151732 -7.119686 1.627803 +v 5.000448 -7.563978 1.550220 +v 4.849164 -6.771282 1.627803 +v 4.849163 -7.468090 1.627803 +v 5.151732 -7.468090 1.627803 +v 5.151732 -6.771282 1.627803 +v 5.151732 -6.755233 1.727803 +v 5.151732 -7.484139 1.727803 +v 4.849163 -7.484139 1.727803 +v 4.849164 -6.755233 1.727803 +v 5.000448 -7.583217 1.670099 +v 5.151732 -7.119686 1.727803 +v 5.000448 -6.755233 1.727803 +v 4.849163 -7.119686 1.727803 +v 4.924806 -7.484139 1.727803 +v 5.076090 -7.484139 1.727803 +v 5.151732 -6.937459 1.727803 +v 5.151732 -7.301913 1.727803 +v 4.924806 -6.755233 1.727803 +v 5.076090 -6.755233 1.727803 +v 4.849163 -6.937459 1.727803 +v 4.849163 -7.301913 1.727803 +v 4.849163 -6.846346 1.727803 +v 4.849163 -7.028573 1.727803 +v 4.886984 -6.755233 1.727803 +v 4.962627 -6.755233 1.727803 +v 5.113911 -6.755233 1.727803 +v 5.038269 -6.755233 1.727803 +v 5.151732 -6.846346 1.727803 +v 5.151732 -7.028573 1.727803 +v 5.151732 -7.393026 1.727803 +v 5.151732 -7.210800 1.727803 +v 5.038269 -7.484139 1.727803 +v 5.113911 -7.484139 1.727803 +v 4.962627 -7.484139 1.727803 +v 4.886984 -7.484139 1.727803 +v 4.849163 -7.210800 1.727803 +v 4.849163 -7.393026 1.727803 +v 4.849163 -7.410970 1.890069 +v 4.849163 -7.233874 1.849729 +v 4.886984 -7.499518 1.910239 +v 4.962627 -7.499518 1.910239 +v 5.113911 -7.499518 1.910239 +v 5.038269 -7.499518 1.910239 +v 5.151732 -7.233874 1.849729 +v 5.151732 -7.410970 1.890069 +v 5.151732 -7.056777 1.809388 +v 5.151732 -6.879681 1.769047 +v 5.038269 -6.759117 1.755126 +v 5.113911 -6.759117 1.755126 +v 4.962627 -6.759117 1.755126 +v 4.886984 -6.759117 1.755126 +v 4.849163 -7.056777 1.809388 +v 4.849163 -6.879681 1.769047 +v 4.849163 -7.322422 1.869899 +v 4.849163 -6.968229 1.789218 +v 5.076090 -6.759117 1.755126 +v 4.924806 -6.759117 1.755126 +v 5.151732 -7.322422 1.869899 +v 5.151732 -6.968229 1.789218 +v 5.076090 -7.499518 1.910239 +v 4.924806 -7.499518 1.910239 +v 4.849163 -7.145326 1.829558 +v 5.000448 -6.759117 1.755126 +v 5.151732 -7.145326 1.829558 +v 5.000448 -7.601653 1.888802 +v 4.849164 -6.759117 1.755126 +v 4.849163 -7.499518 1.910239 +v 5.151732 -7.499518 1.910239 +v 5.151732 -6.759117 1.755126 +v 5.151732 -6.750661 1.777915 +v 5.151732 -7.465883 2.083405 +v 4.849163 -7.465883 2.083405 +v 4.849164 -6.750660 1.777915 +v 5.000448 -7.561332 2.096390 +v 5.151732 -7.128751 1.930169 +v 5.000448 -6.750661 1.777915 +v 4.849163 -7.128750 1.930169 +v 4.924806 -7.465883 2.083405 +v 5.076090 -7.465883 2.083405 +v 5.151732 -6.960184 1.853551 +v 5.151732 -7.297317 2.006787 +v 4.924806 -6.750661 1.777915 +v 5.076090 -6.750661 1.777915 +v 4.849163 -6.960184 1.853551 +v 4.849163 -7.297317 2.006787 +v 4.849163 -6.875901 1.815242 +v 4.849163 -7.044467 1.891860 +v 4.886984 -6.750661 1.777915 +v 4.962627 -6.750661 1.777915 +v 5.113911 -6.750661 1.777915 +v 5.038269 -6.750661 1.777915 +v 5.151732 -6.875901 1.815242 +v 5.151732 -7.044467 1.891860 +v 5.151732 -7.381600 2.045096 +v 5.151732 -7.213034 1.968478 +v 5.038269 -7.465883 2.083405 +v 5.113911 -7.465883 2.083405 +v 4.962627 -7.465883 2.083405 +v 4.886984 -7.465883 2.083405 +v 4.849163 -7.213034 1.968478 +v 4.849163 -7.381600 2.045096 +v 4.849163 -7.321197 2.181381 +v 4.849163 -7.165192 2.073043 +v 4.886984 -7.399199 2.235551 +v 4.962627 -7.399199 2.235551 +v 5.113911 -7.399199 2.235551 +v 5.038269 -7.399199 2.235551 +v 5.151732 -7.165192 2.073043 +v 5.151732 -7.321197 2.181382 +v 5.151732 -7.009188 1.964704 +v 5.151732 -6.853183 1.856364 +v 5.038269 -6.737184 1.798265 +v 5.113911 -6.737184 1.798265 +v 4.962627 -6.737184 1.798265 +v 4.886984 -6.737184 1.798265 +v 4.849163 -7.009187 1.964704 +v 4.849163 -6.853182 1.856364 +v 4.849163 -7.243195 2.127212 +v 4.849163 -6.931185 1.910534 +v 5.076090 -6.737184 1.798265 +v 4.924806 -6.737184 1.798265 +v 5.151732 -7.243195 2.127212 +v 5.151732 -6.931185 1.910534 +v 5.076090 -7.399199 2.235551 +v 4.924806 -7.399199 2.235551 +v 4.849163 -7.087190 2.018873 +v 5.000448 -6.737184 1.798265 +v 5.151732 -7.087190 2.018873 +v 5.000448 -7.481392 2.278782 +v 4.849164 -6.737184 1.798265 +v 4.849163 -7.399199 2.235551 +v 5.151732 -7.399199 2.235551 +v 5.151732 -6.737184 1.798265 +v 5.151732 -6.727150 1.812189 +v 5.151732 -7.302564 2.415045 +v 4.849163 -7.302564 2.415045 +v 4.849164 -6.727150 1.812189 +v 5.000448 -7.365547 2.493956 +v 5.151732 -7.039094 2.119839 +v 5.000448 -6.727150 1.812189 +v 4.849163 -7.039094 2.119839 +v 4.924806 -7.302564 2.415045 +v 5.076090 -7.302564 2.415045 +v 5.151732 -6.907359 1.972237 +v 5.151732 -7.170829 2.267442 +v 4.924806 -6.727150 1.812189 +v 5.076090 -6.727150 1.812189 +v 4.849163 -6.907359 1.972237 +v 4.849163 -7.170829 2.267442 +v 4.849163 -6.841492 1.898435 +v 4.849163 -6.973227 2.046038 +v 4.886984 -6.727150 1.812189 +v 4.962627 -6.727150 1.812189 +v 5.113911 -6.727150 1.812189 +v 5.038269 -6.727150 1.812189 +v 5.151732 -6.841492 1.898435 +v 5.151732 -6.973227 2.046038 +v 5.151732 -7.236697 2.341244 +v 5.151732 -7.104962 2.193641 +v 5.038269 -7.302564 2.415045 +v 5.113911 -7.302564 2.415045 +v 4.962627 -7.302564 2.415045 +v 4.886984 -7.302564 2.415045 +v 4.849163 -7.104962 2.193641 +v 4.849163 -7.236697 2.341243 +v 4.849163 -7.046010 2.393138 +v 4.849163 -6.961240 2.231773 +v 4.886984 -7.088395 2.473820 +v 4.962627 -7.088395 2.473820 +v 5.113911 -7.088394 2.473821 +v 5.038269 -7.088394 2.473821 +v 5.151732 -6.961240 2.231773 +v 5.151732 -7.046010 2.393138 +v 5.151732 -6.876471 2.070408 +v 5.151732 -6.791701 1.909043 +v 5.038269 -6.712631 1.814934 +v 5.113911 -6.712631 1.814934 +v 4.962627 -6.712631 1.814934 +v 4.886984 -6.712631 1.814934 +v 4.849163 -6.876471 2.070408 +v 4.849163 -6.791701 1.909043 +v 4.849163 -7.003625 2.312456 +v 4.849163 -6.834086 1.989726 +v 5.076090 -6.712631 1.814934 +v 4.924806 -6.712631 1.814934 +v 5.151732 -7.003625 2.312456 +v 5.151732 -6.834086 1.989726 +v 5.076090 -7.088394 2.473821 +v 4.924806 -7.088395 2.473820 +v 4.849163 -6.918856 2.151091 +v 5.000448 -6.712631 1.814934 +v 5.151732 -6.918856 2.151091 +v 5.000448 -7.108803 2.564416 +v 4.849163 -6.712631 1.814934 +v 4.849163 -7.088395 2.473820 +v 5.151732 -7.088394 2.473821 +v 5.151732 -6.712631 1.814934 +v 5.151732 -6.690492 1.815488 +v 5.151732 -6.946949 2.508360 +v 4.849163 -6.946949 2.508359 +v 4.849164 -6.690492 1.815488 +v 5.000448 -6.939239 2.605821 +v 5.151732 -6.835494 2.151091 +v 5.000448 -6.690492 1.815488 +v 4.849163 -6.835494 2.151091 +v 4.924806 -6.946949 2.508359 +v 5.076090 -6.946949 2.508360 +v 5.151732 -6.779766 1.972457 +v 5.151732 -6.891221 2.329726 +v 4.924806 -6.690492 1.815488 +v 5.076090 -6.690492 1.815488 +v 4.849163 -6.779766 1.972457 +v 4.849163 -6.891221 2.329725 +v 4.849164 -6.744042 1.903773 +v 4.849163 -6.807630 2.061774 +v 4.886984 -6.690492 1.815488 +v 4.962627 -6.690492 1.815488 +v 5.113911 -6.690492 1.815488 +v 5.038269 -6.690492 1.815488 +v 5.151732 -6.744042 1.903773 +v 5.151732 -6.807630 2.061774 +v 5.151732 -6.919085 2.419043 +v 5.151732 -6.863357 2.240408 +v 5.038269 -6.946949 2.508360 +v 5.113911 -6.946949 2.508360 +v 4.962627 -6.946949 2.508359 +v 4.886984 -6.946949 2.508359 +v 4.849163 -6.863357 2.240408 +v 4.849163 -6.919085 2.419042 +v 4.849163 -6.769279 2.399413 +v 4.849163 -6.753209 2.239429 +v 4.886984 -6.777314 2.479404 +v 4.962627 -6.777314 2.479404 +v 5.113911 -6.777314 2.479405 +v 5.038269 -6.777314 2.479405 +v 5.151732 -6.753209 2.239429 +v 5.151732 -6.769279 2.399413 +v 5.151732 -6.737139 2.079446 +v 5.151732 -6.721069 1.919462 +v 5.038269 -6.665230 1.804334 +v 5.113911 -6.665230 1.804334 +v 4.962627 -6.665230 1.804334 +v 4.886984 -6.665230 1.804334 +v 4.849163 -6.737139 2.079446 +v 4.849163 -6.721068 1.919462 +v 4.849163 -6.761244 2.319421 +v 4.849163 -6.729104 1.999454 +v 5.076090 -6.665230 1.804334 +v 4.924806 -6.665230 1.804334 +v 5.151732 -6.761244 2.319421 +v 5.151732 -6.729104 1.999454 +v 5.076090 -6.777314 2.479405 +v 4.924806 -6.777314 2.479404 +v 4.849163 -6.745174 2.159438 +v 5.000448 -6.665230 1.804334 +v 5.151732 -6.745174 2.159438 +v 5.000448 -6.735884 2.571110 +v 4.849164 -6.665231 1.804334 +v 4.849163 -6.777314 2.479404 +v 5.151732 -6.777314 2.479405 +v 5.151732 -6.665230 1.804334 +v 5.151732 -6.653955 1.782139 +v 5.151732 -6.666171 2.453959 +v 4.849164 -6.666171 2.453959 +v 4.849164 -6.653955 1.782139 +v 5.000448 -6.602646 2.540607 +v 5.151732 -6.664441 2.168693 +v 5.000448 -6.653955 1.782139 +v 4.849164 -6.664441 2.168693 +v 4.924806 -6.666171 2.453959 +v 5.076090 -6.666171 2.453959 +v 5.151732 -6.663575 2.009366 +v 5.151732 -6.665306 2.328019 +v 4.924806 -6.653955 1.782139 +v 5.076090 -6.653955 1.782139 +v 4.849164 -6.663575 2.009366 +v 4.849164 -6.665306 2.328019 +v 4.849164 -6.663143 1.929702 +v 4.849164 -6.664008 2.089029 +v 4.886984 -6.653955 1.782139 +v 4.962627 -6.653955 1.782139 +v 5.113911 -6.653955 1.782139 +v 5.038269 -6.653955 1.782139 +v 5.151732 -6.663143 1.929702 +v 5.151732 -6.664008 2.089029 +v 5.151732 -6.665738 2.407683 +v 5.151732 -6.664873 2.248356 +v 5.038269 -6.666171 2.453959 +v 5.113912 -6.666171 2.453959 +v 4.962627 -6.666171 2.453959 +v 4.886984 -6.666171 2.453959 +v 4.849164 -6.664873 2.248356 +v 4.849164 -6.665739 2.407682 +v 4.849164 -6.551487 2.346452 +v 4.879420 -6.550622 2.187125 +v 4.886984 -6.551919 2.392729 +v 4.962627 -6.551919 2.392729 +v 5.113911 -6.551919 2.392729 +v 5.038269 -6.551919 2.392729 +v 5.121476 -6.550622 2.187125 +v 5.151732 -6.551486 2.346452 +v 5.151732 -6.549757 2.027799 +v 5.151732 -6.548891 1.868472 +v 5.038269 -6.636632 1.715996 +v 5.113911 -6.636632 1.715996 +v 4.962627 -6.636632 1.715996 +v 4.886984 -6.636632 1.715996 +v 4.849164 -6.549756 2.027799 +v 4.849164 -6.548891 1.868472 +v 4.849164 -6.551054 2.266788 +v 4.849164 -6.549324 1.948135 +v 5.076090 -6.636632 1.715996 +v 4.924806 -6.636632 1.715996 +v 5.151732 -6.551054 2.266789 +v 5.151732 -6.549324 1.948135 +v 5.076090 -6.551919 2.392729 +v 4.924806 -6.551919 2.392729 +v 4.879420 -6.550189 2.107462 +v 5.000448 -6.636632 1.715996 +v 5.121476 -6.550189 2.107462 +v 5.000448 -6.465683 2.467205 +v 4.849164 -6.636633 1.715996 +v 4.849163 -6.551919 2.392729 +v 5.151732 -6.551919 2.392729 +v 5.151732 -6.636632 1.715996 +v 5.151732 -6.559735 1.596941 +v 5.151732 -6.499763 2.337735 +v 4.849163 -6.499764 2.337735 +v 4.849163 -6.559736 1.596941 +v 5.000448 -6.403160 2.401279 +v 5.121476 -6.498033 2.052469 +v 5.000448 -6.559735 1.596941 +v 4.879420 -6.498033 2.052469 +v 4.924806 -6.499764 2.337735 +v 5.076090 -6.499763 2.337735 +v 5.151732 -6.497168 1.893142 +v 5.151732 -6.498899 2.211795 +v 4.924806 -6.559735 1.596941 +v 5.076090 -6.559735 1.596941 +v 4.849163 -6.497168 1.893142 +v 4.849163 -6.498899 2.211795 +v 4.849163 -6.499451 1.720899 +v 4.849163 -6.497601 1.972805 +v 4.886984 -6.559735 1.596941 +v 4.962626 -6.559735 1.596941 +v 5.113911 -6.559735 1.596941 +v 5.038269 -6.559735 1.596941 +v 5.151732 -6.499451 1.720899 +v 5.151732 -6.497601 1.972805 +v 5.151732 -6.499331 2.291458 +v 5.121476 -6.498466 2.132131 +v 5.038269 -6.499763 2.337735 +v 5.113911 -6.499763 2.337735 +v 4.962626 -6.499764 2.337735 +v 4.886984 -6.499764 2.337735 +v 4.879420 -6.498466 2.132131 +v 4.849163 -6.499331 2.291458 +v 4.849163 -6.471511 2.254579 +v 4.849163 -6.470645 2.095253 +v 4.886984 -6.471943 2.300856 +v 4.962626 -6.471943 2.300856 +v 5.113911 -6.471943 2.300856 +v 5.038269 -6.471943 2.300856 +v 5.151732 -6.470645 2.095253 +v 5.151732 -6.471510 2.254580 +v 5.151732 -6.469780 1.935926 +v 5.151732 -6.415841 1.763082 +v 5.038269 -6.521589 1.543065 +v 5.113911 -6.521589 1.543065 +v 4.962626 -6.521589 1.543065 +v 4.886984 -6.521589 1.543065 +v 4.849163 -6.469780 1.935926 +v 4.849163 -6.415841 1.763082 +v 4.849163 -6.471078 2.174916 +v 4.849163 -6.423092 1.788845 +v 5.076090 -6.521589 1.543065 +v 4.924805 -6.521589 1.543065 +v 5.151732 -6.471078 2.174916 +v 5.151732 -6.423092 1.788845 +v 5.076090 -6.471943 2.300856 +v 4.924805 -6.471943 2.300856 +v 4.849163 -6.470212 2.015589 +v 5.000448 -6.521589 1.543065 +v 5.151732 -6.470212 2.015589 +v 5.000448 -6.369808 2.357069 +v 4.849163 -6.521590 1.543065 +v 4.849163 -6.471943 2.300856 +v 5.151732 -6.471943 2.300856 +v 5.151732 -6.521589 1.543065 +v 5.151732 -6.493333 1.498510 +v 5.151732 -6.449376 2.269498 +v 4.849163 -6.449376 2.269498 +v 4.849163 -6.493333 1.498510 +v 5.000448 -6.449376 2.269498 +v 5.151732 -6.447645 1.984232 +v 5.000447 -6.493333 1.498510 +v 4.849163 -6.447645 1.984232 +v 4.924805 -6.449376 2.269498 +v 5.076090 -6.449376 2.269498 +v 5.151732 -6.376426 1.751812 +v 5.151732 -6.448510 2.143558 +v 4.924805 -6.493333 1.498510 +v 5.076090 -6.493333 1.498510 +v 4.849163 -6.376426 1.751812 +v 4.849163 -6.448510 2.143558 +v 4.849163 -6.406904 1.670217 +v 4.849163 -6.447213 1.904568 +v 4.886984 -6.493333 1.498510 +v 4.962626 -6.493333 1.498510 +v 5.113911 -6.493333 1.498510 +v 5.038269 -6.493333 1.498510 +v 5.151732 -6.406905 1.670217 +v 5.151732 -6.447213 1.904568 +v 5.151732 -6.448943 2.223222 +v 5.151732 -6.448078 2.063895 +v 5.038269 -6.449376 2.269498 +v 5.113911 -6.449376 2.269498 +v 4.962626 -6.449376 2.269498 +v 4.886984 -6.449376 2.269498 +v 4.849163 -6.448078 2.063895 +v 4.849163 -6.448943 2.223221 +v 4.849163 -6.423130 2.149035 +v 4.849163 -6.422264 1.989708 +v 4.886984 -6.423563 2.195312 +v 4.962626 -6.423563 2.195312 +v 5.113911 -6.423562 2.195312 +v 5.038269 -6.423562 2.195312 +v 5.151732 -6.423130 2.149035 +v 5.151732 -6.384747 1.592731 +v 5.038269 -6.437446 1.476536 +v 5.113911 -6.437446 1.476536 +v 4.962626 -6.437446 1.476536 +v 4.886984 -6.437446 1.476536 +v 4.849163 -6.322024 1.725183 +v 4.849163 -6.384747 1.592731 +v 4.849163 -6.422844 2.069479 +v 4.849163 -6.350755 1.663787 +v 5.076090 -6.437446 1.476536 +v 4.924805 -6.437446 1.476536 +v 5.151732 -6.422844 2.069479 +v 5.151732 -6.350755 1.663787 +v 5.076090 -6.423562 2.195312 +v 4.924805 -6.423563 2.195312 +v 4.849163 -6.421832 1.910045 +v 5.000447 -6.437446 1.476536 +v 5.000448 -6.423563 2.195312 +v 4.849163 -6.437447 1.476536 +v 4.849163 -6.423563 2.195312 +v 5.151732 -6.423562 2.195312 +v 5.151732 -6.437446 1.476536 +v 5.151732 -6.421832 1.910045 +v 5.000448 -6.421832 1.910045 +v 5.076090 -6.421832 1.910045 +v 5.000448 -6.422843 2.069479 +v 5.000448 -6.350754 1.663787 +v 4.924807 -6.421832 1.910045 +v 4.924807 -6.350754 1.663787 +v 5.076090 -6.350754 1.663787 +v 5.076090 -6.422843 2.069479 +v 4.924806 -6.422843 2.069479 +v 4.962627 -6.421832 1.910045 +v 4.886985 -6.421832 1.910045 +v 5.000448 -6.322024 1.725183 +v 5.000448 -6.384748 1.592731 +v 4.924807 -6.322024 1.725183 +v 4.886985 -6.350754 1.663787 +v 4.962627 -6.350754 1.663787 +v 4.924807 -6.384748 1.592731 +v 5.038269 -6.421832 1.910045 +v 5.113911 -6.421832 1.910045 +v 5.151732 -6.322024 1.725183 +v 5.038270 -6.350754 1.663787 +v 5.076090 -6.384748 1.592731 +v 5.076090 -6.322024 1.725183 +v 5.113911 -6.350754 1.663787 +v 5.151732 -6.422265 1.989708 +v 5.000448 -6.423128 2.149035 +v 5.000448 -6.422265 1.989708 +v 5.076090 -6.422265 1.989708 +v 5.113911 -6.422843 2.069479 +v 5.038269 -6.422843 2.069479 +v 5.076090 -6.423128 2.149035 +v 4.962627 -6.422843 2.069479 +v 4.924806 -6.423128 2.149035 +v 4.924806 -6.422265 1.989708 +v 4.886985 -6.422843 2.069479 +v 4.886985 -6.422265 1.989708 +v 4.962627 -6.422265 1.989708 +v 4.962627 -6.423128 2.149035 +v 5.038269 -6.423128 2.149035 +v 5.038269 -6.422265 1.989708 +v 5.113911 -6.422265 1.989708 +v 5.113911 -6.322024 1.725183 +v 5.038269 -6.322024 1.725183 +v 5.038270 -6.384748 1.592731 +v 4.962627 -6.384748 1.592731 +v 4.962627 -6.322024 1.725183 +v 4.886985 -6.322024 1.725183 +v 4.886986 -6.384748 1.592731 +v 5.113911 -6.384748 1.592731 +v 5.113911 -6.423128 2.149035 +v 4.886985 -6.423128 2.149035 +v 5.182741 -6.655424 0.527802 +v 5.182741 -6.885290 0.527802 +v 5.136943 -6.540491 0.527802 +v 5.045349 -6.540491 0.527802 +v 4.862161 -6.540491 0.527802 +v 4.953755 -6.540491 0.527802 +v 4.816364 -6.885290 0.527802 +v 4.816363 -6.655424 0.527802 +v 4.816364 -7.115155 0.527802 +v 4.816364 -7.345021 0.527802 +v 4.953755 -7.459954 0.527802 +v 4.862161 -7.459954 0.527802 +v 5.045349 -7.459954 0.527802 +v 5.136943 -7.459954 0.527802 +v 5.182741 -7.115155 0.527802 +v 5.182741 -7.345021 0.527802 +v 5.182741 -6.770357 0.527802 +v 5.182741 -7.230088 0.527802 +v 4.907958 -7.459954 0.527802 +v 5.091146 -7.459954 0.527802 +v 4.816364 -6.770357 0.527802 +v 4.816364 -7.230088 0.527802 +v 4.907958 -6.540491 0.527802 +v 5.091146 -6.540491 0.527802 +v 5.182741 -7.000223 0.527802 +v 4.999552 -7.459954 0.527802 +v 4.816364 -7.000222 0.527802 +v 4.999552 -6.540491 0.527802 +v 5.182741 -7.459954 0.527802 +v 5.182741 -6.540491 0.527802 +v 4.816363 -6.540491 0.527802 +v 4.816364 -7.459954 0.527802 +v 4.717149 -7.423315 0.500000 +v 4.805169 -7.470362 0.500000 +v 4.900675 -7.499334 0.500000 +v 4.999999 -7.509117 0.500000 +v 5.099323 -7.499334 0.500000 +v 5.194830 -7.470363 0.500000 +v 5.282850 -7.423316 0.500000 +v 5.360000 -7.360001 0.500000 +v 5.423315 -7.282851 0.500000 +v 5.470363 -7.194831 0.500000 +v 5.499334 -7.099324 0.500000 +v 5.509117 -7.000000 0.500000 +v 5.499334 -6.900677 0.500000 +v 5.470363 -6.805170 0.500000 +v 5.423316 -6.717150 0.500000 +v 5.282850 -6.576685 0.500000 +v 5.194831 -6.529637 0.500000 +v 5.099324 -6.500666 0.500000 +v 5.000000 -6.490883 0.500000 +v 4.900676 -6.500666 0.500000 +v 4.805170 -6.529637 0.500000 +v 4.717150 -6.576685 0.500000 +v 4.640000 -6.640000 0.500000 +v 4.576685 -6.717150 0.500000 +v 4.529637 -6.805170 0.500000 +v 4.500666 -6.900676 0.500000 +v 4.490883 -7.000000 0.500000 +v 4.500666 -7.099324 0.500000 +v 4.529637 -7.194831 0.500000 +v 4.576685 -7.282850 0.500000 +v 5.600000 -6.400000 0.017797 +v 5.471418 -6.294476 0.017797 +v 5.324719 -6.216063 0.017797 +v 5.165541 -6.167777 0.017797 +v 5.000001 -6.151472 0.017797 +v 4.834462 -6.167776 0.017797 +v 4.675283 -6.216062 0.017797 +v 4.528584 -6.294474 0.017797 +v 4.400001 -6.399999 0.017797 +v 4.294475 -6.528582 0.017797 +v 4.216063 -6.675282 0.017797 +v 4.167776 -6.834459 0.017797 +v 4.151472 -6.999999 0.017797 +v 4.167776 -7.165539 0.017797 +v 4.216062 -7.324717 0.017797 +v 4.294474 -7.471416 0.017797 +v 4.400000 -7.599999 0.017797 +v 4.528583 -7.705525 0.017797 +v 4.675282 -7.783937 0.017797 +v 4.834460 -7.832224 0.017797 +v 5.000000 -7.848528 0.017797 +v 5.165539 -7.832224 0.017797 +v 5.324718 -7.783938 0.017797 +v 5.471417 -7.705525 0.017797 +v 5.600000 -7.600000 0.017797 +v 5.705525 -7.471417 0.017797 +v 5.783938 -7.324718 0.017797 +v 5.832224 -7.165540 0.017797 +v 5.848528 -7.000000 0.017797 +v 5.832224 -6.834460 0.017797 +v 5.783938 -6.675282 0.017797 +v 5.705525 -6.528583 0.017797 +v 5.600000 -6.400000 0.082319 +v 5.705525 -6.528583 0.082319 +v 5.783938 -6.675282 0.082319 +v 5.832224 -6.834460 0.082319 +v 5.848528 -7.000000 0.082319 +v 5.832224 -7.165540 0.082319 +v 5.783938 -7.324718 0.082319 +v 5.705525 -7.471417 0.082319 +v 5.600000 -7.600000 0.082319 +v 5.471417 -7.705525 0.082319 +v 5.324718 -7.783938 0.082319 +v 5.165539 -7.832224 0.082319 +v 5.000000 -7.848528 0.082319 +v 4.834460 -7.832224 0.082319 +v 4.675282 -7.783937 0.082319 +v 4.528583 -7.705525 0.082319 +v 4.400000 -7.599999 0.082319 +v 4.294474 -7.471416 0.082319 +v 4.216062 -7.324717 0.082319 +v 4.167776 -7.165539 0.082319 +v 4.151472 -6.999999 0.082319 +v 4.167776 -6.834459 0.082319 +v 4.216063 -6.675282 0.082319 +v 4.294475 -6.528582 0.082319 +v 4.400001 -6.399999 0.082319 +v 4.528584 -6.294474 0.082319 +v 4.675283 -6.216062 0.082319 +v 4.834462 -6.167776 0.082319 +v 5.000001 -6.151472 0.082319 +v 5.165541 -6.167777 0.082319 +v 5.324719 -6.216063 0.082319 +v 5.471418 -6.294476 0.082319 +v 5.480000 -6.520000 0.200000 +v 5.564420 -6.622867 0.200000 +v 5.627150 -6.740226 0.200000 +v 5.665779 -6.867568 0.200000 +v 5.678823 -7.000000 0.200000 +v 5.665779 -7.132432 0.200000 +v 5.627151 -7.259774 0.200000 +v 5.564420 -7.377133 0.200000 +v 5.480000 -7.480000 0.200000 +v 5.377133 -7.564420 0.200000 +v 5.259774 -7.627151 0.200000 +v 5.132432 -7.665779 0.200000 +v 5.000000 -7.678823 0.200000 +v 4.867568 -7.665779 0.200000 +v 4.740226 -7.627150 0.200000 +v 4.622866 -7.564420 0.200000 +v 4.520000 -7.480000 0.200000 +v 4.435579 -7.377133 0.200000 +v 4.372849 -7.259774 0.200000 +v 4.334221 -7.132431 0.200000 +v 4.321177 -7.000000 0.200000 +v 4.334221 -6.867568 0.200000 +v 4.372850 -6.740225 0.200000 +v 4.435580 -6.622866 0.200000 +v 4.520000 -6.520000 0.200000 +v 4.622867 -6.435579 0.200000 +v 4.740227 -6.372849 0.200000 +v 4.867569 -6.334221 0.200000 +v 5.000001 -6.321177 0.200000 +v 5.132433 -6.334221 0.200000 +v 5.259775 -6.372850 0.200000 +v 5.377135 -6.435580 0.200000 +v 5.311136 -6.534354 0.350000 +v 5.396000 -6.604000 0.350000 +v 5.214314 -6.482601 0.350000 +v 5.109257 -6.450732 0.350000 +v 5.000001 -6.439971 0.350000 +v 4.890745 -6.450732 0.350000 +v 4.785687 -6.482601 0.350000 +v 4.688865 -6.534353 0.350000 +v 4.604001 -6.604000 0.350000 +v 4.534354 -6.688864 0.350000 +v 4.482601 -6.785686 0.350000 +v 4.450732 -6.890743 0.350000 +v 4.439971 -7.000000 0.350000 +v 4.450732 -7.109256 0.350000 +v 4.482601 -7.214314 0.350000 +v 4.534353 -7.311135 0.350000 +v 4.604000 -7.396000 0.350000 +v 4.688865 -7.465647 0.350000 +v 4.785686 -7.517399 0.350000 +v 4.890744 -7.549268 0.350000 +v 5.000000 -7.560029 0.350000 +v 5.109256 -7.549268 0.350000 +v 5.214314 -7.517399 0.350000 +v 5.311135 -7.465647 0.350000 +v 5.396000 -7.396000 0.350000 +v 5.465647 -7.311135 0.350000 +v 5.517399 -7.214314 0.350000 +v 5.549268 -7.109256 0.350000 +v 5.560029 -7.000000 0.350000 +v 5.549268 -6.890744 0.350000 +v 5.517399 -6.785686 0.350000 +v 5.465647 -6.688865 0.350000 +v 5.396000 -6.604000 0.450000 +v 5.465647 -6.688865 0.450000 +v 5.517399 -6.785686 0.450000 +v 5.549268 -6.890744 0.450000 +v 5.560029 -7.000000 0.450000 +v 5.549268 -7.109256 0.450000 +v 5.517399 -7.214314 0.450000 +v 5.465647 -7.311135 0.450000 +v 5.396000 -7.396000 0.450000 +v 5.311135 -7.465647 0.450000 +v 5.214314 -7.517399 0.450000 +v 5.109256 -7.549268 0.450000 +v 5.000000 -7.560029 0.450000 +v 4.890743 -7.549268 0.450000 +v 4.785686 -7.517399 0.450000 +v 4.688864 -7.465646 0.450000 +v 4.604000 -7.396000 0.450000 +v 4.534353 -7.311135 0.450000 +v 4.482601 -7.214314 0.450000 +v 4.450732 -7.109256 0.450000 +v 4.439971 -7.000000 0.450000 +v 4.450732 -6.890744 0.450000 +v 4.482601 -6.785686 0.450000 +v 4.534353 -6.688865 0.450000 +v 4.604000 -6.604000 0.450000 +v 4.688865 -6.534353 0.450000 +v 4.785686 -6.482601 0.450000 +v 4.890744 -6.450732 0.450000 +v 5.000000 -6.439971 0.450000 +v 5.109257 -6.450732 0.450000 +v 5.214314 -6.482601 0.450000 +v 5.311136 -6.534354 0.450000 +v 5.329993 -6.506133 0.250000 +v 5.420000 -6.580000 0.250000 +v 5.227304 -6.451244 0.250000 +v 5.115879 -6.417443 0.250000 +v 5.000001 -6.406030 0.250000 +v 4.884123 -6.417443 0.250000 +v 4.772698 -6.451243 0.250000 +v 4.670009 -6.506132 0.250000 +v 4.580000 -6.579999 0.250000 +v 4.506133 -6.670008 0.250000 +v 4.451244 -6.772697 0.250000 +v 4.417443 -6.884122 0.250000 +v 4.406030 -7.000000 0.250000 +v 4.417443 -7.115877 0.250000 +v 4.451243 -7.227302 0.250000 +v 4.506132 -7.329991 0.250000 +v 4.580000 -7.420000 0.250000 +v 4.670008 -7.493867 0.250000 +v 4.772697 -7.548757 0.250000 +v 4.884122 -7.582557 0.250000 +v 5.000000 -7.593970 0.250000 +v 5.115878 -7.582557 0.250000 +v 5.227302 -7.548757 0.250000 +v 5.329992 -7.493868 0.250000 +v 5.420000 -7.420000 0.250000 +v 5.493868 -7.329992 0.250000 +v 5.548757 -7.227302 0.250000 +v 5.582557 -7.115878 0.250000 +v 5.593970 -7.000000 0.250000 +v 5.582557 -6.884122 0.250000 +v 5.548757 -6.772697 0.250000 +v 5.493868 -6.670008 0.250000 +usemtl Material +s 1 +f 64 1138 1169 33 +f 31 1108 1107 32 +f 30 1109 1108 31 +f 30 29 1110 1109 +f 28 1111 1110 29 +f 27 1112 1111 28 +f 26 1113 1112 27 +f 26 25 1114 1113 +f 24 1115 1114 25 +f 24 23 1116 1115 +f 22 1117 1116 23 +f 21 1118 1117 22 +f 20 1119 1118 21 +f 20 19 1120 1119 +f 18 1121 1120 19 +f 18 17 1122 1121 +f 16 1123 1122 17 +f 16 15 1124 1123 +f 14 1125 1124 15 +f 14 13 1126 1125 +f 12 1127 1126 13 +f 11 1128 1127 12 +f 10 1129 1128 11 +f 10 9 1130 1129 +f 9 8 1131 1130 +f 7 1132 1131 8 +f 7 6 1133 1132 +f 5 1134 1133 6 +f 5 4 1135 1134 +f 3 1136 1135 4 +f 3 2 1137 1136 +f 2 1 1106 1137 +f 63 64 1170 1171 +f 62 63 1171 1172 +f 62 1172 1173 61 +f 60 61 1173 1174 +f 60 1174 1175 59 +f 58 59 1175 1176 +f 58 1176 1177 57 +f 56 57 1177 1178 +f 55 56 1178 1179 +f 55 1179 1180 54 +f 54 1180 1181 53 +f 53 1181 1182 52 +f 51 52 1182 1183 +f 51 1183 1184 50 +f 49 50 1184 1185 +f 49 1185 1186 48 +f 47 48 1186 1187 +f 47 1187 1188 46 +f 45 46 1188 1189 +f 45 1189 1190 44 +f 44 1190 1191 43 +f 43 1191 1192 42 +f 41 42 1192 1193 +f 41 1193 1194 40 +f 39 40 1194 1195 +f 39 1195 1196 38 +f 38 1196 1197 37 +f 37 1197 1198 36 +f 35 36 1198 1199 +f 35 1199 1200 34 +f 34 1200 1201 33 +f 33 1201 1170 64 +f 96 1202 1203 65 +f 95 1204 1202 96 +f 94 1205 1204 95 +f 94 93 1206 1205 +f 92 1207 1206 93 +f 91 1208 1207 92 +f 90 1209 1208 91 +f 90 89 1210 1209 +f 88 1211 1210 89 +f 88 87 1212 1211 +f 86 1213 1212 87 +f 85 1214 1213 86 +f 84 1215 1214 85 +f 84 83 1216 1215 +f 82 1217 1216 83 +f 82 81 1218 1217 +f 80 1219 1218 81 +f 80 79 1220 1219 +f 78 1221 1220 79 +f 78 77 1222 1221 +f 76 1223 1222 77 +f 75 1224 1223 76 +f 74 1225 1224 75 +f 74 73 1226 1225 +f 73 72 1227 1226 +f 71 1228 1227 72 +f 71 70 1229 1228 +f 69 1230 1229 70 +f 69 68 1231 1230 +f 67 1232 1231 68 +f 67 66 1233 1232 +f 66 65 1203 1233 +f 127 128 1234 1235 +f 126 127 1235 1236 +f 126 1236 1237 125 +f 124 125 1237 1238 +f 124 1238 1239 123 +f 122 123 1239 1240 +f 122 1240 1241 121 +f 120 121 1241 1242 +f 119 120 1242 1243 +f 119 1243 1244 118 +f 118 1244 1245 117 +f 117 1245 1246 116 +f 115 116 1246 1247 +f 115 1247 1248 114 +f 113 114 1248 1249 +f 113 1249 1250 112 +f 111 112 1250 1251 +f 111 1251 1252 110 +f 109 110 1252 1253 +f 109 1253 1254 108 +f 108 1254 1255 107 +f 107 1255 1256 106 +f 105 106 1256 1257 +f 105 1257 1258 104 +f 103 104 1258 1259 +f 103 1259 1260 102 +f 102 1260 1261 101 +f 101 1261 1262 100 +f 99 100 1262 1263 +f 99 1263 1264 98 +f 98 1264 1265 97 +f 97 1265 1234 128 +f 32 1 162 131 +f 31 32 131 132 +f 30 31 132 133 +f 30 133 134 29 +f 28 29 134 135 +f 27 28 135 136 +f 26 27 136 137 +f 26 137 138 25 +f 24 25 138 139 +f 24 139 140 23 +f 22 23 140 141 +f 21 22 141 142 +f 20 21 142 143 +f 20 143 144 19 +f 18 19 144 145 +f 18 145 146 17 +f 16 17 146 147 +f 16 147 148 15 +f 14 15 148 149 +f 14 149 150 13 +f 12 13 150 151 +f 11 12 151 152 +f 10 11 152 153 +f 10 153 154 9 +f 9 154 155 8 +f 7 8 155 156 +f 7 156 157 6 +f 5 6 157 158 +f 5 158 159 4 +f 3 4 159 160 +f 3 160 161 2 +f 162 1 2 161 +f 178 194 195 211 +f 194 165 224 195 +f 171 218 197 192 +f 192 197 224 165 +f 164 225 199 190 +f 190 199 217 172 +f 164 187 202 225 +f 187 174 215 202 +f 163 226 204 185 +f 185 204 216 173 +f 163 183 206 226 +f 183 176 213 206 +f 175 181 208 214 +f 181 166 223 208 +f 177 212 210 179 +f 179 210 223 166 +f 177 180 209 212 +f 180 170 219 209 +f 169 182 207 220 +f 182 175 214 207 +f 169 220 205 184 +f 184 205 213 176 +f 168 186 203 221 +f 186 173 216 203 +f 168 221 201 188 +f 188 201 215 174 +f 172 217 200 189 +f 189 200 222 167 +f 171 191 198 218 +f 191 167 222 198 +f 178 211 196 193 +f 193 196 219 170 +f 196 257 234 219 +f 211 242 257 196 +f 198 222 231 255 +f 218 198 255 235 +f 200 253 231 222 +f 217 236 253 200 +f 201 252 238 215 +f 221 232 252 201 +f 203 216 237 250 +f 221 203 250 232 +f 205 248 240 213 +f 220 233 248 205 +f 207 214 239 246 +f 220 207 246 233 +f 209 219 234 244 +f 212 209 244 241 +f 210 243 230 223 +f 212 241 243 210 +f 208 223 230 245 +f 214 208 245 239 +f 206 213 240 247 +f 226 206 247 227 +f 204 249 237 216 +f 226 227 249 204 +f 202 215 238 251 +f 225 202 251 228 +f 199 254 236 217 +f 225 228 254 199 +f 197 256 229 224 +f 218 235 256 197 +f 195 224 229 258 +f 211 195 258 242 +f 242 258 259 275 +f 258 229 288 259 +f 235 282 261 256 +f 256 261 288 229 +f 228 289 263 254 +f 254 263 281 236 +f 228 251 266 289 +f 251 238 279 266 +f 227 290 268 249 +f 249 268 280 237 +f 227 247 270 290 +f 247 240 277 270 +f 239 245 272 278 +f 245 230 287 272 +f 241 276 274 243 +f 243 274 287 230 +f 241 244 273 276 +f 244 234 283 273 +f 233 246 271 284 +f 246 239 278 271 +f 233 284 269 248 +f 248 269 277 240 +f 232 250 267 285 +f 250 237 280 267 +f 232 285 265 252 +f 252 265 279 238 +f 236 281 264 253 +f 253 264 286 231 +f 235 255 262 282 +f 255 231 286 262 +f 242 275 260 257 +f 257 260 283 234 +f 260 321 298 283 +f 275 306 321 260 +f 262 286 295 319 +f 282 262 319 299 +f 264 317 295 286 +f 281 300 317 264 +f 265 316 302 279 +f 285 296 316 265 +f 267 280 301 314 +f 285 267 314 296 +f 269 312 304 277 +f 284 297 312 269 +f 271 278 303 310 +f 284 271 310 297 +f 273 283 298 308 +f 276 273 308 305 +f 274 307 294 287 +f 276 305 307 274 +f 272 287 294 309 +f 278 272 309 303 +f 270 277 304 311 +f 290 270 311 291 +f 268 313 301 280 +f 290 291 313 268 +f 266 279 302 315 +f 289 266 315 292 +f 263 318 300 281 +f 289 292 318 263 +f 261 320 293 288 +f 282 299 320 261 +f 259 288 293 322 +f 275 259 322 306 +f 306 322 323 339 +f 322 293 352 323 +f 299 346 325 320 +f 320 325 352 293 +f 292 353 327 318 +f 318 327 345 300 +f 292 315 330 353 +f 315 302 343 330 +f 291 354 332 313 +f 313 332 344 301 +f 291 311 334 354 +f 311 304 341 334 +f 303 309 336 342 +f 309 294 351 336 +f 305 340 338 307 +f 307 338 351 294 +f 305 308 337 340 +f 308 298 347 337 +f 297 310 335 348 +f 310 303 342 335 +f 297 348 333 312 +f 312 333 341 304 +f 296 314 331 349 +f 314 301 344 331 +f 296 349 329 316 +f 316 329 343 302 +f 300 345 328 317 +f 317 328 350 295 +f 299 319 326 346 +f 319 295 350 326 +f 306 339 324 321 +f 321 324 347 298 +f 324 385 362 347 +f 339 370 385 324 +f 326 350 359 383 +f 346 326 383 363 +f 328 381 359 350 +f 345 364 381 328 +f 329 380 366 343 +f 349 360 380 329 +f 331 344 365 378 +f 349 331 378 360 +f 333 376 368 341 +f 348 361 376 333 +f 335 342 367 374 +f 348 335 374 361 +f 337 347 362 372 +f 340 337 372 369 +f 338 371 358 351 +f 340 369 371 338 +f 336 351 358 373 +f 342 336 373 367 +f 334 341 368 375 +f 354 334 375 355 +f 332 377 365 344 +f 354 355 377 332 +f 330 343 366 379 +f 353 330 379 356 +f 327 382 364 345 +f 353 356 382 327 +f 325 384 357 352 +f 346 363 384 325 +f 323 352 357 386 +f 339 323 386 370 +f 370 386 387 403 +f 386 357 416 387 +f 363 410 389 384 +f 384 389 416 357 +f 356 417 391 382 +f 382 391 409 364 +f 356 379 394 417 +f 379 366 407 394 +f 355 418 396 377 +f 377 396 408 365 +f 355 375 398 418 +f 375 368 405 398 +f 367 373 400 406 +f 373 358 415 400 +f 369 404 402 371 +f 371 402 415 358 +f 369 372 401 404 +f 372 362 411 401 +f 361 374 399 412 +f 374 367 406 399 +f 361 412 397 376 +f 376 397 405 368 +f 360 378 395 413 +f 378 365 408 395 +f 360 413 393 380 +f 380 393 407 366 +f 364 409 392 381 +f 381 392 414 359 +f 363 383 390 410 +f 383 359 414 390 +f 370 403 388 385 +f 385 388 411 362 +f 388 449 426 411 +f 403 434 449 388 +f 390 414 423 447 +f 410 390 447 427 +f 392 445 423 414 +f 409 428 445 392 +f 393 444 430 407 +f 413 424 444 393 +f 395 408 429 442 +f 413 395 442 424 +f 397 440 432 405 +f 412 425 440 397 +f 399 406 431 438 +f 412 399 438 425 +f 401 411 426 436 +f 404 401 436 433 +f 402 435 422 415 +f 404 433 435 402 +f 400 415 422 437 +f 406 400 437 431 +f 398 405 432 439 +f 418 398 439 419 +f 396 441 429 408 +f 418 419 441 396 +f 394 407 430 443 +f 417 394 443 420 +f 391 446 428 409 +f 417 420 446 391 +f 389 448 421 416 +f 410 427 448 389 +f 387 416 421 450 +f 403 387 450 434 +f 434 450 451 467 +f 450 421 480 451 +f 427 474 453 448 +f 448 453 480 421 +f 420 481 455 446 +f 446 455 473 428 +f 420 443 458 481 +f 443 430 471 458 +f 419 482 460 441 +f 441 460 472 429 +f 419 439 462 482 +f 439 432 469 462 +f 431 437 464 470 +f 437 422 479 464 +f 433 468 466 435 +f 435 466 479 422 +f 433 436 465 468 +f 436 426 475 465 +f 425 438 463 476 +f 438 431 470 463 +f 425 476 461 440 +f 440 461 469 432 +f 424 442 459 477 +f 442 429 472 459 +f 424 477 457 444 +f 444 457 471 430 +f 428 473 456 445 +f 445 456 478 423 +f 427 447 454 474 +f 447 423 478 454 +f 434 467 452 449 +f 449 452 475 426 +f 452 513 490 475 +f 467 498 513 452 +f 454 478 487 511 +f 474 454 511 491 +f 456 509 487 478 +f 473 492 509 456 +f 457 508 494 471 +f 477 488 508 457 +f 459 472 493 506 +f 477 459 506 488 +f 461 504 496 469 +f 476 489 504 461 +f 463 470 495 502 +f 476 463 502 489 +f 465 475 490 500 +f 468 465 500 497 +f 466 499 486 479 +f 468 497 499 466 +f 464 479 486 501 +f 470 464 501 495 +f 462 469 496 503 +f 482 462 503 483 +f 460 505 493 472 +f 482 483 505 460 +f 458 471 494 507 +f 481 458 507 484 +f 455 510 492 473 +f 481 484 510 455 +f 453 512 485 480 +f 474 491 512 453 +f 451 480 485 514 +f 467 451 514 498 +f 498 514 515 531 +f 514 485 544 515 +f 491 538 517 512 +f 512 517 544 485 +f 484 545 519 510 +f 510 519 537 492 +f 484 507 522 545 +f 507 494 535 522 +f 483 546 524 505 +f 505 524 536 493 +f 483 503 526 546 +f 503 496 533 526 +f 495 501 528 534 +f 501 486 543 528 +f 497 532 530 499 +f 499 530 543 486 +f 497 500 529 532 +f 500 490 539 529 +f 489 502 527 540 +f 502 495 534 527 +f 489 540 525 504 +f 504 525 533 496 +f 488 506 523 541 +f 506 493 536 523 +f 488 541 521 508 +f 508 521 535 494 +f 492 537 520 509 +f 509 520 542 487 +f 491 511 518 538 +f 511 487 542 518 +f 498 531 516 513 +f 513 516 539 490 +f 516 577 554 539 +f 531 562 577 516 +f 518 542 551 575 +f 538 518 575 555 +f 520 573 551 542 +f 537 556 573 520 +f 521 572 558 535 +f 541 552 572 521 +f 523 536 557 570 +f 541 523 570 552 +f 525 568 560 533 +f 540 553 568 525 +f 527 534 559 566 +f 540 527 566 553 +f 529 539 554 564 +f 532 529 564 561 +f 530 563 550 543 +f 532 561 563 530 +f 528 543 550 565 +f 534 528 565 559 +f 526 533 560 567 +f 546 526 567 547 +f 524 569 557 536 +f 546 547 569 524 +f 522 535 558 571 +f 545 522 571 548 +f 519 574 556 537 +f 545 548 574 519 +f 517 576 549 544 +f 538 555 576 517 +f 515 544 549 578 +f 531 515 578 562 +f 562 578 579 595 +f 578 549 608 579 +f 555 602 581 576 +f 576 581 608 549 +f 548 609 583 574 +f 574 583 601 556 +f 548 571 586 609 +f 571 558 599 586 +f 547 610 588 569 +f 569 588 600 557 +f 547 567 590 610 +f 567 560 597 590 +f 559 565 592 598 +f 565 550 607 592 +f 561 596 594 563 +f 563 594 607 550 +f 561 564 593 596 +f 564 554 603 593 +f 553 566 591 604 +f 566 559 598 591 +f 553 604 589 568 +f 568 589 597 560 +f 552 570 587 605 +f 570 557 600 587 +f 552 605 585 572 +f 572 585 599 558 +f 556 601 584 573 +f 573 584 606 551 +f 555 575 582 602 +f 575 551 606 582 +f 562 595 580 577 +f 577 580 603 554 +f 580 641 618 603 +f 595 626 641 580 +f 582 606 615 639 +f 602 582 639 619 +f 584 637 615 606 +f 601 620 637 584 +f 585 636 622 599 +f 605 616 636 585 +f 587 600 621 634 +f 605 587 634 616 +f 589 632 624 597 +f 604 617 632 589 +f 591 598 623 630 +f 604 591 630 617 +f 593 603 618 628 +f 596 593 628 625 +f 594 627 614 607 +f 596 625 627 594 +f 592 607 614 629 +f 598 592 629 623 +f 590 597 624 631 +f 610 590 631 611 +f 588 633 621 600 +f 610 611 633 588 +f 586 599 622 635 +f 609 586 635 612 +f 583 638 620 601 +f 609 612 638 583 +f 581 640 613 608 +f 602 619 640 581 +f 579 608 613 642 +f 595 579 642 626 +f 626 642 643 659 +f 642 613 672 643 +f 619 666 645 640 +f 640 645 672 613 +f 612 673 647 638 +f 638 647 665 620 +f 612 635 650 673 +f 635 622 663 650 +f 611 674 652 633 +f 633 652 664 621 +f 611 631 654 674 +f 631 624 661 654 +f 623 629 656 662 +f 629 614 671 656 +f 625 660 658 627 +f 627 658 671 614 +f 625 628 657 660 +f 628 618 667 657 +f 617 630 655 668 +f 630 623 662 655 +f 617 668 653 632 +f 632 653 661 624 +f 616 634 651 669 +f 634 621 664 651 +f 616 669 649 636 +f 636 649 663 622 +f 620 665 648 637 +f 637 648 670 615 +f 619 639 646 666 +f 639 615 670 646 +f 626 659 644 641 +f 641 644 667 618 +f 644 705 682 667 +f 659 690 705 644 +f 646 670 679 703 +f 666 646 703 683 +f 648 701 679 670 +f 665 684 701 648 +f 649 700 686 663 +f 669 680 700 649 +f 651 664 685 698 +f 669 651 698 680 +f 653 696 688 661 +f 668 681 696 653 +f 655 662 687 694 +f 668 655 694 681 +f 657 667 682 692 +f 660 657 692 689 +f 658 691 678 671 +f 660 689 691 658 +f 656 671 678 693 +f 662 656 693 687 +f 654 661 688 695 +f 674 654 695 675 +f 652 697 685 664 +f 674 675 697 652 +f 650 663 686 699 +f 673 650 699 676 +f 647 702 684 665 +f 673 676 702 647 +f 645 704 677 672 +f 666 683 704 645 +f 643 672 677 706 +f 659 643 706 690 +f 690 706 707 723 +f 706 677 736 707 +f 683 730 709 704 +f 704 709 736 677 +f 676 737 711 702 +f 702 711 729 684 +f 676 699 714 737 +f 699 686 727 714 +f 675 738 716 697 +f 697 716 728 685 +f 675 695 718 738 +f 695 688 725 718 +f 687 693 720 726 +f 693 678 735 720 +f 689 724 722 691 +f 691 722 735 678 +f 689 692 721 724 +f 692 682 731 721 +f 681 694 719 732 +f 694 687 726 719 +f 681 732 717 696 +f 696 717 725 688 +f 680 698 715 733 +f 698 685 728 715 +f 680 733 713 700 +f 700 713 727 686 +f 684 729 712 701 +f 701 712 734 679 +f 683 703 710 730 +f 703 679 734 710 +f 690 723 708 705 +f 705 708 731 682 +f 708 769 746 731 +f 723 754 769 708 +f 710 734 743 767 +f 730 710 767 747 +f 712 765 743 734 +f 729 748 765 712 +f 713 764 750 727 +f 733 744 764 713 +f 715 728 749 762 +f 733 715 762 744 +f 717 760 752 725 +f 732 745 760 717 +f 719 726 751 758 +f 732 719 758 745 +f 721 731 746 756 +f 724 721 756 753 +f 722 755 742 735 +f 724 753 755 722 +f 720 735 742 757 +f 726 720 757 751 +f 718 725 752 759 +f 738 718 759 739 +f 716 761 749 728 +f 738 739 761 716 +f 714 727 750 763 +f 737 714 763 740 +f 711 766 748 729 +f 737 740 766 711 +f 709 768 741 736 +f 730 747 768 709 +f 707 736 741 770 +f 723 707 770 754 +f 754 770 771 787 +f 770 741 800 771 +f 747 794 773 768 +f 768 773 800 741 +f 740 801 775 766 +f 766 775 793 748 +f 740 763 778 801 +f 763 750 791 778 +f 739 802 780 761 +f 761 780 792 749 +f 739 759 782 802 +f 759 752 789 782 +f 751 757 784 790 +f 757 742 799 784 +f 753 788 786 755 +f 755 786 799 742 +f 753 756 785 788 +f 756 746 795 785 +f 745 758 783 796 +f 758 751 790 783 +f 745 796 781 760 +f 760 781 789 752 +f 744 762 779 797 +f 762 749 792 779 +f 744 797 777 764 +f 764 777 791 750 +f 748 793 776 765 +f 765 776 798 743 +f 747 767 774 794 +f 767 743 798 774 +f 754 787 772 769 +f 769 772 795 746 +f 772 833 810 795 +f 787 818 833 772 +f 774 798 807 831 +f 794 774 831 811 +f 776 829 807 798 +f 793 812 829 776 +f 777 828 814 791 +f 797 808 828 777 +f 779 792 813 826 +f 797 779 826 808 +f 781 824 816 789 +f 796 809 824 781 +f 783 790 815 822 +f 796 783 822 809 +f 785 795 810 820 +f 788 785 820 817 +f 786 819 806 799 +f 788 817 819 786 +f 784 799 806 821 +f 790 784 821 815 +f 782 789 816 823 +f 802 782 823 803 +f 780 825 813 792 +f 802 803 825 780 +f 778 791 814 827 +f 801 778 827 804 +f 775 830 812 793 +f 801 804 830 775 +f 773 832 805 800 +f 794 811 832 773 +f 771 800 805 834 +f 787 771 834 818 +f 818 834 835 851 +f 834 805 864 835 +f 811 858 837 832 +f 832 837 864 805 +f 804 865 839 830 +f 830 839 857 812 +f 804 827 842 865 +f 827 814 855 842 +f 803 866 844 825 +f 825 844 856 813 +f 803 823 846 866 +f 823 816 853 846 +f 815 821 848 854 +f 821 806 863 848 +f 817 852 850 819 +f 819 850 863 806 +f 817 820 849 852 +f 820 810 859 849 +f 809 822 847 860 +f 822 815 854 847 +f 809 860 845 824 +f 824 845 853 816 +f 808 826 843 861 +f 826 813 856 843 +f 808 861 841 828 +f 828 841 855 814 +f 812 857 840 829 +f 829 840 862 807 +f 811 831 838 858 +f 831 807 862 838 +f 818 851 836 833 +f 833 836 859 810 +f 836 897 874 859 +f 851 882 897 836 +f 838 862 871 895 +f 858 838 895 875 +f 840 893 871 862 +f 857 876 893 840 +f 841 892 878 855 +f 861 872 892 841 +f 843 856 877 890 +f 861 843 890 872 +f 845 888 880 853 +f 860 873 888 845 +f 847 854 879 886 +f 860 847 886 873 +f 849 859 874 884 +f 852 849 884 881 +f 850 883 870 863 +f 852 881 883 850 +f 848 863 870 885 +f 854 848 885 879 +f 846 853 880 887 +f 866 846 887 867 +f 844 889 877 856 +f 866 867 889 844 +f 842 855 878 891 +f 865 842 891 868 +f 839 894 876 857 +f 865 868 894 839 +f 837 896 869 864 +f 858 875 896 837 +f 835 864 869 898 +f 851 835 898 882 +f 882 898 899 915 +f 898 869 928 899 +f 875 922 901 896 +f 896 901 928 869 +f 868 929 903 894 +f 894 903 921 876 +f 868 891 906 929 +f 891 878 919 906 +f 867 930 908 889 +f 889 908 920 877 +f 867 887 910 930 +f 887 880 917 910 +f 879 885 912 918 +f 885 870 927 912 +f 881 916 914 883 +f 883 914 927 870 +f 881 884 913 916 +f 884 874 923 913 +f 873 886 911 924 +f 886 879 918 911 +f 873 924 909 888 +f 888 909 917 880 +f 872 890 907 925 +f 890 877 920 907 +f 872 925 905 892 +f 892 905 919 878 +f 876 921 904 893 +f 893 904 926 871 +f 875 895 902 922 +f 895 871 926 902 +f 882 915 900 897 +f 897 900 923 874 +f 900 961 938 923 +f 915 946 961 900 +f 902 926 935 959 +f 922 902 959 939 +f 904 957 935 926 +f 921 940 957 904 +f 905 956 942 919 +f 925 936 956 905 +f 907 920 941 954 +f 925 907 954 936 +f 909 952 944 917 +f 924 937 952 909 +f 911 918 943 950 +f 924 911 950 937 +f 913 923 938 948 +f 916 913 948 945 +f 914 947 934 927 +f 916 945 947 914 +f 912 927 934 949 +f 918 912 949 943 +f 910 917 944 951 +f 930 910 951 931 +f 908 953 941 920 +f 930 931 953 908 +f 906 919 942 955 +f 929 906 955 932 +f 903 958 940 921 +f 929 932 958 903 +f 901 960 933 928 +f 922 939 960 901 +f 899 928 933 962 +f 915 899 962 946 +f 946 962 963 977 +f 962 933 989 963 +f 939 984 965 960 +f 960 965 989 933 +f 932 990 967 958 +f 958 967 983 940 +f 932 955 969 990 +f 955 942 981 969 +f 931 991 970 953 +f 953 970 982 941 +f 931 951 972 991 +f 951 944 979 972 +f 943 949 974 980 +f 949 934 988 974 +f 945 978 976 947 +f 947 976 988 934 +f 945 948 975 978 +f 948 938 985 975 +f 937 950 973 986 +f 950 943 980 973 +f 937 986 971 952 +f 952 971 979 944 +f 936 954 1012 992 +f 954 941 982 1012 +f 936 992 1017 956 +f 956 1017 981 942 +f 940 983 968 957 +f 957 968 987 935 +f 939 959 966 984 +f 959 935 987 966 +f 946 977 964 961 +f 961 964 985 938 +f 989 965 1043 963 +f 990 969 1042 967 +f 991 972 1041 970 +f 988 976 1040 974 +f 985 1003 1039 975 +f 993 1004 1038 1002 +f 986 973 1037 1005 +f 986 1005 1036 971 +f 993 1010 1035 1004 +f 992 1012 1034 1011 +f 992 1011 1033 1017 +f 993 1019 1032 1010 +f 987 968 1031 1018 +f 987 1018 1030 966 +f 993 1002 1029 1019 +f 985 964 1028 1003 +f 977 1027 1028 964 +f 1001 1026 1028 1027 +f 997 1003 1028 1026 +f 997 1026 1029 1002 +f 1001 1024 1029 1026 +f 995 1019 1029 1024 +f 995 1024 1030 1018 +f 1001 1025 1030 1024 +f 984 966 1030 1025 +f 983 1023 1031 968 +f 1000 1022 1031 1023 +f 995 1018 1031 1022 +f 995 1022 1032 1019 +f 1000 1020 1032 1022 +f 994 1010 1032 1020 +f 994 1020 1033 1011 +f 1000 1021 1033 1020 +f 981 1017 1033 1021 +f 982 1016 1034 1012 +f 999 1015 1034 1016 +f 994 1011 1034 1015 +f 994 1015 1035 1010 +f 999 1013 1035 1015 +f 996 1004 1035 1013 +f 996 1013 1036 1005 +f 999 1014 1036 1013 +f 979 971 1036 1014 +f 980 1009 1037 973 +f 998 1008 1037 1009 +f 996 1005 1037 1008 +f 996 1008 1038 1004 +f 998 1006 1038 1008 +f 997 1002 1038 1006 +f 997 1006 1039 1003 +f 998 1007 1039 1006 +f 978 975 1039 1007 +f 978 1007 1040 976 +f 998 1009 1040 1007 +f 980 974 1040 1009 +f 979 1014 1041 972 +f 999 1016 1041 1014 +f 982 970 1041 1016 +f 981 1021 1042 969 +f 1000 1023 1042 1021 +f 983 967 1042 1023 +f 984 1025 1043 965 +f 1001 1027 1043 1025 +f 977 963 1043 1027 +f 1093 183 163 1092 +f 1093 176 183 +f 1094 169 184 +f 1094 182 169 +f 1095 181 175 +f 1095 175 182 1094 +f 1094 184 176 1093 +f 1096 166 181 1095 +f 1092 163 185 1091 +f 129 1091 185 173 +f 129 173 186 1090 +f 1088 168 1087 +f 1089 168 1088 +f 1090 186 168 1089 +f 1087 168 1086 +f 1086 168 1085 +f 1085 168 188 1084 +f 1084 188 174 1083 +f 1083 174 187 1082 +f 1082 187 164 1081 +f 1078 1055 1075 1077 +f 1078 1062 1055 +f 1079 1069 1054 +f 1079 1056 1069 +f 1080 1057 1063 +f 1080 1063 1056 1079 +f 1079 1054 1062 1078 +f 1081 1072 1057 1080 +f 1077 1075 1053 1076 +f 130 1076 1053 1065 +f 130 1065 1052 1105 +f 1103 1070 1102 +f 1104 1070 1103 +f 1105 1052 1070 1104 +f 1102 1070 1101 +f 1101 1070 1100 +f 1100 1070 1050 1099 +f 1099 1050 1064 1098 +f 1098 1064 1051 1097 +f 1097 1051 1074 1096 +f 1106 1138 1139 1137 +f 1137 1139 1140 1136 +f 1136 1140 1141 1135 +f 1135 1141 1142 1134 +f 1134 1142 1143 1133 +f 1133 1143 1144 1132 +f 1132 1144 1145 1131 +f 1131 1145 1146 1130 +f 1130 1146 1147 1129 +f 1129 1147 1148 1128 +f 1128 1148 1149 1127 +f 1127 1149 1150 1126 +f 1126 1150 1151 1125 +f 1125 1151 1152 1124 +f 1124 1152 1153 1123 +f 1123 1153 1154 1122 +f 1122 1154 1155 1121 +f 1121 1155 1156 1120 +f 1120 1156 1157 1119 +f 1119 1157 1158 1118 +f 1118 1158 1159 1117 +f 1117 1159 1160 1116 +f 1116 1160 1161 1115 +f 1115 1161 1162 1114 +f 1114 1162 1163 1113 +f 1113 1163 1164 1112 +f 1112 1164 1165 1111 +f 1111 1165 1166 1110 +f 1110 1166 1167 1109 +f 1109 1167 1168 1108 +f 1108 1168 1169 1107 +f 1106 1 32 1107 +f 1168 34 33 1169 +f 1167 35 34 1168 +f 1166 36 35 1167 +f 1165 37 36 1166 +f 1164 38 37 1165 +f 1163 39 38 1164 +f 1162 40 39 1163 +f 1161 41 40 1162 +f 1160 42 41 1161 +f 1159 43 42 1160 +f 1158 44 43 1159 +f 1157 45 44 1158 +f 1156 46 45 1157 +f 1155 47 46 1156 +f 1154 48 47 1155 +f 1153 49 48 1154 +f 1152 50 49 1153 +f 1151 51 50 1152 +f 1150 52 51 1151 +f 1149 53 52 1150 +f 1148 54 53 1149 +f 1147 55 54 1148 +f 1146 56 55 1147 +f 1145 57 56 1146 +f 1144 58 57 1145 +f 1143 59 58 1144 +f 1142 60 59 1143 +f 1141 61 60 1142 +f 1140 62 61 1141 +f 1139 63 62 1140 +f 1138 64 63 1139 +f 1138 1106 1107 1169 +f 1265 1091 129 1234 +f 1264 1092 1091 1265 +f 1263 1093 1092 1264 +f 1262 1094 1093 1263 +f 1261 1095 1094 1262 +f 1260 1096 1095 1261 +f 1259 1097 1096 1260 +f 1258 1098 1097 1259 +f 1257 1099 1098 1258 +f 1256 1100 1099 1257 +f 1255 1101 1100 1256 +f 1254 1102 1101 1255 +f 1253 1103 1102 1254 +f 1252 1104 1103 1253 +f 1251 1105 1104 1252 +f 1250 130 1105 1251 +f 1249 1076 130 1250 +f 1248 1077 1076 1249 +f 1247 1078 1077 1248 +f 1246 1079 1078 1247 +f 1245 1080 1079 1246 +f 1244 1081 1080 1245 +f 1243 1082 1081 1244 +f 1242 1083 1082 1243 +f 1241 1084 1083 1242 +f 1240 1085 1084 1241 +f 1239 1086 1085 1240 +f 1238 1087 1086 1239 +f 1237 1088 1087 1238 +f 1236 1089 1088 1237 +f 1235 1090 1089 1236 +f 1234 129 1090 1235 +f 1203 128 127 1233 +f 1233 127 126 1232 +f 1232 126 125 1231 +f 1231 125 124 1230 +f 1230 124 123 1229 +f 1229 123 122 1228 +f 1228 122 121 1227 +f 1227 121 120 1226 +f 1226 120 119 1225 +f 1225 119 118 1224 +f 1224 118 117 1223 +f 1223 117 116 1222 +f 1222 116 115 1221 +f 1221 115 114 1220 +f 1220 114 113 1219 +f 1219 113 112 1218 +f 1218 112 111 1217 +f 1217 111 110 1216 +f 1216 110 109 1215 +f 1215 109 108 1214 +f 1214 108 107 1213 +f 1213 107 106 1212 +f 1212 106 105 1211 +f 1211 105 104 1210 +f 1210 104 103 1209 +f 1209 103 102 1208 +f 1208 102 101 1207 +f 1207 101 100 1206 +f 1206 100 99 1205 +f 1205 99 98 1204 +f 1204 98 97 1202 +f 1202 97 128 1203 +f 1201 1266 1267 1170 +f 1200 1268 1266 1201 +f 1199 1269 1268 1200 +f 1198 1270 1269 1199 +f 1197 1271 1270 1198 +f 1196 1272 1271 1197 +f 1195 1273 1272 1196 +f 1194 1274 1273 1195 +f 1193 1275 1274 1194 +f 1192 1276 1275 1193 +f 1191 1277 1276 1192 +f 1190 1278 1277 1191 +f 1189 1279 1278 1190 +f 1188 1280 1279 1189 +f 1187 1281 1280 1188 +f 1186 1282 1281 1187 +f 1185 1283 1282 1186 +f 1184 1284 1283 1185 +f 1183 1285 1284 1184 +f 1182 1286 1285 1183 +f 1181 1287 1286 1182 +f 1180 1288 1287 1181 +f 1179 1289 1288 1180 +f 1178 1290 1289 1179 +f 1177 1291 1290 1178 +f 1176 1292 1291 1177 +f 1175 1293 1292 1176 +f 1174 1294 1293 1175 +f 1173 1295 1294 1174 +f 1172 1296 1295 1173 +f 1171 1297 1296 1172 +f 1170 1267 1297 1171 +f 1267 65 66 1297 +f 1297 66 67 1296 +f 1296 67 68 1295 +f 1295 68 69 1294 +f 1294 69 70 1293 +f 1293 70 71 1292 +f 1292 71 72 1291 +f 1291 72 73 1290 +f 1290 73 74 1289 +f 1289 74 75 1288 +f 1288 75 76 1287 +f 1287 76 77 1286 +f 1286 77 78 1285 +f 1285 78 79 1284 +f 1284 79 80 1283 +f 1283 80 81 1282 +f 1282 81 82 1281 +f 1281 82 83 1280 +f 1280 83 84 1279 +f 1279 84 85 1278 +f 1278 85 86 1277 +f 1277 86 87 1276 +f 1276 87 88 1275 +f 1275 88 89 1274 +f 1274 89 90 1273 +f 1273 90 91 1272 +f 1272 91 92 1271 +f 1271 92 93 1270 +f 1270 93 94 1269 +f 1269 94 95 1268 +f 1268 95 96 1266 +f 1266 96 65 1267 diff --git a/Graph3D/Chess3D/king.obj b/Graph3D/Chess3D/king.obj new file mode 100644 index 0000000..22d9a0c --- /dev/null +++ b/Graph3D/Chess3D/king.obj @@ -0,0 +1,1463 @@ +# Blender3D v245 OBJ File: chess2.blend +# www.blender3d.org +v 1.783787 -6.674918 0.000000 +v 1.832147 -6.834074 0.000000 +v 1.848528 -6.999606 0.000000 +v 1.832301 -7.165153 0.000000 +v 1.784088 -7.324354 0.000000 +v 1.705745 -7.471089 0.000000 +v 1.600279 -7.599721 0.000000 +v 1.471745 -7.705306 0.000000 +v 1.325082 -7.783787 0.000000 +v 1.165926 -7.832147 0.000000 +v 1.000394 -7.848528 0.000000 +v 0.834847 -7.832301 0.000000 +v 0.675646 -7.784088 0.000000 +v 0.528911 -7.705744 0.000000 +v 0.400278 -7.600278 0.000000 +v 0.294693 -7.471744 0.000000 +v 0.216213 -7.325081 0.000000 +v 0.167853 -7.165926 0.000000 +v 0.151472 -7.000393 0.000000 +v 0.167699 -6.834846 0.000000 +v 0.215912 -6.675646 0.000000 +v 0.294256 -6.528910 0.000000 +v 0.399722 -6.400278 0.000000 +v 0.528256 -6.294693 0.000000 +v 0.674919 -6.216213 0.000000 +v 0.834075 -6.167853 0.000000 +v 0.999607 -6.151472 0.000000 +v 1.165154 -6.167699 0.000000 +v 1.324355 -6.215912 0.000000 +v 1.471090 -6.294257 0.000000 +v 1.599722 -6.399723 0.000000 +v 1.705307 -6.528257 0.000000 +v 1.705307 -6.528257 0.100000 +v 1.599722 -6.399723 0.100000 +v 1.471090 -6.294257 0.100000 +v 1.324355 -6.215912 0.100000 +v 1.165154 -6.167699 0.100000 +v 0.999607 -6.151472 0.100000 +v 0.834075 -6.167853 0.100000 +v 0.674919 -6.216213 0.100000 +v 0.528256 -6.294693 0.100000 +v 0.399722 -6.400278 0.100000 +v 0.294256 -6.528910 0.100000 +v 0.215912 -6.675646 0.100000 +v 0.167699 -6.834846 0.100000 +v 0.151472 -7.000393 0.100000 +v 0.167853 -7.165926 0.100000 +v 0.216213 -7.325081 0.100000 +v 0.294693 -7.471744 0.100000 +v 0.400278 -7.600278 0.100000 +v 0.528911 -7.705744 0.100000 +v 0.675646 -7.784088 0.100000 +v 0.834847 -7.832301 0.100000 +v 1.000394 -7.848528 0.100000 +v 1.165926 -7.832147 0.100000 +v 1.325082 -7.783787 0.100000 +v 1.471745 -7.705306 0.100000 +v 1.600279 -7.599721 0.100000 +v 1.705745 -7.471089 0.100000 +v 1.784088 -7.324354 0.100000 +v 1.832301 -7.165153 0.100000 +v 1.848528 -6.999606 0.100000 +v 1.832147 -6.834074 0.100000 +v 1.783787 -6.674918 0.100000 +v 1.548651 -6.772443 0.200000 +v 1.582503 -6.883852 0.200000 +v 1.593970 -6.999724 0.200000 +v 1.582611 -7.115607 0.200000 +v 1.548862 -7.227047 0.200000 +v 1.494021 -7.329762 0.200000 +v 1.420195 -7.419805 0.200000 +v 1.330221 -7.493714 0.200000 +v 1.227557 -7.548651 0.200000 +v 1.116148 -7.582503 0.200000 +v 1.000276 -7.593969 0.200000 +v 0.884393 -7.582610 0.200000 +v 0.772952 -7.548862 0.200000 +v 0.670237 -7.494021 0.200000 +v 0.580195 -7.420195 0.200000 +v 0.506285 -7.330221 0.200000 +v 0.451349 -7.227557 0.200000 +v 0.417497 -7.116148 0.200000 +v 0.406030 -7.000276 0.200000 +v 0.417390 -6.884392 0.200000 +v 0.451138 -6.772952 0.200000 +v 0.505979 -6.670237 0.200000 +v 0.579805 -6.580194 0.200000 +v 0.669779 -6.506285 0.200000 +v 0.772444 -6.451349 0.200000 +v 0.883853 -6.417497 0.200000 +v 0.999725 -6.406030 0.200000 +v 1.115608 -6.417390 0.200000 +v 1.227048 -6.451138 0.200000 +v 1.329763 -6.505980 0.200000 +v 1.419806 -6.579806 0.200000 +v 1.493715 -6.669780 0.200000 +v 1.543087 -6.636758 0.300000 +v 1.461786 -6.537786 0.300000 +v 1.362740 -6.456577 0.300000 +v 1.249753 -6.396252 0.300000 +v 1.127169 -6.359128 0.300000 +v 0.999698 -6.346633 0.300000 +v 0.872238 -6.359247 0.300000 +v 0.749688 -6.396484 0.300000 +v 0.636757 -6.456914 0.300000 +v 0.537786 -6.538214 0.300000 +v 0.456577 -6.637261 0.300000 +v 0.396252 -6.750247 0.300000 +v 0.359129 -6.872831 0.300000 +v 0.346633 -7.000303 0.300000 +v 0.359247 -7.127763 0.300000 +v 0.396484 -7.250312 0.300000 +v 0.456914 -7.363243 0.300000 +v 0.538214 -7.462214 0.300000 +v 0.637261 -7.543423 0.300000 +v 0.750248 -7.603748 0.300000 +v 0.872832 -7.640872 0.300000 +v 1.000303 -7.653367 0.300000 +v 1.127763 -7.640753 0.300000 +v 1.250313 -7.603516 0.300000 +v 1.363243 -7.543086 0.300000 +v 1.462215 -7.461785 0.300000 +v 1.543423 -7.362739 0.300000 +v 1.603748 -7.249752 0.300000 +v 1.640872 -7.127168 0.300000 +v 1.653367 -6.999697 0.300000 +v 1.640753 -6.872237 0.300000 +v 1.603516 -6.749687 0.300000 +v 1.482813 -6.799750 0.400000 +v 1.512603 -6.897789 0.400000 +v 1.522693 -6.999757 0.400000 +v 1.512697 -7.101734 0.400000 +v 1.482998 -7.199802 0.400000 +v 1.434739 -7.290191 0.400000 +v 1.369772 -7.369428 0.400000 +v 1.290595 -7.434469 0.400000 +v 1.200250 -7.482813 0.400000 +v 1.102211 -7.512602 0.400000 +v 1.000243 -7.522693 0.400000 +v 0.898266 -7.512697 0.400000 +v 0.800198 -7.482998 0.400000 +v 0.709809 -7.434738 0.400000 +v 0.630572 -7.369771 0.400000 +v 0.565531 -7.290595 0.400000 +v 0.517187 -7.200250 0.400000 +v 0.487397 -7.102210 0.400000 +v 0.477307 -7.000242 0.400000 +v 0.487303 -6.898265 0.400000 +v 0.517002 -6.800198 0.400000 +v 0.565262 -6.709808 0.400000 +v 0.630229 -6.630571 0.400000 +v 0.709406 -6.565531 0.400000 +v 0.799750 -6.517187 0.400000 +v 0.897790 -6.487397 0.400000 +v 0.999758 -6.477307 0.400000 +v 1.101735 -6.487303 0.400000 +v 1.199803 -6.517002 0.400000 +v 1.290192 -6.565262 0.400000 +v 1.369429 -6.630229 0.400000 +v 1.434469 -6.709406 0.400000 +v 1.260682 -6.825644 1.400000 +v 1.221657 -6.778137 1.400000 +v 1.174115 -6.739157 1.400000 +v 1.119882 -6.710201 1.400000 +v 1.061041 -6.692382 1.400000 +v 0.999855 -6.686384 1.400000 +v 0.938674 -6.692439 1.400000 +v 0.879850 -6.710312 1.400000 +v 0.825643 -6.739318 1.400000 +v 0.778137 -6.778343 1.400000 +v 0.739157 -6.825885 1.400000 +v 0.710201 -6.880119 1.400000 +v 0.692382 -6.938959 1.400000 +v 0.686384 -7.000145 1.400000 +v 0.692438 -7.061326 1.400000 +v 0.710312 -7.120150 1.400000 +v 0.739319 -7.174356 1.400000 +v 0.778343 -7.221863 1.400000 +v 0.825885 -7.260843 1.400000 +v 0.880119 -7.289799 1.400000 +v 0.938959 -7.307618 1.400000 +v 1.000146 -7.313616 1.400000 +v 1.061326 -7.307561 1.400000 +v 1.120150 -7.289688 1.400000 +v 1.174357 -7.260681 1.400000 +v 1.221863 -7.221657 1.400000 +v 1.260843 -7.174115 1.400000 +v 1.289799 -7.119881 1.400000 +v 1.307618 -7.061040 1.400000 +v 1.313616 -6.999855 1.400000 +v 1.307562 -6.938673 1.400000 +v 1.289688 -6.879850 1.400000 +v 1.579375 -6.759700 1.400000 +v 1.615123 -6.877347 1.400000 +v 1.627232 -6.999709 1.400000 +v 1.615237 -7.122081 1.400000 +v 1.579598 -7.239762 1.400000 +v 1.521686 -7.348229 1.400000 +v 1.443726 -7.443314 1.400000 +v 1.348714 -7.521362 1.400000 +v 1.240300 -7.579375 1.400000 +v 1.122653 -7.615123 1.400000 +v 1.000291 -7.627232 1.400000 +v 0.877919 -7.615237 1.400000 +v 0.760238 -7.579598 1.400000 +v 0.651771 -7.521686 1.400000 +v 0.556686 -7.443726 1.400000 +v 0.478637 -7.348713 1.400000 +v 0.420624 -7.240300 1.400000 +v 0.384877 -7.122652 1.400000 +v 0.372768 -7.000291 1.400000 +v 0.384763 -6.877918 1.400000 +v 0.420402 -6.760237 1.400000 +v 0.478314 -6.651770 1.400000 +v 0.556275 -6.556685 1.400000 +v 0.651287 -6.478637 1.400000 +v 0.759700 -6.420624 1.400000 +v 0.877348 -6.384877 1.400000 +v 0.999710 -6.372768 1.400000 +v 1.122082 -6.384763 1.400000 +v 1.239763 -6.420402 1.400000 +v 1.348230 -6.478314 1.400000 +v 1.443315 -6.556275 1.400000 +v 1.521363 -6.651287 1.400000 +v 1.521363 -6.651287 2.200000 +v 1.443315 -6.556275 2.100000 +v 1.348230 -6.478314 2.200000 +v 1.239763 -6.420402 2.100000 +v 1.122082 -6.384764 2.200000 +v 0.999710 -6.372768 2.100000 +v 0.877348 -6.384877 2.200000 +v 0.759700 -6.420624 2.100000 +v 0.651287 -6.478637 2.200000 +v 0.556275 -6.556685 2.100000 +v 0.478314 -6.651770 2.200000 +v 0.420402 -6.760237 2.100000 +v 0.384763 -6.877918 2.200000 +v 0.372768 -7.000291 2.100000 +v 0.384877 -7.122652 2.200000 +v 0.420624 -7.240300 2.100000 +v 0.478637 -7.348713 2.200000 +v 0.556686 -7.443726 2.100000 +v 0.651771 -7.521686 2.200000 +v 0.760238 -7.579598 2.100000 +v 0.877919 -7.615237 2.200000 +v 1.000291 -7.627232 2.100000 +v 1.122653 -7.615123 2.200000 +v 1.240300 -7.579375 2.100000 +v 1.348714 -7.521362 2.200000 +v 1.443726 -7.443314 2.100000 +v 1.521686 -7.348229 2.200000 +v 1.579598 -7.239762 2.100000 +v 1.615237 -7.122081 2.200000 +v 1.627232 -6.999709 2.100000 +v 1.615123 -6.877347 2.200000 +v 1.579375 -6.759700 2.100000 +v 1.463500 -6.807760 2.100000 +v 1.492098 -6.901878 2.200000 +v 1.501786 -6.999767 2.100000 +v 1.492189 -7.097665 2.200000 +v 1.463679 -7.191810 2.100000 +v 1.417349 -7.278584 2.200000 +v 1.354981 -7.354651 2.100000 +v 1.278971 -7.417090 2.200000 +v 1.192240 -7.463500 2.100000 +v 1.098122 -7.492098 2.200000 +v 1.000233 -7.501786 2.100000 +v 0.902335 -7.492189 2.200000 +v 0.808190 -7.463678 2.100000 +v 0.721416 -7.417349 2.200000 +v 0.645349 -7.354980 2.100000 +v 0.582910 -7.278971 2.200000 +v 0.536500 -7.192240 2.100000 +v 0.507901 -7.098122 2.200000 +v 0.498214 -7.000233 2.100000 +v 0.507811 -6.902335 2.200000 +v 0.536322 -6.808190 2.100000 +v 0.582651 -6.721416 2.200000 +v 0.645020 -6.645349 2.100000 +v 0.721030 -6.582910 2.200000 +v 0.807760 -6.536500 2.100000 +v 0.901879 -6.507901 2.200000 +v 0.999768 -6.498215 2.100000 +v 1.097666 -6.507811 2.200000 +v 1.191810 -6.536322 2.100000 +v 1.278584 -6.582652 2.200000 +v 1.354652 -6.645020 2.100000 +v 1.417090 -6.721030 2.200000 +v 1.417090 -6.721030 2.000000 +v 1.354652 -6.645020 2.000000 +v 1.278584 -6.582652 2.000000 +v 1.191810 -6.536322 2.000000 +v 1.097666 -6.507811 2.000000 +v 0.999768 -6.498215 2.000000 +v 0.901879 -6.507901 2.000000 +v 0.807760 -6.536500 2.000000 +v 0.721030 -6.582910 2.000000 +v 0.645020 -6.645349 2.000000 +v 0.582651 -6.721416 2.000000 +v 0.536322 -6.808190 2.000000 +v 0.507811 -6.902335 2.000000 +v 0.498214 -7.000233 2.000000 +v 0.507901 -7.098122 2.000000 +v 0.536500 -7.192240 2.000000 +v 0.582910 -7.278971 2.000000 +v 0.645349 -7.354980 2.000000 +v 0.721416 -7.417349 2.000000 +v 0.808190 -7.463678 2.000000 +v 0.902335 -7.492189 2.000000 +v 1.000233 -7.501786 2.000000 +v 1.098122 -7.492098 2.000000 +v 1.192240 -7.463500 2.000000 +v 1.278971 -7.417090 2.000000 +v 1.354981 -7.354651 2.000000 +v 1.417349 -7.278584 2.000000 +v 1.463679 -7.191810 2.000000 +v 1.492189 -7.097665 2.000000 +v 1.501786 -6.999767 2.000000 +v 1.492098 -6.901878 2.000000 +v 1.463500 -6.807760 2.000000 +v 1.370800 -6.846208 2.000000 +v 1.393679 -6.921503 2.000000 +v 1.401428 -6.999814 2.000000 +v 1.393752 -7.078132 2.000000 +v 1.370943 -7.153448 2.000000 +v 1.333879 -7.222867 2.000000 +v 1.283985 -7.283721 2.000000 +v 1.223177 -7.333672 2.000000 +v 1.153792 -7.370800 2.000000 +v 1.078498 -7.393679 2.000000 +v 1.000186 -7.401429 2.000000 +v 0.921868 -7.393752 2.000000 +v 0.846552 -7.370943 2.000000 +v 0.777133 -7.333879 2.000000 +v 0.716279 -7.283985 2.000000 +v 0.666328 -7.223176 2.000000 +v 0.629200 -7.153792 2.000000 +v 0.606321 -7.078497 2.000000 +v 0.598572 -7.000186 2.000000 +v 0.606248 -6.921868 2.000000 +v 0.629057 -6.846552 2.000000 +v 0.666121 -6.777133 2.000000 +v 0.716016 -6.716279 2.000000 +v 0.776824 -6.666327 2.000000 +v 0.846208 -6.629200 2.000000 +v 0.921503 -6.606321 2.000000 +v 0.999814 -6.598572 2.000000 +v 1.078133 -6.606248 2.000000 +v 1.153448 -6.629057 2.000000 +v 1.222867 -6.666121 2.000000 +v 1.283721 -6.716016 2.000000 +v 1.333672 -6.776824 2.000000 +v 1.200204 -6.866094 2.000000 +v 1.170233 -6.829609 2.000000 +v 1.133720 -6.799673 2.000000 +v 1.092069 -6.777434 2.000000 +v 1.046880 -6.763749 2.000000 +v 0.999888 -6.759143 2.000000 +v 0.952902 -6.763793 2.000000 +v 0.907725 -6.777520 2.000000 +v 0.866094 -6.799797 2.000000 +v 0.829609 -6.829767 2.000000 +v 0.799673 -6.866280 2.000000 +v 0.777434 -6.907931 2.000000 +v 0.763749 -6.953121 2.000000 +v 0.759143 -7.000112 2.000000 +v 0.763793 -7.047099 2.000000 +v 0.777520 -7.092275 2.000000 +v 0.799797 -7.133906 2.000000 +v 0.829767 -7.170391 2.000000 +v 0.866280 -7.200327 2.000000 +v 0.907931 -7.222566 2.000000 +v 0.953121 -7.236251 2.000000 +v 1.000112 -7.240857 2.000000 +v 1.047099 -7.236207 2.000000 +v 1.092275 -7.222480 2.000000 +v 1.133906 -7.200203 2.000000 +v 1.170391 -7.170233 2.000000 +v 1.200328 -7.133720 2.000000 +v 1.222566 -7.092069 2.000000 +v 1.236251 -7.046879 2.000000 +v 1.240857 -6.999888 2.000000 +v 1.236207 -6.952901 2.000000 +v 1.222480 -6.907725 2.000000 +v 1.289224 -6.880042 2.039759 +v 1.307070 -6.938772 2.039759 +v 1.313114 -6.999855 2.039759 +v 1.307126 -7.060943 2.039759 +v 1.289335 -7.119689 2.039759 +v 1.260426 -7.173836 2.039759 +v 1.221508 -7.221303 2.039759 +v 1.174078 -7.260264 2.039759 +v 1.119958 -7.289224 2.039759 +v 1.061228 -7.307069 2.039759 +v 1.000145 -7.313114 2.039759 +v 0.939057 -7.307126 2.039759 +v 0.880311 -7.289335 2.039759 +v 0.826164 -7.260426 2.039759 +v 0.778698 -7.221508 2.039759 +v 0.739736 -7.174078 2.039759 +v 0.710776 -7.119958 2.039759 +v 0.692931 -7.061228 2.039759 +v 0.686886 -7.000145 2.039759 +v 0.692874 -6.939057 2.039759 +v 0.710665 -6.880311 2.039759 +v 0.739574 -6.826164 2.039759 +v 0.778492 -6.778697 2.039759 +v 0.825922 -6.739736 2.039759 +v 0.880042 -6.710776 2.039759 +v 0.938772 -6.692930 2.039759 +v 0.999855 -6.686886 2.039759 +v 1.060943 -6.692874 2.039759 +v 1.119690 -6.710665 2.039759 +v 1.173836 -6.739574 2.039759 +v 1.221303 -6.778492 2.039759 +v 1.260265 -6.825922 2.039759 +v 1.182185 -6.878146 2.091180 +v 1.154912 -6.844944 2.091180 +v 1.121686 -6.817702 2.091180 +v 1.083783 -6.797465 2.091180 +v 1.042660 -6.785012 2.091180 +v 0.999899 -6.780820 2.091180 +v 0.957141 -6.785051 2.091180 +v 0.916030 -6.797543 2.091180 +v 0.878146 -6.817815 2.091180 +v 0.844945 -6.845088 2.091180 +v 0.817702 -6.878314 2.091180 +v 0.797465 -6.916217 2.091180 +v 0.785012 -6.957340 2.091180 +v 0.780820 -7.000102 2.091180 +v 0.785051 -7.042860 2.091180 +v 0.797543 -7.083971 2.091180 +v 0.817815 -7.121854 2.091180 +v 0.845088 -7.155056 2.091180 +v 0.878315 -7.182298 2.091180 +v 0.916217 -7.202535 2.091180 +v 0.957340 -7.214988 2.091180 +v 1.000102 -7.219180 2.091180 +v 1.042860 -7.214949 2.091180 +v 1.083971 -7.202457 2.091180 +v 1.121855 -7.182185 2.091180 +v 1.155056 -7.154912 2.091180 +v 1.182298 -7.121685 2.091180 +v 1.202535 -7.083783 2.091180 +v 1.214988 -7.042660 2.091180 +v 1.219180 -6.999898 2.091180 +v 1.214949 -6.957140 2.091180 +v 1.202457 -6.916029 2.091180 +v 1.110607 -6.911092 2.251494 +v 1.095922 -6.891228 2.090222 +v 0.905151 -6.891228 2.090222 +v 0.890444 -6.911092 2.251494 +v 1.110607 -7.092502 2.251494 +v 1.095922 -7.112367 2.090222 +v 0.905151 -7.112367 2.090222 +v 0.890444 -7.092502 2.251494 +v 0.890444 -7.092502 2.386104 +v 1.110607 -7.092502 2.386104 +v 0.890444 -6.911092 2.386104 +v 1.110607 -6.911092 2.386104 +v 1.110607 -6.911092 2.520714 +v 0.890444 -6.911092 2.520714 +v 1.110607 -7.092502 2.520714 +v 0.890444 -7.092502 2.520714 +v 1.256450 -6.911092 2.386104 +v 1.256450 -7.092502 2.386104 +v 1.256450 -7.092502 2.251494 +v 1.256450 -6.911092 2.251494 +v 0.744601 -6.911092 2.386104 +v 0.744601 -7.092502 2.386104 +v 0.744601 -7.092502 2.251494 +v 0.744601 -6.911092 2.251494 +v 1.000536 -6.891228 2.090222 +v 1.000536 -7.112367 2.090222 +v 1.095922 -7.001797 2.090222 +v 0.905151 -7.001797 2.090222 +v 1.000536 -7.001797 2.090222 +v 0.905151 -6.946513 2.090222 +v 0.905151 -7.057082 2.090222 +v 1.095922 -6.946513 2.090222 +v 1.095922 -7.057082 2.090222 +v 1.048229 -7.112367 2.090222 +v 0.952844 -7.112367 2.090222 +v 1.048229 -6.891228 2.090222 +v 0.952844 -6.891228 2.090222 +v 1.000536 -7.057082 2.090222 +v 1.048229 -7.001797 2.090222 +v 0.952844 -7.001797 2.090222 +v 1.000536 -6.946513 2.090222 +v 0.952844 -6.946513 2.090222 +v 0.952844 -7.057082 2.090222 +v 1.048229 -7.057082 2.090222 +v 1.048229 -6.946513 2.090222 +v 0.890444 -6.911092 2.427350 +v 1.110607 -6.911092 2.427350 +v 1.110607 -7.092502 2.427350 +v 0.890444 -7.092502 2.427350 +v 1.183528 -7.092502 2.251494 +v 1.183528 -7.092502 2.386104 +v 1.183528 -6.911092 2.386104 +v 1.183528 -6.911092 2.251494 +v 0.817523 -6.911092 2.251494 +v 0.817523 -6.911092 2.386104 +v 0.817523 -7.092502 2.386104 +v 0.817523 -7.092502 2.251494 +v 0.772568 -7.092502 2.251494 +v 0.772568 -6.911092 2.251494 +v 0.772568 -7.092502 2.386104 +v 0.772568 -6.911092 2.386104 +v 1.229380 -6.911092 2.251494 +v 1.229380 -7.092502 2.251494 +v 1.229380 -6.911092 2.386104 +v 1.229380 -7.092502 2.386104 +v 0.890444 -7.092502 2.487933 +v 0.890444 -6.911092 2.487933 +v 1.110607 -6.911092 2.487933 +v 1.110607 -7.092502 2.487933 +v 1.347575 -6.767525 0.900000 +v 1.386250 -6.839800 0.900000 +v 1.295543 -6.704183 0.900000 +v 1.232153 -6.652210 0.900000 +v 1.159842 -6.613602 0.900000 +v 1.081388 -6.589842 0.900000 +v 0.999806 -6.581845 0.900000 +v 0.918232 -6.589918 0.900000 +v 0.839800 -6.613750 0.900000 +v 0.767525 -6.652425 0.900000 +v 0.704183 -6.704457 0.900000 +v 0.652209 -6.767847 0.900000 +v 0.613601 -6.840158 0.900000 +v 0.589842 -6.918612 0.900000 +v 0.581845 -7.000194 0.900000 +v 0.589918 -7.081768 0.900000 +v 0.613750 -7.160200 0.900000 +v 0.652425 -7.232476 0.900000 +v 0.704457 -7.295817 0.900000 +v 0.767847 -7.347791 0.900000 +v 0.840158 -7.386399 0.900000 +v 0.918612 -7.410158 0.900000 +v 1.000194 -7.418155 0.900000 +v 1.081768 -7.410082 0.900000 +v 1.160200 -7.386250 0.900000 +v 1.232476 -7.347575 0.900000 +v 1.295817 -7.295543 0.900000 +v 1.347791 -7.232153 0.900000 +v 1.386399 -7.159842 0.900000 +v 1.410158 -7.081388 0.900000 +v 1.418155 -6.999806 0.900000 +v 1.410082 -6.918231 0.900000 +v 1.337969 -6.859825 1.150000 +v 1.358822 -6.928452 1.150000 +v 1.365885 -6.999830 1.150000 +v 1.358888 -7.071214 1.150000 +v 1.338099 -7.139861 1.150000 +v 1.304317 -7.203134 1.150000 +v 1.258840 -7.258600 1.150000 +v 1.203416 -7.304128 1.150000 +v 1.140175 -7.337969 1.150000 +v 1.071547 -7.358822 1.150000 +v 1.000170 -7.365885 1.150000 +v 0.928786 -7.358888 1.150000 +v 0.860139 -7.338099 1.150000 +v 0.796866 -7.304317 1.150000 +v 0.741400 -7.258840 1.150000 +v 0.695872 -7.203416 1.150000 +v 0.662031 -7.140175 1.150000 +v 0.641178 -7.071547 1.150000 +v 0.634115 -7.000170 1.150000 +v 0.641112 -6.928786 1.150000 +v 0.661901 -6.860138 1.150000 +v 0.695683 -6.796866 1.150000 +v 0.741160 -6.741400 1.150000 +v 0.796584 -6.695872 1.150000 +v 0.859825 -6.662031 1.150000 +v 0.928453 -6.641178 1.150000 +v 0.999831 -6.634115 1.150000 +v 1.071215 -6.641112 1.150000 +v 1.139862 -6.661901 1.150000 +v 1.203134 -6.695683 1.150000 +v 1.258600 -6.741160 1.150000 +v 1.304128 -6.796584 1.150000 +v 1.282405 -6.811114 1.275000 +v 1.313828 -6.869837 1.275000 +v 1.240129 -6.759649 1.275000 +v 1.188625 -6.717421 1.275000 +v 1.129872 -6.686051 1.275000 +v 1.066128 -6.666747 1.275000 +v 0.999843 -6.660249 1.275000 +v 0.933564 -6.666808 1.275000 +v 0.869838 -6.686172 1.275000 +v 0.811114 -6.717595 1.275000 +v 0.759649 -6.759871 1.275000 +v 0.717420 -6.811376 1.275000 +v 0.686051 -6.870129 1.275000 +v 0.666747 -6.933872 1.275000 +v 0.660249 -7.000157 1.275000 +v 0.666808 -7.066437 1.275000 +v 0.686172 -7.130163 1.275000 +v 0.717595 -7.188887 1.275000 +v 0.759871 -7.240352 1.275000 +v 0.811376 -7.282580 1.275000 +v 0.870129 -7.313949 1.275000 +v 0.933873 -7.333253 1.275000 +v 1.000158 -7.339751 1.275000 +v 1.066437 -7.333192 1.275000 +v 1.130163 -7.313828 1.275000 +v 1.188887 -7.282405 1.275000 +v 1.240352 -7.240129 1.275000 +v 1.282580 -7.188624 1.275000 +v 1.313949 -7.129871 1.275000 +v 1.333253 -7.066127 1.275000 +v 1.339751 -6.999842 1.275000 +v 1.333192 -6.933563 1.275000 +v 1.521363 -6.651287 1.557290 +v 1.579375 -6.759700 1.507290 +v 1.443315 -6.556275 1.507290 +v 1.348230 -6.478314 1.557290 +v 1.239763 -6.420402 1.507290 +v 1.122082 -6.384763 1.557290 +v 0.999710 -6.372768 1.507290 +v 0.877348 -6.384877 1.557290 +v 0.759700 -6.420624 1.507290 +v 0.651287 -6.478637 1.557290 +v 0.556275 -6.556685 1.507290 +v 0.478314 -6.651770 1.557290 +v 0.420402 -6.760237 1.507290 +v 0.384763 -6.877918 1.557290 +v 0.372768 -7.000291 1.507290 +v 0.384877 -7.122652 1.557290 +v 0.420624 -7.240300 1.507290 +v 0.478637 -7.348713 1.557290 +v 0.556686 -7.443726 1.507290 +v 0.651771 -7.521686 1.557290 +v 0.760238 -7.579598 1.507290 +v 0.877919 -7.615237 1.557290 +v 1.000291 -7.627232 1.507290 +v 1.122653 -7.615123 1.557290 +v 1.240300 -7.579375 1.507290 +v 1.348714 -7.521362 1.557290 +v 1.443726 -7.443314 1.507290 +v 1.521686 -7.348229 1.557290 +v 1.579598 -7.239762 1.507290 +v 1.615237 -7.122081 1.557290 +v 1.627232 -6.999709 1.507290 +v 1.615123 -6.877347 1.557290 +v 1.783787 -6.674918 0.016561 +v 1.705307 -6.528257 0.016561 +v 1.599722 -6.399723 0.016561 +v 1.471090 -6.294257 0.016561 +v 1.324355 -6.215912 0.016561 +v 1.165154 -6.167699 0.016561 +v 0.999607 -6.151472 0.016561 +v 0.834075 -6.167853 0.016561 +v 0.674919 -6.216213 0.016561 +v 0.528256 -6.294693 0.016561 +v 0.399722 -6.400278 0.016561 +v 0.294256 -6.528910 0.016561 +v 0.215912 -6.675646 0.016561 +v 0.167699 -6.834846 0.016561 +v 0.151472 -7.000393 0.016561 +v 0.167853 -7.165926 0.016561 +v 0.216213 -7.325081 0.016561 +v 0.294693 -7.471744 0.016561 +v 0.400278 -7.600278 0.016561 +v 0.528911 -7.705744 0.016561 +v 0.675646 -7.784088 0.016561 +v 0.834847 -7.832301 0.016561 +v 1.000394 -7.848528 0.016561 +v 1.165926 -7.832147 0.016561 +v 1.325082 -7.783787 0.016561 +v 1.471745 -7.705306 0.016561 +v 1.600279 -7.599721 0.016561 +v 1.705745 -7.471089 0.016561 +v 1.784088 -7.324354 0.016561 +v 1.832301 -7.165153 0.016561 +v 1.848528 -6.999606 0.016561 +v 1.832147 -6.834074 0.016561 +v 1.783787 -6.674918 0.088376 +v 1.832147 -6.834074 0.088376 +v 1.848528 -6.999606 0.088376 +v 1.832301 -7.165153 0.088376 +v 1.784088 -7.324354 0.088376 +v 1.705745 -7.471089 0.088376 +v 1.600279 -7.599721 0.088376 +v 1.471745 -7.705306 0.088376 +v 1.325082 -7.783787 0.088376 +v 1.165926 -7.832147 0.088376 +v 1.000394 -7.848528 0.088376 +v 0.834847 -7.832301 0.088376 +v 0.675646 -7.784088 0.088376 +v 0.528911 -7.705744 0.088376 +v 0.400278 -7.600278 0.088376 +v 0.294693 -7.471744 0.088376 +v 0.216213 -7.325081 0.088376 +v 0.167853 -7.165926 0.088376 +v 0.151472 -7.000393 0.088376 +v 0.167699 -6.834846 0.088376 +v 0.215912 -6.675646 0.088376 +v 0.294256 -6.528910 0.088376 +v 0.399722 -6.400278 0.088376 +v 0.528256 -6.294693 0.088376 +v 0.674919 -6.216213 0.088376 +v 0.834075 -6.167853 0.088376 +v 0.999607 -6.151472 0.088376 +v 1.165154 -6.167699 0.088376 +v 1.324355 -6.215912 0.088376 +v 1.471090 -6.294257 0.088376 +v 1.599722 -6.399723 0.088376 +v 1.705307 -6.528257 0.088376 +v 1.000000 -7.000000 0.000000 +usemtl Material +s 1 +f 64 678 709 33 +f 31 648 647 32 +f 30 649 648 31 +f 30 29 650 649 +f 28 651 650 29 +f 27 652 651 28 +f 26 653 652 27 +f 26 25 654 653 +f 24 655 654 25 +f 24 23 656 655 +f 22 657 656 23 +f 21 658 657 22 +f 20 659 658 21 +f 20 19 660 659 +f 18 661 660 19 +f 18 17 662 661 +f 16 663 662 17 +f 16 15 664 663 +f 14 665 664 15 +f 14 13 666 665 +f 12 667 666 13 +f 11 668 667 12 +f 10 669 668 11 +f 10 9 670 669 +f 9 8 671 670 +f 7 672 671 8 +f 7 6 673 672 +f 5 674 673 6 +f 5 4 675 674 +f 3 676 675 4 +f 3 2 677 676 +f 2 1 646 677 +f 63 64 65 66 +f 62 63 66 67 +f 62 67 68 61 +f 60 61 68 69 +f 60 69 70 59 +f 58 59 70 71 +f 58 71 72 57 +f 56 57 72 73 +f 55 56 73 74 +f 55 74 75 54 +f 54 75 76 53 +f 53 76 77 52 +f 51 52 77 78 +f 51 78 79 50 +f 49 50 79 80 +f 49 80 81 48 +f 47 48 81 82 +f 47 82 83 46 +f 45 46 83 84 +f 45 84 85 44 +f 44 85 86 43 +f 43 86 87 42 +f 41 42 87 88 +f 41 88 89 40 +f 39 40 89 90 +f 39 90 91 38 +f 38 91 92 37 +f 37 92 93 36 +f 35 36 93 94 +f 35 94 95 34 +f 34 95 96 33 +f 33 96 65 64 +f 96 97 128 65 +f 95 98 97 96 +f 94 99 98 95 +f 94 93 100 99 +f 92 101 100 93 +f 91 102 101 92 +f 90 103 102 91 +f 90 89 104 103 +f 88 105 104 89 +f 88 87 106 105 +f 86 107 106 87 +f 85 108 107 86 +f 84 109 108 85 +f 84 83 110 109 +f 82 111 110 83 +f 82 81 112 111 +f 80 113 112 81 +f 80 79 114 113 +f 78 115 114 79 +f 78 77 116 115 +f 76 117 116 77 +f 75 118 117 76 +f 74 119 118 75 +f 74 73 120 119 +f 73 72 121 120 +f 71 122 121 72 +f 71 70 123 122 +f 69 124 123 70 +f 69 68 125 124 +f 67 126 125 68 +f 67 66 127 126 +f 66 65 128 127 +f 127 128 129 130 +f 126 127 130 131 +f 126 131 132 125 +f 124 125 132 133 +f 124 133 134 123 +f 122 123 134 135 +f 122 135 136 121 +f 120 121 136 137 +f 119 120 137 138 +f 119 138 139 118 +f 118 139 140 117 +f 117 140 141 116 +f 115 116 141 142 +f 115 142 143 114 +f 113 114 143 144 +f 113 144 145 112 +f 111 112 145 146 +f 111 146 147 110 +f 109 110 147 148 +f 109 148 149 108 +f 108 149 150 107 +f 107 150 151 106 +f 105 106 151 152 +f 105 152 153 104 +f 103 104 153 154 +f 103 154 155 102 +f 102 155 156 101 +f 101 156 157 100 +f 99 100 157 158 +f 99 158 159 98 +f 98 159 160 97 +f 97 160 129 128 +f 160 518 519 129 +f 159 520 518 160 +f 158 521 520 159 +f 158 157 522 521 +f 156 523 522 157 +f 155 524 523 156 +f 154 525 524 155 +f 154 153 526 525 +f 152 527 526 153 +f 152 151 528 527 +f 150 529 528 151 +f 149 530 529 150 +f 148 531 530 149 +f 148 147 532 531 +f 146 533 532 147 +f 146 145 534 533 +f 144 535 534 145 +f 144 143 536 535 +f 142 537 536 143 +f 142 141 538 537 +f 140 539 538 141 +f 139 540 539 140 +f 138 541 540 139 +f 138 137 542 541 +f 137 136 543 542 +f 135 544 543 136 +f 135 134 545 544 +f 133 546 545 134 +f 133 132 547 546 +f 131 548 547 132 +f 131 130 549 548 +f 130 129 519 549 +f 191 192 193 194 +f 190 191 194 195 +f 190 195 196 189 +f 188 189 196 197 +f 188 197 198 187 +f 186 187 198 199 +f 186 199 200 185 +f 184 185 200 201 +f 183 184 201 202 +f 183 202 203 182 +f 182 203 204 181 +f 181 204 205 180 +f 179 180 205 206 +f 179 206 207 178 +f 177 178 207 208 +f 177 208 209 176 +f 175 176 209 210 +f 175 210 211 174 +f 173 174 211 212 +f 173 212 213 172 +f 172 213 214 171 +f 171 214 215 170 +f 169 170 215 216 +f 169 216 217 168 +f 167 168 217 218 +f 167 218 219 166 +f 166 219 220 165 +f 165 220 221 164 +f 163 164 221 222 +f 163 222 223 162 +f 162 223 224 161 +f 161 224 193 192 +f 224 614 615 193 +f 223 616 614 224 +f 222 617 616 223 +f 222 221 618 617 +f 220 619 618 221 +f 219 620 619 220 +f 218 621 620 219 +f 218 217 622 621 +f 216 623 622 217 +f 216 215 624 623 +f 214 625 624 215 +f 213 626 625 214 +f 212 627 626 213 +f 212 211 628 627 +f 210 629 628 211 +f 210 209 630 629 +f 208 631 630 209 +f 208 207 632 631 +f 206 633 632 207 +f 206 205 634 633 +f 204 635 634 205 +f 203 636 635 204 +f 202 637 636 203 +f 202 201 638 637 +f 201 200 639 638 +f 199 640 639 200 +f 199 198 641 640 +f 197 642 641 198 +f 197 196 643 642 +f 195 644 643 196 +f 195 194 645 644 +f 194 193 615 645 +f 255 256 257 258 +f 254 255 258 259 +f 254 259 260 253 +f 252 253 260 261 +f 252 261 262 251 +f 250 251 262 263 +f 250 263 264 249 +f 248 249 264 265 +f 247 248 265 266 +f 247 266 267 246 +f 246 267 268 245 +f 245 268 269 244 +f 243 244 269 270 +f 243 270 271 242 +f 241 242 271 272 +f 241 272 273 240 +f 239 240 273 274 +f 239 274 275 238 +f 237 238 275 276 +f 237 276 277 236 +f 236 277 278 235 +f 235 278 279 234 +f 233 234 279 280 +f 233 280 281 232 +f 231 232 281 282 +f 231 282 283 230 +f 230 283 284 229 +f 229 284 285 228 +f 227 228 285 286 +f 227 286 287 226 +f 226 287 288 225 +f 225 288 257 256 +f 288 289 320 257 +f 287 290 289 288 +f 286 291 290 287 +f 286 285 292 291 +f 284 293 292 285 +f 283 294 293 284 +f 282 295 294 283 +f 282 281 296 295 +f 280 297 296 281 +f 280 279 298 297 +f 278 299 298 279 +f 277 300 299 278 +f 276 301 300 277 +f 276 275 302 301 +f 274 303 302 275 +f 274 273 304 303 +f 272 305 304 273 +f 272 271 306 305 +f 270 307 306 271 +f 270 269 308 307 +f 268 309 308 269 +f 267 310 309 268 +f 266 311 310 267 +f 266 265 312 311 +f 265 264 313 312 +f 263 314 313 264 +f 263 262 315 314 +f 261 316 315 262 +f 261 260 317 316 +f 259 318 317 260 +f 259 258 319 318 +f 258 257 320 319 +f 319 320 321 322 +f 318 319 322 323 +f 318 323 324 317 +f 316 317 324 325 +f 316 325 326 315 +f 314 315 326 327 +f 314 327 328 313 +f 312 313 328 329 +f 311 312 329 330 +f 311 330 331 310 +f 310 331 332 309 +f 309 332 333 308 +f 307 308 333 334 +f 307 334 335 306 +f 305 306 335 336 +f 305 336 337 304 +f 303 304 337 338 +f 303 338 339 302 +f 301 302 339 340 +f 301 340 341 300 +f 300 341 342 299 +f 299 342 343 298 +f 297 298 343 344 +f 297 344 345 296 +f 295 296 345 346 +f 295 346 347 294 +f 294 347 348 293 +f 293 348 349 292 +f 291 292 349 350 +f 291 350 351 290 +f 290 351 352 289 +f 289 352 321 320 +f 352 353 384 321 +f 351 354 353 352 +f 350 355 354 351 +f 350 349 356 355 +f 348 357 356 349 +f 347 358 357 348 +f 346 359 358 347 +f 346 345 360 359 +f 344 361 360 345 +f 344 343 362 361 +f 342 363 362 343 +f 341 364 363 342 +f 340 365 364 341 +f 340 339 366 365 +f 338 367 366 339 +f 338 337 368 367 +f 336 369 368 337 +f 336 335 370 369 +f 334 371 370 335 +f 334 333 372 371 +f 332 373 372 333 +f 331 374 373 332 +f 330 375 374 331 +f 330 329 376 375 +f 329 328 377 376 +f 327 378 377 328 +f 327 326 379 378 +f 325 380 379 326 +f 325 324 381 380 +f 323 382 381 324 +f 323 322 383 382 +f 322 321 384 383 +f 383 384 385 386 +f 382 383 386 387 +f 382 387 388 381 +f 380 381 388 389 +f 380 389 390 379 +f 378 379 390 391 +f 378 391 392 377 +f 376 377 392 393 +f 375 376 393 394 +f 375 394 395 374 +f 374 395 396 373 +f 373 396 397 372 +f 371 372 397 398 +f 371 398 399 370 +f 369 370 399 400 +f 369 400 401 368 +f 367 368 401 402 +f 367 402 403 366 +f 365 366 403 404 +f 365 404 405 364 +f 364 405 406 363 +f 363 406 407 362 +f 361 362 407 408 +f 361 408 409 360 +f 359 360 409 410 +f 359 410 411 358 +f 358 411 412 357 +f 357 412 413 356 +f 355 356 413 414 +f 355 414 415 354 +f 354 415 416 353 +f 353 416 385 384 +f 416 417 448 385 +f 415 418 417 416 +f 414 419 418 415 +f 414 413 420 419 +f 412 421 420 413 +f 411 422 421 412 +f 410 423 422 411 +f 410 409 424 423 +f 408 425 424 409 +f 408 407 426 425 +f 406 427 426 407 +f 405 428 427 406 +f 404 429 428 405 +f 404 403 430 429 +f 402 431 430 403 +f 402 401 432 431 +f 400 433 432 401 +f 400 399 434 433 +f 398 435 434 399 +f 398 397 436 435 +f 396 437 436 397 +f 395 438 437 396 +f 394 439 438 395 +f 394 393 440 439 +f 393 392 441 440 +f 391 442 441 392 +f 391 390 443 442 +f 389 444 443 390 +f 389 388 445 444 +f 387 446 445 388 +f 387 386 447 446 +f 386 385 448 447 +f 449 450 484 +f 456 455 483 +f 453 454 481 +f 450 480 493 484 +f 451 478 452 +f 456 453 458 457 +f 449 452 459 460 +f 460 459 494 495 +f 457 458 496 497 +f 458 460 495 496 +f 459 457 497 494 +f 462 464 463 461 +f 458 453 498 499 +f 460 458 499 500 +f 449 460 500 501 +f 453 449 501 498 +f 467 468 465 466 +f 459 452 502 503 +f 457 459 503 504 +f 456 457 504 505 +f 452 456 505 502 +f 472 471 470 469 +f 476 456 479 +f 476 456 452 +f 454 482 492 481 +f 455 479 491 483 +f 451 485 490 478 +f 475 449 480 +f 475 449 453 +f 474 453 482 +f 474 453 456 +f 473 452 485 +f 473 452 449 +f 485 451 452 +f 482 454 453 +f 480 450 449 +f 473 485 490 489 +f 477 489 490 488 +f 476 488 490 478 +f 476 479 491 488 +f 477 488 491 486 +f 474 486 491 483 +f 474 482 492 486 +f 477 486 492 487 +f 475 487 492 481 +f 479 455 456 +f 478 476 452 +f 475 480 493 487 +f 477 487 493 489 +f 473 489 493 484 +f 481 475 453 +f 483 474 456 +f 484 473 449 +f 434 435 483 455 +f 435 436 483 +f 436 437 483 +f 437 438 474 483 +f 438 439 482 474 +f 439 440 482 +f 440 441 482 +f 441 442 454 482 +f 418 419 484 450 +f 419 420 484 +f 420 421 484 +f 421 422 473 484 +f 422 423 485 473 +f 423 424 485 +f 424 425 485 +f 425 426 451 485 +f 426 427 478 451 +f 417 418 450 480 +f 427 428 478 +f 428 429 478 +f 417 480 448 +f 447 448 480 +f 446 447 480 475 +f 445 446 475 481 +f 429 430 476 478 +f 430 431 479 476 +f 433 434 455 479 +f 442 443 481 454 +f 443 444 481 +f 444 445 481 +f 432 433 479 +f 431 432 479 +f 505 506 507 502 +f 504 508 506 505 +f 503 509 508 504 +f 502 507 509 503 +f 501 510 511 498 +f 500 512 510 501 +f 499 513 512 500 +f 498 511 513 499 +f 497 514 515 494 +f 495 516 517 496 +f 496 517 514 497 +f 494 515 516 495 +f 515 462 461 516 +f 517 463 464 514 +f 516 461 463 517 +f 514 464 462 515 +f 511 467 466 513 +f 513 466 465 512 +f 512 465 468 510 +f 510 468 467 511 +f 507 472 469 509 +f 509 469 470 508 +f 508 470 471 506 +f 506 471 472 507 +f 519 550 551 549 +f 549 551 552 548 +f 548 552 553 547 +f 547 553 554 546 +f 546 554 555 545 +f 545 555 556 544 +f 544 556 557 543 +f 543 557 558 542 +f 542 558 559 541 +f 541 559 560 540 +f 540 560 561 539 +f 539 561 562 538 +f 538 562 563 537 +f 537 563 564 536 +f 536 564 565 535 +f 535 565 566 534 +f 534 566 567 533 +f 533 567 568 532 +f 532 568 569 531 +f 531 569 570 530 +f 530 570 571 529 +f 529 571 572 528 +f 528 572 573 527 +f 527 573 574 526 +f 526 574 575 525 +f 525 575 576 524 +f 524 576 577 523 +f 523 577 578 522 +f 522 578 579 521 +f 521 579 580 520 +f 520 580 581 518 +f 518 581 550 519 +f 581 582 583 550 +f 580 584 582 581 +f 579 585 584 580 +f 578 586 585 579 +f 577 587 586 578 +f 576 588 587 577 +f 575 589 588 576 +f 574 590 589 575 +f 573 591 590 574 +f 572 592 591 573 +f 571 593 592 572 +f 570 594 593 571 +f 569 595 594 570 +f 568 596 595 569 +f 567 597 596 568 +f 566 598 597 567 +f 565 599 598 566 +f 564 600 599 565 +f 563 601 600 564 +f 562 602 601 563 +f 561 603 602 562 +f 560 604 603 561 +f 559 605 604 560 +f 558 606 605 559 +f 557 607 606 558 +f 556 608 607 557 +f 555 609 608 556 +f 554 610 609 555 +f 553 611 610 554 +f 552 612 611 553 +f 551 613 612 552 +f 550 583 613 551 +f 583 192 191 613 +f 613 191 190 612 +f 612 190 189 611 +f 611 189 188 610 +f 610 188 187 609 +f 609 187 186 608 +f 608 186 185 607 +f 607 185 184 606 +f 606 184 183 605 +f 605 183 182 604 +f 604 182 181 603 +f 603 181 180 602 +f 602 180 179 601 +f 601 179 178 600 +f 600 178 177 599 +f 599 177 176 598 +f 598 176 175 597 +f 597 175 174 596 +f 596 174 173 595 +f 595 173 172 594 +f 594 172 171 593 +f 593 171 170 592 +f 592 170 169 591 +f 591 169 168 590 +f 590 168 167 589 +f 589 167 166 588 +f 588 166 165 587 +f 587 165 164 586 +f 586 164 163 585 +f 585 163 162 584 +f 584 162 161 582 +f 582 161 192 583 +f 615 256 255 645 +f 645 255 254 644 +f 644 254 253 643 +f 643 253 252 642 +f 642 252 251 641 +f 641 251 250 640 +f 640 250 249 639 +f 639 249 248 638 +f 638 248 247 637 +f 637 247 246 636 +f 636 246 245 635 +f 635 245 244 634 +f 634 244 243 633 +f 633 243 242 632 +f 632 242 241 631 +f 631 241 240 630 +f 630 240 239 629 +f 629 239 238 628 +f 628 238 237 627 +f 627 237 236 626 +f 626 236 235 625 +f 625 235 234 624 +f 624 234 233 623 +f 623 233 232 622 +f 622 232 231 621 +f 621 231 230 620 +f 620 230 229 619 +f 619 229 228 618 +f 618 228 227 617 +f 617 227 226 616 +f 616 226 225 614 +f 614 225 256 615 +f 646 678 679 677 +f 677 679 680 676 +f 676 680 681 675 +f 675 681 682 674 +f 674 682 683 673 +f 673 683 684 672 +f 672 684 685 671 +f 671 685 686 670 +f 670 686 687 669 +f 669 687 688 668 +f 668 688 689 667 +f 667 689 690 666 +f 666 690 691 665 +f 665 691 692 664 +f 664 692 693 663 +f 663 693 694 662 +f 662 694 695 661 +f 661 695 696 660 +f 660 696 697 659 +f 659 697 698 658 +f 658 698 699 657 +f 657 699 700 656 +f 656 700 701 655 +f 655 701 702 654 +f 654 702 703 653 +f 653 703 704 652 +f 652 704 705 651 +f 651 705 706 650 +f 650 706 707 649 +f 649 707 708 648 +f 648 708 709 647 +f 646 1 32 647 +f 708 34 33 709 +f 707 35 34 708 +f 706 36 35 707 +f 705 37 36 706 +f 704 38 37 705 +f 703 39 38 704 +f 702 40 39 703 +f 701 41 40 702 +f 700 42 41 701 +f 699 43 42 700 +f 698 44 43 699 +f 697 45 44 698 +f 696 46 45 697 +f 695 47 46 696 +f 694 48 47 695 +f 693 49 48 694 +f 692 50 49 693 +f 691 51 50 692 +f 690 52 51 691 +f 689 53 52 690 +f 688 54 53 689 +f 687 55 54 688 +f 686 56 55 687 +f 685 57 56 686 +f 684 58 57 685 +f 683 59 58 684 +f 682 60 59 683 +f 681 61 60 682 +f 680 62 61 681 +f 679 63 62 680 +f 678 64 63 679 +f 678 646 647 709 +f 1 2 710 +f 2 3 710 +f 3 4 710 +f 4 5 710 +f 5 6 710 +f 6 7 710 +f 7 8 710 +f 8 9 710 +f 9 10 710 +f 10 11 710 +f 11 12 710 +f 12 13 710 +f 13 14 710 +f 14 15 710 +f 15 16 710 +f 16 17 710 +f 17 18 710 +f 18 19 710 +f 19 20 710 +f 20 21 710 +f 21 22 710 +f 22 23 710 +f 23 24 710 +f 24 25 710 +f 25 26 710 +f 26 27 710 +f 27 28 710 +f 28 29 710 +f 29 30 710 +f 30 31 710 +f 31 32 710 +f 32 1 710 diff --git a/Graph3D/Chess3D/pawn.obj b/Graph3D/Chess3D/pawn.obj new file mode 100644 index 0000000..9650472 --- /dev/null +++ b/Graph3D/Chess3D/pawn.obj @@ -0,0 +1,2406 @@ +# Blender3D v245 OBJ File: chess2.blend +# www.blender3d.org +v 7.600000 -4.400000 0.000000 +v 7.705525 -4.528583 0.000000 +v 7.783938 -4.675282 0.000000 +v 7.832224 -4.834460 0.000000 +v 7.848528 -5.000000 0.000000 +v 7.832224 -5.165540 0.000000 +v 7.783938 -5.324718 0.000000 +v 7.705525 -5.471417 0.000000 +v 7.600000 -5.600000 0.000000 +v 7.471417 -5.705525 0.000000 +v 7.324718 -5.783938 0.000000 +v 7.165539 -5.832224 0.000000 +v 7.000000 -5.848528 0.000000 +v 6.834460 -5.832224 0.000000 +v 6.675282 -5.783937 0.000000 +v 6.528583 -5.705525 0.000000 +v 6.400000 -5.599999 0.000000 +v 6.294474 -5.471416 0.000000 +v 6.216062 -5.324717 0.000000 +v 6.167776 -5.165539 0.000000 +v 6.151472 -4.999999 0.000000 +v 6.167776 -4.834459 0.000000 +v 6.216063 -4.675282 0.000000 +v 6.294475 -4.528582 0.000000 +v 6.400001 -4.399999 0.000000 +v 6.528584 -4.294474 0.000000 +v 6.675283 -4.216062 0.000000 +v 6.834462 -4.167776 0.000000 +v 7.000001 -4.151472 0.000000 +v 7.165541 -4.167777 0.000000 +v 7.324719 -4.216063 0.000000 +v 7.471418 -4.294476 0.000000 +v 7.471418 -4.294476 0.172243 +v 7.324719 -4.216063 0.172243 +v 7.165541 -4.167777 0.172243 +v 7.000001 -4.151472 0.172243 +v 6.834462 -4.167776 0.172243 +v 6.675283 -4.216062 0.172243 +v 6.528584 -4.294474 0.172243 +v 6.400001 -4.399999 0.172243 +v 6.294475 -4.528582 0.172243 +v 6.216063 -4.675282 0.172243 +v 6.167776 -4.834459 0.172243 +v 6.151472 -4.999999 0.172243 +v 6.167776 -5.165539 0.172243 +v 6.216062 -5.324717 0.172243 +v 6.294474 -5.471416 0.172243 +v 6.400000 -5.599999 0.172243 +v 6.528583 -5.705525 0.172243 +v 6.675282 -5.783937 0.172243 +v 6.834460 -5.832224 0.172243 +v 7.000000 -5.848528 0.172243 +v 7.165539 -5.832224 0.172243 +v 7.324718 -5.783938 0.172243 +v 7.471417 -5.705525 0.172243 +v 7.600000 -5.600000 0.172243 +v 7.705525 -5.471417 0.172243 +v 7.783938 -5.324718 0.172243 +v 7.832224 -5.165540 0.172243 +v 7.848528 -5.000000 0.172243 +v 7.832224 -4.834460 0.172243 +v 7.783938 -4.675282 0.172243 +v 7.705525 -4.528583 0.172243 +v 7.600000 -4.400000 0.172243 +v 7.480000 -4.520000 0.230606 +v 7.564420 -4.622867 0.230606 +v 7.627150 -4.740226 0.230606 +v 7.665779 -4.867568 0.230606 +v 7.678823 -5.000000 0.230606 +v 7.665779 -5.132432 0.230606 +v 7.627151 -5.259774 0.230606 +v 7.564420 -5.377133 0.230606 +v 7.480000 -5.480000 0.230606 +v 7.377133 -5.564420 0.230606 +v 7.259774 -5.627151 0.230606 +v 7.132432 -5.665779 0.230606 +v 7.000000 -5.678823 0.230606 +v 6.867568 -5.665779 0.230606 +v 6.740226 -5.627150 0.230606 +v 6.622866 -5.564420 0.230606 +v 6.520000 -5.480000 0.230606 +v 6.435579 -5.377133 0.230606 +v 6.372849 -5.259774 0.230606 +v 6.334221 -5.132431 0.230606 +v 6.321177 -5.000000 0.230606 +v 6.334221 -4.867568 0.230606 +v 6.372850 -4.740225 0.230606 +v 6.435580 -4.622866 0.230606 +v 6.520000 -4.520000 0.230606 +v 6.622867 -4.435579 0.230606 +v 6.740227 -4.372849 0.230606 +v 6.867569 -4.334221 0.230606 +v 7.000001 -4.321177 0.230606 +v 7.132433 -4.334221 0.230606 +v 7.259775 -4.372850 0.230606 +v 7.377135 -4.435580 0.230606 +v 7.424276 -4.365028 0.295909 +v 7.292247 -4.294456 0.295909 +v 7.148987 -4.250998 0.295909 +v 7.000001 -4.236325 0.295909 +v 6.851016 -4.250998 0.295909 +v 6.707755 -4.294456 0.295909 +v 6.575726 -4.365026 0.295909 +v 6.460001 -4.459999 0.295909 +v 6.365027 -4.575724 0.295909 +v 6.294456 -4.707753 0.295909 +v 6.250998 -4.851014 0.295909 +v 6.236325 -4.999999 0.295909 +v 6.250998 -5.148985 0.295909 +v 6.294456 -5.292245 0.295909 +v 6.365027 -5.424275 0.295909 +v 6.460000 -5.539999 0.295909 +v 6.575724 -5.634973 0.295909 +v 6.707754 -5.705544 0.295909 +v 6.851014 -5.749002 0.295909 +v 7.000000 -5.763675 0.295909 +v 7.148985 -5.749002 0.295909 +v 7.292246 -5.705544 0.295909 +v 7.424275 -5.634973 0.295909 +v 7.540000 -5.540000 0.295909 +v 7.634973 -5.424275 0.295909 +v 7.705544 -5.292246 0.295909 +v 7.749002 -5.148985 0.295909 +v 7.763675 -5.000000 0.295909 +v 7.749002 -4.851014 0.295909 +v 7.705544 -4.707754 0.295909 +v 7.634973 -4.575725 0.295909 +v 7.540000 -4.460000 0.295909 +v 7.270000 -4.730000 0.600000 +v 7.317486 -4.787862 0.600000 +v 7.352772 -4.853877 0.600000 +v 7.374501 -4.925507 0.600000 +v 7.381838 -5.000000 0.600000 +v 7.374501 -5.074493 0.600000 +v 7.352772 -5.146123 0.600000 +v 7.317486 -5.212138 0.600000 +v 7.270000 -5.270000 0.600000 +v 7.212138 -5.317486 0.600000 +v 7.146123 -5.352772 0.600000 +v 7.074493 -5.374501 0.600000 +v 7.000000 -5.381838 0.600000 +v 6.925507 -5.374501 0.600000 +v 6.853877 -5.352772 0.600000 +v 6.787862 -5.317486 0.600000 +v 6.730000 -5.270000 0.600000 +v 6.682513 -5.212137 0.600000 +v 6.647228 -5.146122 0.600000 +v 6.625499 -5.074492 0.600000 +v 6.618162 -5.000000 0.600000 +v 6.625499 -4.925507 0.600000 +v 6.647228 -4.853877 0.600000 +v 6.682514 -4.787862 0.600000 +v 6.730000 -4.730000 0.600000 +v 6.787863 -4.682513 0.600000 +v 6.853878 -4.647228 0.600000 +v 6.925508 -4.625499 0.600000 +v 7.000000 -4.618162 0.600000 +v 7.074493 -4.625499 0.600000 +v 7.146123 -4.647228 0.600000 +v 7.212138 -4.682514 0.600000 +v 7.247123 -4.630155 0.659519 +v 7.170222 -4.589050 0.659519 +v 7.086779 -4.563738 0.659519 +v 7.000000 -4.555191 0.659519 +v 6.913223 -4.563738 0.659519 +v 6.829780 -4.589050 0.659519 +v 6.752878 -4.630155 0.659519 +v 6.685473 -4.685472 0.659519 +v 6.630155 -4.752877 0.659519 +v 6.589050 -4.829779 0.659519 +v 6.563738 -4.913222 0.659519 +v 6.555191 -5.000000 0.659519 +v 6.563738 -5.086778 0.659519 +v 6.589050 -5.170221 0.659519 +v 6.630155 -5.247122 0.659519 +v 6.685472 -5.314528 0.659519 +v 6.752877 -5.369845 0.659519 +v 6.829779 -5.410950 0.659519 +v 6.913222 -5.436262 0.659519 +v 7.000000 -5.444809 0.659519 +v 7.086778 -5.436262 0.659519 +v 7.170221 -5.410950 0.659519 +v 7.247123 -5.369845 0.659519 +v 7.314528 -5.314528 0.659519 +v 7.369845 -5.247123 0.659519 +v 7.410950 -5.170221 0.659519 +v 7.436262 -5.086778 0.659519 +v 7.444809 -5.000000 0.659519 +v 7.436262 -4.913222 0.659519 +v 7.410950 -4.829779 0.659519 +v 7.369845 -4.752877 0.659519 +v 7.314528 -4.685472 0.659519 +v 7.267300 -4.732700 0.713255 +v 7.314312 -4.789984 0.713255 +v 7.349244 -4.855338 0.713255 +v 7.370756 -4.926252 0.713255 +v 7.378019 -5.000000 0.713255 +v 7.370756 -5.073748 0.713255 +v 7.349244 -5.144662 0.713255 +v 7.314312 -5.210016 0.713255 +v 7.267300 -5.267300 0.713255 +v 7.210016 -5.314312 0.713255 +v 7.144662 -5.349244 0.713255 +v 7.073748 -5.370756 0.713255 +v 7.000000 -5.378019 0.713255 +v 6.926252 -5.370756 0.713255 +v 6.855338 -5.349244 0.713255 +v 6.789984 -5.314312 0.713255 +v 6.732700 -5.267300 0.713255 +v 6.685688 -5.210016 0.713255 +v 6.650755 -5.144661 0.713255 +v 6.629244 -5.073748 0.713255 +v 6.621981 -5.000000 0.713255 +v 6.629244 -4.926252 0.713255 +v 6.650756 -4.855338 0.713255 +v 6.685688 -4.789983 0.713255 +v 6.732700 -4.732699 0.713255 +v 6.789984 -4.685688 0.713255 +v 6.855339 -4.650755 0.713255 +v 6.926253 -4.629244 0.713255 +v 7.000000 -4.621981 0.713255 +v 7.073749 -4.629244 0.713255 +v 7.144662 -4.650756 0.713255 +v 7.210017 -4.685689 0.713255 +v 7.000000 -5.000000 0.000000 +v 7.296604 -4.939839 1.500000 +v 7.338684 -4.930305 1.531821 +v 7.377504 -4.922584 1.567695 +v 7.412688 -4.915586 1.607275 +v 7.443898 -4.909377 1.650181 +v 7.470833 -4.904020 1.696000 +v 7.493233 -4.899564 1.744289 +v 7.510883 -4.896053 1.794585 +v 7.523614 -4.893521 1.846402 +v 7.531301 -4.891992 1.899242 +v 7.533872 -4.891480 1.952596 +v 7.531301 -4.891992 2.005950 +v 7.523614 -4.893521 2.058790 +v 7.510883 -4.896053 2.110608 +v 7.493233 -4.899564 2.160903 +v 7.470833 -4.904020 2.209193 +v 7.443898 -4.909377 2.255011 +v 7.412688 -4.915586 2.297917 +v 7.377504 -4.922584 2.337497 +v 7.338685 -4.930305 2.373371 +v 7.296603 -4.938676 2.405192 +v 7.251665 -4.947615 2.432654 +v 7.204303 -4.957036 2.455493 +v 7.154974 -4.966848 2.473490 +v 7.104152 -4.976957 2.486469 +v 7.052328 -4.987266 2.494308 +v 7.049292 -4.977257 2.494308 +v 7.098109 -4.957036 2.486469 +v 7.145982 -4.937206 2.473490 +v 7.192450 -4.917959 2.455493 +v 7.237063 -4.899479 2.432654 +v 7.279394 -4.881945 2.405192 +v 7.319034 -4.865526 2.373371 +v 7.355601 -4.850379 2.337497 +v 7.388744 -4.836651 2.297917 +v 7.418143 -4.824473 2.255011 +v 7.443515 -4.813964 2.209193 +v 7.464615 -4.805224 2.160903 +v 7.481242 -4.798337 2.110608 +v 7.493233 -4.793370 2.058790 +v 7.500474 -4.790370 2.005950 +v 7.502896 -4.789367 1.952596 +v 7.500474 -4.790370 1.899242 +v 7.493233 -4.793370 1.846402 +v 7.481242 -4.798337 1.794585 +v 7.464615 -4.805224 1.744289 +v 7.443515 -4.813964 1.696000 +v 7.418143 -4.824473 1.650181 +v 7.388743 -4.836651 1.607275 +v 7.355601 -4.850379 1.567695 +v 7.319034 -4.865526 1.531821 +v 7.279395 -4.883108 1.500000 +v 7.251448 -4.830824 1.500000 +v 7.287122 -4.805825 1.531821 +v 7.320032 -4.783835 1.567695 +v 7.349860 -4.763905 1.607275 +v 7.376318 -4.746226 1.650181 +v 7.399153 -4.730968 1.696000 +v 7.418143 -4.718280 1.744289 +v 7.433106 -4.708282 1.794585 +v 7.443898 -4.701070 1.846402 +v 7.450415 -4.696716 1.899242 +v 7.452595 -4.695260 1.952596 +v 7.450415 -4.696716 2.005950 +v 7.443898 -4.701070 2.058790 +v 7.433106 -4.708282 2.110608 +v 7.418143 -4.718279 2.160903 +v 7.399153 -4.730968 2.209193 +v 7.376318 -4.746226 2.255011 +v 7.349860 -4.763905 2.297917 +v 7.320032 -4.783835 2.337497 +v 7.287123 -4.805824 2.373371 +v 7.251448 -4.829662 2.405192 +v 7.213351 -4.855117 2.432654 +v 7.173200 -4.881945 2.455493 +v 7.131381 -4.909888 2.473490 +v 7.088296 -4.938676 2.486469 +v 7.044361 -4.968032 2.494308 +v 7.037726 -4.959948 2.494308 +v 7.075089 -4.922584 2.486469 +v 7.111730 -4.885943 2.473490 +v 7.147294 -4.850379 2.455493 +v 7.181440 -4.816233 2.432654 +v 7.213839 -4.783835 2.405192 +v 7.244177 -4.753496 2.373371 +v 7.272165 -4.725508 2.337497 +v 7.297531 -4.700142 2.297917 +v 7.320033 -4.677641 2.255011 +v 7.339451 -4.658222 2.209193 +v 7.355601 -4.642072 2.160903 +v 7.368326 -4.629347 2.110608 +v 7.377504 -4.620169 2.058790 +v 7.383047 -4.614627 2.005950 +v 7.384900 -4.612773 1.952596 +v 7.383047 -4.614627 1.899242 +v 7.377504 -4.620169 1.846402 +v 7.368326 -4.629347 1.794585 +v 7.355601 -4.642072 1.744289 +v 7.339451 -4.658222 1.696000 +v 7.320032 -4.677641 1.650181 +v 7.297531 -4.700142 1.607275 +v 7.272165 -4.725508 1.567695 +v 7.244177 -4.753496 1.531821 +v 7.213839 -4.784997 1.500000 +v 7.168013 -4.747388 1.500000 +v 7.191849 -4.710551 1.531821 +v 7.213838 -4.677641 1.567695 +v 7.233768 -4.647813 1.607275 +v 7.251448 -4.621355 1.650181 +v 7.266705 -4.598521 1.696000 +v 7.279394 -4.579531 1.744289 +v 7.289392 -4.564568 1.794585 +v 7.296603 -4.553775 1.846402 +v 7.300958 -4.547258 1.899242 +v 7.302413 -4.545079 1.952596 +v 7.300958 -4.547258 2.005950 +v 7.296603 -4.553775 2.058790 +v 7.289392 -4.564568 2.110608 +v 7.279394 -4.579531 2.160903 +v 7.266705 -4.598521 2.209193 +v 7.251448 -4.621355 2.255011 +v 7.233768 -4.647813 2.297917 +v 7.213839 -4.677641 2.337497 +v 7.191849 -4.710551 2.373371 +v 7.168012 -4.746226 2.405192 +v 7.142556 -4.784322 2.432654 +v 7.115728 -4.824473 2.455493 +v 7.087785 -4.866293 2.473490 +v 7.058997 -4.909377 2.486469 +v 7.029641 -4.953312 2.494308 +v 7.020417 -4.948382 2.494308 +v 7.040637 -4.899564 2.486469 +v 7.060467 -4.851691 2.473490 +v 7.079714 -4.805224 2.455493 +v 7.098194 -4.760610 2.432654 +v 7.115728 -4.718279 2.405192 +v 7.132147 -4.678639 2.373371 +v 7.147294 -4.642072 2.337497 +v 7.161022 -4.608930 2.297917 +v 7.173200 -4.579531 2.255011 +v 7.183709 -4.554159 2.209193 +v 7.192450 -4.533058 2.160903 +v 7.199336 -4.516432 2.110608 +v 7.204303 -4.504440 2.058790 +v 7.207303 -4.497199 2.005950 +v 7.208306 -4.494777 1.952596 +v 7.207303 -4.497199 1.899242 +v 7.204303 -4.504440 1.846402 +v 7.199336 -4.516432 1.794585 +v 7.192450 -4.533058 1.744289 +v 7.183709 -4.554159 1.696000 +v 7.173200 -4.579531 1.650181 +v 7.161022 -4.608930 1.607275 +v 7.147294 -4.642072 1.567695 +v 7.132147 -4.678640 1.531821 +v 7.115729 -4.719442 1.500000 +v 7.058998 -4.702233 1.500000 +v 7.067368 -4.658989 1.531821 +v 7.075089 -4.620169 1.567695 +v 7.082088 -4.584985 1.607275 +v 7.088296 -4.553775 1.650181 +v 7.093654 -4.526841 1.696000 +v 7.098109 -4.504440 1.744289 +v 7.101620 -4.486790 1.794585 +v 7.104152 -4.474060 1.846402 +v 7.105681 -4.466372 1.899242 +v 7.106193 -4.463801 1.952596 +v 7.105681 -4.466372 2.005950 +v 7.104152 -4.474060 2.058790 +v 7.101620 -4.486790 2.110608 +v 7.098109 -4.504440 2.160903 +v 7.093654 -4.526841 2.209193 +v 7.088296 -4.553775 2.255011 +v 7.082088 -4.584985 2.297917 +v 7.075089 -4.620169 2.337497 +v 7.067368 -4.658989 2.373371 +v 7.058997 -4.701070 2.405192 +v 7.050058 -4.746008 2.432654 +v 7.040637 -4.793370 2.455493 +v 7.030826 -4.842699 2.473490 +v 7.020716 -4.893521 2.486469 +v 7.010408 -4.945345 2.494308 +v 6.999999 -4.944321 2.494308 +v 6.999999 -4.891480 2.486469 +v 6.999999 -4.839663 2.473490 +v 6.999999 -4.789367 2.455493 +v 6.999999 -4.741078 2.432654 +v 6.999999 -4.695260 2.405192 +v 6.999999 -4.652354 2.373371 +v 6.999999 -4.612773 2.337497 +v 6.999999 -4.576900 2.297917 +v 6.999999 -4.545079 2.255011 +v 6.999999 -4.517616 2.209193 +v 6.999999 -4.494777 2.160903 +v 6.999999 -4.476781 2.110608 +v 6.999999 -4.463801 2.058790 +v 6.999999 -4.455963 2.005950 +v 6.999999 -4.453342 1.952596 +v 6.999999 -4.455963 1.899242 +v 6.999999 -4.463801 1.846402 +v 6.999999 -4.476781 1.794585 +v 6.999999 -4.494777 1.744289 +v 6.999999 -4.517616 1.696000 +v 6.999999 -4.545079 1.650181 +v 6.999999 -4.576900 1.607275 +v 6.999999 -4.612773 1.567695 +v 6.999999 -4.652354 1.531821 +v 7.000000 -4.696423 1.500000 +v 6.941001 -4.702233 1.500000 +v 6.932630 -4.658989 1.531821 +v 6.924909 -4.620169 1.567695 +v 6.917910 -4.584985 1.607275 +v 6.911702 -4.553775 1.650181 +v 6.906344 -4.526841 1.696000 +v 6.901888 -4.504440 1.744289 +v 6.898378 -4.486790 1.794585 +v 6.895845 -4.474060 1.846402 +v 6.894316 -4.466372 1.899242 +v 6.893805 -4.463801 1.952596 +v 6.894316 -4.466372 2.005950 +v 6.895845 -4.474060 2.058790 +v 6.898377 -4.486790 2.110608 +v 6.901888 -4.504440 2.160903 +v 6.906344 -4.526841 2.209193 +v 6.911702 -4.553775 2.255011 +v 6.917910 -4.584985 2.297917 +v 6.924909 -4.620169 2.337497 +v 6.932630 -4.658989 2.373371 +v 6.941001 -4.701070 2.405192 +v 6.949939 -4.746008 2.432654 +v 6.959360 -4.793370 2.455493 +v 6.969172 -4.842699 2.473490 +v 6.979281 -4.893521 2.486469 +v 6.989590 -4.945345 2.494308 +v 6.979581 -4.948382 2.494308 +v 6.959360 -4.899564 2.486469 +v 6.939531 -4.851691 2.473490 +v 6.920283 -4.805224 2.455493 +v 6.901804 -4.760610 2.432654 +v 6.884270 -4.718280 2.405192 +v 6.867850 -4.678640 2.373371 +v 6.852704 -4.642072 2.337497 +v 6.838975 -4.608930 2.297917 +v 6.826798 -4.579531 2.255011 +v 6.816288 -4.554159 2.209193 +v 6.807549 -4.533058 2.160903 +v 6.800662 -4.516432 2.110608 +v 6.795694 -4.504440 2.058790 +v 6.792695 -4.497199 2.005950 +v 6.791692 -4.494777 1.952596 +v 6.792695 -4.497199 1.899242 +v 6.795694 -4.504440 1.846402 +v 6.800662 -4.516432 1.794585 +v 6.807549 -4.533058 1.744289 +v 6.816289 -4.554159 1.696000 +v 6.826798 -4.579531 1.650181 +v 6.838975 -4.608930 1.607275 +v 6.852704 -4.642073 1.567695 +v 6.867850 -4.678640 1.531821 +v 6.884271 -4.719442 1.500000 +v 6.831987 -4.747388 1.500000 +v 6.808149 -4.710551 1.531821 +v 6.786160 -4.677641 1.567695 +v 6.766229 -4.647813 1.607275 +v 6.748550 -4.621355 1.650181 +v 6.733293 -4.598521 1.696000 +v 6.720604 -4.579531 1.744289 +v 6.710606 -4.564568 1.794585 +v 6.703395 -4.553775 1.846402 +v 6.699040 -4.547258 1.899242 +v 6.697584 -4.545079 1.952596 +v 6.699040 -4.547258 2.005950 +v 6.703395 -4.553775 2.058790 +v 6.710606 -4.564568 2.110608 +v 6.720604 -4.579531 2.160903 +v 6.733293 -4.598521 2.209193 +v 6.748550 -4.621355 2.255011 +v 6.766229 -4.647813 2.297917 +v 6.786160 -4.677641 2.337497 +v 6.808149 -4.710551 2.373371 +v 6.831986 -4.746226 2.405192 +v 6.857441 -4.784322 2.432654 +v 6.884270 -4.824473 2.455493 +v 6.912212 -4.866293 2.473490 +v 6.941001 -4.909377 2.486469 +v 6.970357 -4.953312 2.494308 +v 6.962272 -4.959948 2.494308 +v 6.924909 -4.922584 2.486469 +v 6.888268 -4.885943 2.473490 +v 6.852704 -4.850379 2.455493 +v 6.818558 -4.816233 2.432654 +v 6.786160 -4.783835 2.405192 +v 6.755820 -4.753496 2.373371 +v 6.727833 -4.725508 2.337497 +v 6.702466 -4.700142 2.297917 +v 6.679965 -4.677641 2.255011 +v 6.660547 -4.658222 2.209193 +v 6.644397 -4.642072 2.160903 +v 6.631672 -4.629347 2.110608 +v 6.622494 -4.620169 2.058790 +v 6.616951 -4.614627 2.005950 +v 6.615098 -4.612773 1.952596 +v 6.616951 -4.614627 1.899242 +v 6.622494 -4.620169 1.846402 +v 6.631672 -4.629347 1.794585 +v 6.644397 -4.642072 1.744289 +v 6.660547 -4.658222 1.696000 +v 6.679965 -4.677641 1.650181 +v 6.702466 -4.700142 1.607275 +v 6.727833 -4.725509 1.567695 +v 6.755821 -4.753496 1.531821 +v 6.786160 -4.784997 1.500000 +v 6.748550 -4.830824 1.500000 +v 6.712875 -4.805825 1.531821 +v 6.679966 -4.783835 1.567695 +v 6.650138 -4.763905 1.607275 +v 6.623680 -4.746226 1.650181 +v 6.600845 -4.730968 1.696000 +v 6.581855 -4.718280 1.744289 +v 6.566892 -4.708282 1.794585 +v 6.556100 -4.701071 1.846402 +v 6.549583 -4.696716 1.899242 +v 6.547403 -4.695260 1.952596 +v 6.549583 -4.696716 2.005950 +v 6.556100 -4.701071 2.058790 +v 6.566892 -4.708282 2.110608 +v 6.581855 -4.718280 2.160903 +v 6.600845 -4.730968 2.209193 +v 6.623680 -4.746226 2.255011 +v 6.650138 -4.763905 2.297917 +v 6.679965 -4.783835 2.337497 +v 6.712875 -4.805824 2.373371 +v 6.748550 -4.829662 2.405192 +v 6.786647 -4.855117 2.432654 +v 6.826798 -4.881945 2.455493 +v 6.868618 -4.909888 2.473490 +v 6.911702 -4.938676 2.486469 +v 6.955637 -4.968032 2.494308 +v 6.950706 -4.977257 2.494308 +v 6.901888 -4.957036 2.486469 +v 6.854016 -4.937206 2.473490 +v 6.807549 -4.917959 2.455493 +v 6.762935 -4.899479 2.432654 +v 6.720604 -4.881945 2.405192 +v 6.680964 -4.865526 2.373371 +v 6.644397 -4.850379 2.337497 +v 6.611254 -4.836651 2.297917 +v 6.581855 -4.824473 2.255011 +v 6.556483 -4.813964 2.209193 +v 6.535383 -4.805224 2.160903 +v 6.518756 -4.798337 2.110608 +v 6.506765 -4.793370 2.058790 +v 6.499523 -4.790370 2.005950 +v 6.497102 -4.789368 1.952596 +v 6.499523 -4.790370 1.899242 +v 6.506765 -4.793370 1.846402 +v 6.518756 -4.798337 1.794585 +v 6.535383 -4.805224 1.744289 +v 6.556483 -4.813964 1.696000 +v 6.581855 -4.824473 1.650181 +v 6.611254 -4.836651 1.607275 +v 6.644397 -4.850379 1.567695 +v 6.680964 -4.865526 1.531821 +v 6.720605 -4.883108 1.500000 +v 6.703395 -4.939839 1.500000 +v 6.661314 -4.930306 1.531821 +v 6.622494 -4.922584 1.567695 +v 6.587310 -4.915586 1.607275 +v 6.556100 -4.909378 1.650181 +v 6.529165 -4.904020 1.696000 +v 6.506765 -4.899564 1.744289 +v 6.489115 -4.896053 1.794585 +v 6.476384 -4.893521 1.846402 +v 6.468697 -4.891992 1.899242 +v 6.466126 -4.891480 1.952596 +v 6.468697 -4.891992 2.005950 +v 6.476384 -4.893521 2.058790 +v 6.489115 -4.896053 2.110608 +v 6.506765 -4.899564 2.160903 +v 6.529165 -4.904020 2.209193 +v 6.556100 -4.909378 2.255011 +v 6.587310 -4.915586 2.297917 +v 6.622494 -4.922584 2.337497 +v 6.661314 -4.930305 2.373371 +v 6.703395 -4.938676 2.405192 +v 6.748333 -4.947615 2.432654 +v 6.795695 -4.957036 2.455493 +v 6.845024 -4.966848 2.473490 +v 6.895845 -4.976957 2.486469 +v 6.947670 -4.987266 2.494308 +v 6.946645 -4.997674 2.494308 +v 6.893805 -4.997674 2.486469 +v 6.841988 -4.997674 2.473490 +v 6.791692 -4.997674 2.455493 +v 6.743402 -4.997674 2.432654 +v 6.697584 -4.997674 2.405192 +v 6.654678 -4.997674 2.373371 +v 6.615098 -4.997674 2.337497 +v 6.579225 -4.997674 2.297917 +v 6.547403 -4.997674 2.255011 +v 6.519941 -4.997674 2.209193 +v 6.497102 -4.997674 2.160903 +v 6.479106 -4.997674 2.110608 +v 6.466126 -4.997674 2.058790 +v 6.458288 -4.997674 2.005950 +v 6.455667 -4.997674 1.952596 +v 6.458288 -4.997674 1.899242 +v 6.466126 -4.997674 1.846402 +v 6.479106 -4.997674 1.794585 +v 6.497102 -4.997674 1.744289 +v 6.519941 -4.997674 1.696000 +v 6.547403 -4.997674 1.650181 +v 6.579225 -4.997674 1.607275 +v 6.615098 -4.997674 1.567695 +v 6.654679 -4.997674 1.531821 +v 6.697585 -4.998837 1.500000 +v 6.703395 -5.057836 1.500000 +v 6.661314 -5.065043 1.531821 +v 6.622494 -5.072765 1.567695 +v 6.587310 -5.079763 1.607275 +v 6.556100 -5.085971 1.650181 +v 6.529165 -5.091329 1.696000 +v 6.506765 -5.095785 1.744289 +v 6.489115 -5.099296 1.794585 +v 6.476384 -5.101828 1.846402 +v 6.468697 -5.103357 1.899242 +v 6.466126 -5.103868 1.952596 +v 6.468697 -5.103357 2.005950 +v 6.476384 -5.101828 2.058790 +v 6.489115 -5.099296 2.110608 +v 6.506765 -5.095785 2.160903 +v 6.529165 -5.091329 2.209193 +v 6.556100 -5.085971 2.255011 +v 6.587310 -5.079763 2.297917 +v 6.622494 -5.072765 2.337497 +v 6.661314 -5.065043 2.373371 +v 6.703395 -5.056673 2.405192 +v 6.748333 -5.047734 2.432654 +v 6.795695 -5.038313 2.455493 +v 6.845024 -5.028501 2.473490 +v 6.895845 -5.018392 2.486469 +v 6.947670 -5.008083 2.494308 +v 6.950706 -5.018092 2.494308 +v 6.901888 -5.038313 2.486469 +v 6.854016 -5.058143 2.473490 +v 6.807549 -5.077390 2.455493 +v 6.762935 -5.095870 2.432654 +v 6.720604 -5.113403 2.405192 +v 6.680964 -5.129823 2.373371 +v 6.644397 -5.144969 2.337497 +v 6.611254 -5.158698 2.297917 +v 6.581855 -5.170875 2.255011 +v 6.556483 -5.181385 2.209193 +v 6.535383 -5.190125 2.160903 +v 6.518756 -5.197011 2.110608 +v 6.506765 -5.201979 2.058790 +v 6.499524 -5.204978 2.005950 +v 6.497102 -5.205981 1.952596 +v 6.499524 -5.204978 1.899242 +v 6.506765 -5.201979 1.846402 +v 6.518756 -5.197011 1.794585 +v 6.535383 -5.190125 1.744289 +v 6.556483 -5.181385 1.696000 +v 6.581855 -5.170875 1.650181 +v 6.611255 -5.158698 1.607275 +v 6.644397 -5.144969 1.567695 +v 6.680964 -5.129823 1.531821 +v 6.720604 -5.114566 1.500000 +v 6.748550 -5.166850 1.500000 +v 6.712876 -5.189524 1.531821 +v 6.679966 -5.211514 1.567695 +v 6.650138 -5.231444 1.607275 +v 6.623680 -5.249123 1.650181 +v 6.600845 -5.264380 1.696000 +v 6.581855 -5.277069 1.744289 +v 6.566892 -5.287067 1.794585 +v 6.556100 -5.294278 1.846402 +v 6.549583 -5.298633 1.899242 +v 6.547403 -5.300089 1.952596 +v 6.549583 -5.298633 2.005950 +v 6.556100 -5.294278 2.058790 +v 6.566892 -5.287067 2.110608 +v 6.581855 -5.277069 2.160903 +v 6.600845 -5.264380 2.209193 +v 6.623680 -5.249123 2.255011 +v 6.650138 -5.231444 2.297917 +v 6.679965 -5.211514 2.337497 +v 6.712875 -5.189524 2.373371 +v 6.748550 -5.165687 2.405192 +v 6.786647 -5.140232 2.432654 +v 6.826798 -5.113403 2.455493 +v 6.868618 -5.085461 2.473490 +v 6.911702 -5.056673 2.486469 +v 6.955637 -5.027316 2.494308 +v 6.999999 -4.997674 2.496929 +v 6.962272 -5.035401 2.494308 +v 6.924909 -5.072765 2.486469 +v 6.888268 -5.109405 2.473490 +v 6.852704 -5.144969 2.455493 +v 6.818558 -5.179115 2.432654 +v 6.786160 -5.211514 2.405192 +v 6.755820 -5.241853 2.373371 +v 6.727833 -5.269840 2.337497 +v 6.702467 -5.295207 2.297917 +v 6.679965 -5.317708 2.255011 +v 6.660547 -5.337127 2.209193 +v 6.644397 -5.353276 2.160903 +v 6.631672 -5.366001 2.110608 +v 6.622494 -5.375179 2.058790 +v 6.616951 -5.380722 2.005950 +v 6.615098 -5.382575 1.952596 +v 6.616951 -5.380722 1.899242 +v 6.622494 -5.375179 1.846402 +v 6.631672 -5.366001 1.794585 +v 6.644397 -5.353276 1.744289 +v 6.660547 -5.337127 1.696000 +v 6.679966 -5.317708 1.650181 +v 6.702467 -5.295207 1.607275 +v 6.727833 -5.269840 1.567695 +v 6.755821 -5.241853 1.531821 +v 6.786160 -5.212677 1.500000 +v 6.831986 -5.250286 1.500000 +v 6.808149 -5.284798 1.531821 +v 6.786160 -5.317708 1.567695 +v 6.766230 -5.347535 1.607275 +v 6.748550 -5.373993 1.650181 +v 6.733293 -5.396828 1.696000 +v 6.720604 -5.415818 1.744289 +v 6.710606 -5.430781 1.794585 +v 6.703395 -5.441573 1.846402 +v 6.699040 -5.448091 1.899242 +v 6.697584 -5.450270 1.952596 +v 6.699040 -5.448091 2.005950 +v 6.703395 -5.441573 2.058790 +v 6.710607 -5.430781 2.110608 +v 6.720604 -5.415818 2.160903 +v 6.733293 -5.396828 2.209193 +v 6.748550 -5.373994 2.255011 +v 6.766230 -5.347535 2.297917 +v 6.786160 -5.317708 2.337497 +v 6.808149 -5.284798 2.373371 +v 6.831986 -5.249123 2.405192 +v 6.857442 -5.211026 2.432654 +v 6.884270 -5.170875 2.455493 +v 6.912213 -5.129056 2.473490 +v 6.941001 -5.085971 2.486469 +v 6.970357 -5.042037 2.494308 +v 6.979581 -5.046967 2.494308 +v 6.959360 -5.095785 2.486469 +v 6.939531 -5.143658 2.473490 +v 6.920283 -5.190125 2.455493 +v 6.901804 -5.234738 2.432654 +v 6.884270 -5.277069 2.405192 +v 6.867851 -5.316709 2.373371 +v 6.852704 -5.353276 2.337497 +v 6.838976 -5.386419 2.297917 +v 6.826798 -5.415818 2.255011 +v 6.816289 -5.441190 2.209193 +v 6.807549 -5.462291 2.160903 +v 6.800662 -5.478917 2.110608 +v 6.795695 -5.490909 2.058790 +v 6.792696 -5.498150 2.005950 +v 6.791692 -5.500571 1.952596 +v 6.792696 -5.498150 1.899242 +v 6.795695 -5.490909 1.846402 +v 6.800662 -5.478917 1.794585 +v 6.807549 -5.462291 1.744289 +v 6.816289 -5.441190 1.696000 +v 6.826798 -5.415818 1.650181 +v 6.838976 -5.386419 1.607275 +v 6.852704 -5.353276 1.567695 +v 6.867851 -5.316709 1.531821 +v 6.884271 -5.278232 1.500000 +v 6.941001 -5.295441 1.500000 +v 6.932631 -5.336360 1.531821 +v 6.924909 -5.375179 1.567695 +v 6.917910 -5.410363 1.607275 +v 6.911702 -5.441573 1.650181 +v 6.906344 -5.468508 1.696000 +v 6.901889 -5.490908 1.744289 +v 6.898378 -5.508558 1.794585 +v 6.895846 -5.521289 1.846402 +v 6.894317 -5.528976 1.899242 +v 6.893805 -5.531547 1.952596 +v 6.894317 -5.528976 2.005950 +v 6.895846 -5.521289 2.058790 +v 6.898378 -5.508558 2.110608 +v 6.901889 -5.490908 2.160903 +v 6.906344 -5.468508 2.209193 +v 6.911702 -5.441573 2.255011 +v 6.917910 -5.410363 2.297917 +v 6.924909 -5.375179 2.337497 +v 6.932631 -5.336360 2.373371 +v 6.941001 -5.294278 2.405192 +v 6.949940 -5.249340 2.432654 +v 6.959360 -5.201979 2.455493 +v 6.969172 -5.152649 2.473490 +v 6.979281 -5.101828 2.486469 +v 6.989590 -5.050003 2.494308 +v 6.999999 -5.051028 2.494308 +v 6.999999 -5.103868 2.486469 +v 6.999999 -5.155685 2.473490 +v 6.999999 -5.205981 2.455493 +v 6.999999 -5.254271 2.432654 +v 6.999999 -5.300089 2.405192 +v 6.999999 -5.342995 2.373371 +v 6.999999 -5.382575 2.337497 +v 6.999999 -5.418448 2.297917 +v 6.999999 -5.450270 2.255011 +v 6.999999 -5.477732 2.209193 +v 6.999999 -5.500571 2.160903 +v 6.999999 -5.518567 2.110608 +v 6.999999 -5.531547 2.058790 +v 6.999999 -5.539385 2.005950 +v 6.999999 -5.542006 1.952596 +v 6.999999 -5.539385 1.899242 +v 6.999999 -5.531547 1.846402 +v 6.999999 -5.518567 1.794585 +v 6.999999 -5.500571 1.744289 +v 6.999999 -5.477732 1.696000 +v 6.999999 -5.450270 1.650181 +v 6.999999 -5.418448 1.607275 +v 6.999999 -5.382575 1.567695 +v 6.999999 -5.342995 1.531821 +v 7.000000 -5.301252 1.500000 +v 7.058998 -5.295441 1.500000 +v 7.067368 -5.336359 1.531821 +v 7.075089 -5.375179 1.567695 +v 7.082088 -5.410363 1.607275 +v 7.088296 -5.441573 1.650181 +v 7.093654 -5.468508 1.696000 +v 7.098109 -5.490908 1.744289 +v 7.101620 -5.508558 1.794585 +v 7.104153 -5.521289 1.846402 +v 7.105681 -5.528976 1.899242 +v 7.106193 -5.531547 1.952596 +v 7.105681 -5.528976 2.005950 +v 7.104153 -5.521289 2.058790 +v 7.101620 -5.508558 2.110608 +v 7.098109 -5.490908 2.160903 +v 7.093654 -5.468508 2.209193 +v 7.088296 -5.441573 2.255011 +v 7.082088 -5.410363 2.297917 +v 7.075089 -5.375179 2.337497 +v 7.067368 -5.336360 2.373371 +v 7.058997 -5.294278 2.405192 +v 7.050058 -5.249340 2.432654 +v 7.040637 -5.201979 2.455493 +v 7.030826 -5.152649 2.473490 +v 7.020716 -5.101828 2.486469 +v 7.010408 -5.050003 2.494308 +v 7.020417 -5.046967 2.494308 +v 7.040637 -5.095785 2.486469 +v 7.060467 -5.143658 2.473490 +v 7.079714 -5.190125 2.455493 +v 7.098194 -5.234738 2.432654 +v 7.115728 -5.277069 2.405192 +v 7.132147 -5.316709 2.373371 +v 7.147294 -5.353276 2.337497 +v 7.161022 -5.386419 2.297917 +v 7.173200 -5.415818 2.255011 +v 7.183709 -5.441190 2.209193 +v 7.192450 -5.462290 2.160903 +v 7.199336 -5.478917 2.110608 +v 7.204303 -5.490908 2.058790 +v 7.207303 -5.498149 2.005950 +v 7.208306 -5.500571 1.952596 +v 7.207303 -5.498149 1.899242 +v 7.204303 -5.490908 1.846402 +v 7.199336 -5.478917 1.794585 +v 7.192449 -5.462291 1.744289 +v 7.183709 -5.441190 1.696000 +v 7.173200 -5.415818 1.650181 +v 7.161022 -5.386419 1.607275 +v 7.147294 -5.353276 1.567695 +v 7.132147 -5.316709 1.531821 +v 7.115728 -5.278232 1.500000 +v 7.168012 -5.250286 1.500000 +v 7.191849 -5.284798 1.531821 +v 7.213838 -5.317707 1.567695 +v 7.233768 -5.347535 1.607275 +v 7.251448 -5.373993 1.650181 +v 7.266705 -5.396828 1.696000 +v 7.279394 -5.415818 1.744289 +v 7.289392 -5.430781 1.794585 +v 7.296603 -5.441573 1.846402 +v 7.300957 -5.448090 1.899242 +v 7.302413 -5.450270 1.952596 +v 7.300957 -5.448090 2.005950 +v 7.296603 -5.441573 2.058790 +v 7.289392 -5.430781 2.110608 +v 7.279394 -5.415818 2.160903 +v 7.266705 -5.396828 2.209193 +v 7.251448 -5.373993 2.255011 +v 7.233768 -5.347535 2.297917 +v 7.213838 -5.317708 2.337497 +v 7.191849 -5.284798 2.373371 +v 7.168012 -5.249123 2.405192 +v 7.142556 -5.211026 2.432654 +v 7.115728 -5.170875 2.455493 +v 7.087785 -5.129056 2.473490 +v 7.058997 -5.085971 2.486469 +v 7.029641 -5.042037 2.494308 +v 7.037726 -5.035401 2.494308 +v 7.075089 -5.072765 2.486469 +v 7.111730 -5.109405 2.473490 +v 7.147294 -5.144969 2.455493 +v 7.181440 -5.179115 2.432654 +v 7.213838 -5.211514 2.405192 +v 7.244177 -5.241853 2.373371 +v 7.272165 -5.269840 2.337497 +v 7.297531 -5.295207 2.297917 +v 7.320032 -5.317708 2.255011 +v 7.339451 -5.337126 2.209193 +v 7.355601 -5.353276 2.160903 +v 7.368326 -5.366001 2.110608 +v 7.377504 -5.375179 2.058790 +v 7.383046 -5.380722 2.005950 +v 7.384900 -5.382575 1.952596 +v 7.383046 -5.380722 1.899242 +v 7.377504 -5.375179 1.846402 +v 7.368326 -5.366001 1.794585 +v 7.355601 -5.353276 1.744289 +v 7.339451 -5.337126 1.696000 +v 7.320032 -5.317707 1.650181 +v 7.297531 -5.295206 1.607275 +v 7.272165 -5.269840 1.567695 +v 7.244177 -5.241852 1.531821 +v 7.213839 -5.212677 1.500000 +v 7.251448 -5.166850 1.500000 +v 7.287122 -5.189524 1.531821 +v 7.320032 -5.211514 1.567695 +v 7.349860 -5.231444 1.607275 +v 7.376318 -5.249123 1.650181 +v 7.399152 -5.264380 1.696000 +v 7.418142 -5.277069 1.744289 +v 7.433105 -5.287067 1.794585 +v 7.443898 -5.294278 1.846402 +v 7.450415 -5.298633 1.899242 +v 7.452594 -5.300089 1.952596 +v 7.450415 -5.298633 2.005950 +v 7.443898 -5.294278 2.058790 +v 7.433105 -5.287067 2.110608 +v 7.418142 -5.277069 2.160903 +v 7.399152 -5.264380 2.209193 +v 7.376318 -5.249123 2.255011 +v 7.349860 -5.231444 2.297917 +v 7.320032 -5.211514 2.337497 +v 7.287122 -5.189524 2.373371 +v 7.251447 -5.165687 2.405192 +v 7.213351 -5.140232 2.432654 +v 7.173200 -5.113403 2.455493 +v 7.131381 -5.085461 2.473490 +v 7.088296 -5.056673 2.486469 +v 7.044361 -5.027316 2.494308 +v 7.049292 -5.018092 2.494308 +v 7.098109 -5.038313 2.486469 +v 7.145982 -5.058143 2.473490 +v 7.192449 -5.077390 2.455493 +v 7.237063 -5.095870 2.432654 +v 7.279394 -5.113403 2.405192 +v 7.319034 -5.129823 2.373371 +v 7.355601 -5.144969 2.337497 +v 7.388743 -5.158698 2.297917 +v 7.418142 -5.170875 2.255011 +v 7.443514 -5.181384 2.209193 +v 7.464615 -5.190125 2.160903 +v 7.481241 -5.197011 2.110608 +v 7.493233 -5.201978 2.058790 +v 7.500474 -5.204978 2.005950 +v 7.502896 -5.205981 1.952596 +v 7.500474 -5.204978 1.899242 +v 7.493233 -5.201978 1.846402 +v 7.481241 -5.197011 1.794585 +v 7.464615 -5.190125 1.744289 +v 7.443514 -5.181385 1.696000 +v 7.418142 -5.170875 1.650181 +v 7.388743 -5.158698 1.607275 +v 7.355601 -5.144969 1.567695 +v 7.319033 -5.129823 1.531821 +v 7.279394 -5.114566 1.500000 +v 7.296603 -5.057836 1.500000 +v 7.338684 -5.065043 1.531821 +v 7.377504 -5.072764 1.567695 +v 7.412688 -5.079763 1.607275 +v 7.443898 -5.085971 1.650181 +v 7.470832 -5.091329 1.696000 +v 7.493233 -5.095785 1.744289 +v 7.510883 -5.099296 1.794585 +v 7.523613 -5.101828 1.846402 +v 7.531301 -5.103357 1.899242 +v 7.533872 -5.103868 1.952596 +v 7.531301 -5.103357 2.005950 +v 7.523613 -5.101828 2.058790 +v 7.510883 -5.099295 2.110608 +v 7.493233 -5.095785 2.160903 +v 7.470832 -5.091329 2.209193 +v 7.443898 -5.085971 2.255011 +v 7.412688 -5.079763 2.297917 +v 7.377504 -5.072764 2.337497 +v 7.338684 -5.065043 2.373371 +v 7.296603 -5.056673 2.405192 +v 7.251665 -5.047734 2.432654 +v 7.204303 -5.038313 2.455493 +v 7.154974 -5.028501 2.473490 +v 7.104152 -5.018392 2.486469 +v 7.052328 -5.008083 2.494308 +v 7.053353 -4.997674 2.494308 +v 7.106193 -4.997674 2.486469 +v 7.158010 -4.997674 2.473490 +v 7.208306 -4.997674 2.455493 +v 7.256595 -4.997674 2.432654 +v 7.302413 -4.997674 2.405192 +v 7.345319 -4.997674 2.373371 +v 7.384900 -4.997674 2.337497 +v 7.420773 -4.997674 2.297917 +v 7.452594 -4.997674 2.255011 +v 7.480057 -4.997674 2.209193 +v 7.502896 -4.997674 2.160903 +v 7.520892 -4.997674 2.110608 +v 7.533872 -4.997674 2.058790 +v 7.541709 -4.997674 2.005950 +v 7.544331 -4.997674 1.952596 +v 7.541709 -4.997674 1.899242 +v 7.533872 -4.997674 1.846402 +v 7.520892 -4.997674 1.794585 +v 7.502896 -4.997674 1.744289 +v 7.480057 -4.997674 1.696000 +v 7.452594 -4.997674 1.650181 +v 7.420773 -4.997674 1.607275 +v 7.384899 -4.997674 1.567695 +v 7.345319 -4.997674 1.531821 +v 7.302414 -4.998837 1.500000 +v 7.157950 -4.763030 1.439149 +v 7.201032 -4.798386 1.439149 +v 7.108798 -4.736757 1.439149 +v 7.055465 -4.720579 1.439149 +v 7.000000 -4.715116 1.439149 +v 6.944535 -4.720579 1.439149 +v 6.891202 -4.736757 1.439149 +v 6.842050 -4.763029 1.439149 +v 6.798967 -4.798386 1.439149 +v 6.763611 -4.841468 1.439149 +v 6.737339 -4.890620 1.439149 +v 6.721160 -4.943954 1.439149 +v 6.715697 -4.999418 1.439149 +v 6.721160 -5.054883 1.439149 +v 6.737338 -5.108216 1.439149 +v 6.763610 -5.157369 1.439149 +v 6.798967 -5.200451 1.439149 +v 6.842050 -5.235807 1.439149 +v 6.891202 -5.262080 1.439149 +v 6.944535 -5.278258 1.439149 +v 7.000000 -5.283721 1.439149 +v 7.055464 -5.278258 1.439149 +v 7.108798 -5.262080 1.439149 +v 7.157950 -5.235807 1.439149 +v 7.201032 -5.200451 1.439149 +v 7.236389 -5.157369 1.439149 +v 7.262661 -5.108216 1.439149 +v 7.278840 -5.054883 1.439149 +v 7.284302 -4.999419 1.439149 +v 7.278840 -4.943954 1.439149 +v 7.262661 -4.890621 1.439149 +v 7.236389 -4.841468 1.439149 +v 7.241204 -4.757923 1.469574 +v 7.283627 -4.809615 1.469574 +v 7.315149 -4.868589 1.469574 +v 7.334560 -4.932580 1.469574 +v 7.341115 -4.999128 1.469574 +v 7.334560 -5.065676 1.469574 +v 7.315149 -5.129667 1.469574 +v 7.283627 -5.188642 1.469574 +v 7.241204 -5.240333 1.469574 +v 7.189513 -5.282755 1.469574 +v 7.130538 -5.314277 1.469574 +v 7.066548 -5.333688 1.469574 +v 7.000000 -5.340243 1.469574 +v 6.933451 -5.333688 1.469574 +v 6.869461 -5.314277 1.469574 +v 6.810486 -5.282755 1.469574 +v 6.758794 -5.240333 1.469574 +v 6.716372 -5.188641 1.469574 +v 6.684850 -5.129667 1.469574 +v 6.665439 -5.065676 1.469574 +v 6.658885 -4.999128 1.469574 +v 6.665439 -4.932580 1.469574 +v 6.684851 -4.868588 1.469574 +v 6.716372 -4.809614 1.469574 +v 6.758795 -4.757923 1.469574 +v 6.810486 -4.715501 1.469574 +v 6.869461 -4.683979 1.469574 +v 6.933452 -4.664567 1.469574 +v 7.000000 -4.658013 1.469574 +v 7.066548 -4.664567 1.469574 +v 7.130539 -4.683979 1.469574 +v 7.189514 -4.715501 1.469574 +v 7.600000 -4.400000 0.086121 +v 7.471418 -4.294476 0.086121 +v 7.324719 -4.216063 0.086121 +v 7.165541 -4.167777 0.086121 +v 7.000001 -4.151472 0.086121 +v 6.834462 -4.167776 0.086121 +v 6.675283 -4.216062 0.086121 +v 6.528584 -4.294474 0.086121 +v 6.400001 -4.399999 0.086121 +v 6.294475 -4.528582 0.086121 +v 6.216063 -4.675282 0.086121 +v 6.167776 -4.834459 0.086121 +v 6.151472 -4.999999 0.086121 +v 6.167776 -5.165539 0.086121 +v 6.216062 -5.324717 0.086121 +v 6.294474 -5.471416 0.086121 +v 6.400000 -5.599999 0.086121 +v 6.528583 -5.705525 0.086121 +v 6.675282 -5.783937 0.086121 +v 6.834460 -5.832224 0.086121 +v 7.000000 -5.848528 0.086121 +v 7.165539 -5.832224 0.086121 +v 7.324718 -5.783938 0.086121 +v 7.471417 -5.705525 0.086121 +v 7.600000 -5.600000 0.086121 +v 7.705525 -5.471417 0.086121 +v 7.783938 -5.324718 0.086121 +v 7.832224 -5.165540 0.086121 +v 7.848528 -5.000000 0.086121 +v 7.832224 -4.834460 0.086121 +v 7.783938 -4.675282 0.086121 +v 7.705525 -4.528583 0.086121 +v 7.600000 -4.400000 0.043061 +v 7.705525 -4.528583 0.043061 +v 7.783938 -4.675282 0.043061 +v 7.832224 -4.834460 0.043061 +v 7.848528 -5.000000 0.043061 +v 7.832224 -5.165540 0.043061 +v 7.783938 -5.324718 0.043061 +v 7.705525 -5.471417 0.043061 +v 7.600000 -5.600000 0.043061 +v 7.471417 -5.705525 0.043061 +v 7.324718 -5.783938 0.043061 +v 7.165539 -5.832224 0.043061 +v 7.000000 -5.848528 0.043061 +v 6.834460 -5.832224 0.043061 +v 6.675282 -5.783937 0.043061 +v 6.528583 -5.705525 0.043061 +v 6.400000 -5.599999 0.043061 +v 6.294474 -5.471416 0.043061 +v 6.216062 -5.324717 0.043061 +v 6.167776 -5.165539 0.043061 +v 6.151472 -4.999999 0.043061 +v 6.167776 -4.834459 0.043061 +v 6.216063 -4.675282 0.043061 +v 6.294475 -4.528582 0.043061 +v 6.400001 -4.399999 0.043061 +v 6.528584 -4.294474 0.043061 +v 6.675283 -4.216062 0.043061 +v 6.834462 -4.167776 0.043061 +v 7.000001 -4.151472 0.043061 +v 7.165541 -4.167777 0.043061 +v 7.324719 -4.216063 0.043061 +v 7.471418 -4.294476 0.043061 +usemtl Material +s 1 +f 64 1123 1124 33 +f 31 1185 1186 32 +f 30 1184 1185 31 +f 30 29 1183 1184 +f 28 1182 1183 29 +f 27 1181 1182 28 +f 26 1180 1181 27 +f 26 25 1179 1180 +f 24 1178 1179 25 +f 24 23 1177 1178 +f 22 1176 1177 23 +f 21 1175 1176 22 +f 20 1174 1175 21 +f 20 19 1173 1174 +f 18 1172 1173 19 +f 18 17 1171 1172 +f 16 1170 1171 17 +f 16 15 1169 1170 +f 14 1168 1169 15 +f 14 13 1167 1168 +f 12 1166 1167 13 +f 11 1165 1166 12 +f 10 1164 1165 11 +f 10 9 1163 1164 +f 9 8 1162 1163 +f 7 1161 1162 8 +f 7 6 1160 1161 +f 5 1159 1160 6 +f 5 4 1158 1159 +f 3 1157 1158 4 +f 3 2 1156 1157 +f 2 1 1155 1156 +f 63 64 65 66 +f 62 63 66 67 +f 62 67 68 61 +f 60 61 68 69 +f 60 69 70 59 +f 58 59 70 71 +f 58 71 72 57 +f 56 57 72 73 +f 55 56 73 74 +f 55 74 75 54 +f 54 75 76 53 +f 53 76 77 52 +f 51 52 77 78 +f 51 78 79 50 +f 49 50 79 80 +f 49 80 81 48 +f 47 48 81 82 +f 47 82 83 46 +f 45 46 83 84 +f 45 84 85 44 +f 44 85 86 43 +f 43 86 87 42 +f 41 42 87 88 +f 41 88 89 40 +f 39 40 89 90 +f 39 90 91 38 +f 38 91 92 37 +f 37 92 93 36 +f 35 36 93 94 +f 35 94 95 34 +f 34 95 96 33 +f 33 96 65 64 +f 96 97 128 65 +f 95 98 97 96 +f 94 99 98 95 +f 94 93 100 99 +f 92 101 100 93 +f 91 102 101 92 +f 90 103 102 91 +f 90 89 104 103 +f 88 105 104 89 +f 88 87 106 105 +f 86 107 106 87 +f 85 108 107 86 +f 84 109 108 85 +f 84 83 110 109 +f 82 111 110 83 +f 82 81 112 111 +f 80 113 112 81 +f 80 79 114 113 +f 78 115 114 79 +f 78 77 116 115 +f 76 117 116 77 +f 75 118 117 76 +f 74 119 118 75 +f 74 73 120 119 +f 73 72 121 120 +f 71 122 121 72 +f 71 70 123 122 +f 69 124 123 70 +f 69 68 125 124 +f 67 126 125 68 +f 67 66 127 126 +f 66 65 128 127 +f 127 128 129 130 +f 126 127 130 131 +f 126 131 132 125 +f 124 125 132 133 +f 124 133 134 123 +f 122 123 134 135 +f 122 135 136 121 +f 120 121 136 137 +f 119 120 137 138 +f 119 138 139 118 +f 118 139 140 117 +f 117 140 141 116 +f 115 116 141 142 +f 115 142 143 114 +f 113 114 143 144 +f 113 144 145 112 +f 111 112 145 146 +f 111 146 147 110 +f 109 110 147 148 +f 109 148 149 108 +f 108 149 150 107 +f 107 150 151 106 +f 105 106 151 152 +f 105 152 153 104 +f 103 104 153 154 +f 103 154 155 102 +f 102 155 156 101 +f 101 156 157 100 +f 99 100 157 158 +f 99 158 159 98 +f 98 159 160 97 +f 97 160 129 128 +f 160 161 192 129 +f 159 162 161 160 +f 158 163 162 159 +f 158 157 164 163 +f 156 165 164 157 +f 155 166 165 156 +f 154 167 166 155 +f 154 153 168 167 +f 152 169 168 153 +f 152 151 170 169 +f 150 171 170 151 +f 149 172 171 150 +f 148 173 172 149 +f 148 147 174 173 +f 146 175 174 147 +f 146 145 176 175 +f 144 177 176 145 +f 144 143 178 177 +f 142 179 178 143 +f 142 141 180 179 +f 140 181 180 141 +f 139 182 181 140 +f 138 183 182 139 +f 138 137 184 183 +f 137 136 185 184 +f 135 186 185 136 +f 135 134 187 186 +f 133 188 187 134 +f 133 132 189 188 +f 131 190 189 132 +f 131 130 191 190 +f 130 129 192 191 +f 191 192 193 194 +f 190 191 194 195 +f 190 195 196 189 +f 188 189 196 197 +f 188 197 198 187 +f 186 187 198 199 +f 186 199 200 185 +f 184 185 200 201 +f 183 184 201 202 +f 183 202 203 182 +f 182 203 204 181 +f 181 204 205 180 +f 179 180 205 206 +f 179 206 207 178 +f 177 178 207 208 +f 177 208 209 176 +f 175 176 209 210 +f 175 210 211 174 +f 173 174 211 212 +f 173 212 213 172 +f 172 213 214 171 +f 171 214 215 170 +f 169 170 215 216 +f 169 216 217 168 +f 167 168 217 218 +f 167 218 219 166 +f 166 219 220 165 +f 165 220 221 164 +f 163 164 221 222 +f 163 222 223 162 +f 162 223 224 161 +f 161 224 193 192 +f 224 1059 1060 193 +f 223 1061 1059 224 +f 222 1062 1061 223 +f 222 221 1063 1062 +f 220 1064 1063 221 +f 219 1065 1064 220 +f 218 1066 1065 219 +f 218 217 1067 1066 +f 216 1068 1067 217 +f 216 215 1069 1068 +f 214 1070 1069 215 +f 213 1071 1070 214 +f 212 1072 1071 213 +f 212 211 1073 1072 +f 210 1074 1073 211 +f 210 209 1075 1074 +f 208 1076 1075 209 +f 208 207 1077 1076 +f 206 1078 1077 207 +f 206 205 1079 1078 +f 204 1080 1079 205 +f 203 1081 1080 204 +f 202 1082 1081 203 +f 202 201 1083 1082 +f 201 200 1084 1083 +f 199 1085 1084 200 +f 199 198 1086 1085 +f 197 1087 1086 198 +f 197 196 1088 1087 +f 195 1089 1088 196 +f 195 194 1090 1089 +f 194 193 1060 1090 +f 32 1 225 +f 31 32 225 +f 30 31 225 +f 30 225 29 +f 28 29 225 +f 27 28 225 +f 26 27 225 +f 26 225 25 +f 24 25 225 +f 24 225 23 +f 22 23 225 +f 21 22 225 +f 20 21 225 +f 20 225 19 +f 18 19 225 +f 18 225 17 +f 16 17 225 +f 16 225 15 +f 14 15 225 +f 14 225 13 +f 12 13 225 +f 11 12 225 +f 10 11 225 +f 10 225 9 +f 9 225 8 +f 7 8 225 +f 7 225 6 +f 5 6 225 +f 5 225 4 +f 3 4 225 +f 3 225 2 +f 225 1 2 +f 1058 226 227 1057 +f 1057 227 228 1056 +f 1056 228 229 1055 +f 1055 229 230 1054 +f 1054 230 231 1053 +f 1053 231 232 1052 +f 1052 232 233 1051 +f 1051 233 234 1050 +f 1050 234 235 1049 +f 1049 235 236 1048 +f 1048 236 237 1047 +f 1047 237 238 1046 +f 1046 238 239 1045 +f 1045 239 240 1044 +f 1044 240 241 1043 +f 1043 241 242 1042 +f 1042 242 243 1041 +f 1041 243 244 1040 +f 1040 244 245 1039 +f 1039 245 246 1038 +f 1038 246 247 1037 +f 1037 247 248 1036 +f 1036 248 249 1035 +f 1035 249 250 1034 +f 1034 250 251 1033 +f 1033 251 720 +f 251 252 720 +f 250 253 252 251 +f 249 254 253 250 +f 248 255 254 249 +f 247 256 255 248 +f 246 257 256 247 +f 245 258 257 246 +f 244 259 258 245 +f 243 260 259 244 +f 242 261 260 243 +f 241 262 261 242 +f 240 263 262 241 +f 239 264 263 240 +f 238 265 264 239 +f 237 266 265 238 +f 236 267 266 237 +f 235 268 267 236 +f 234 269 268 235 +f 233 270 269 234 +f 232 271 270 233 +f 231 272 271 232 +f 230 273 272 231 +f 229 274 273 230 +f 228 275 274 229 +f 227 276 275 228 +f 226 277 276 227 +f 277 278 279 276 +f 276 279 280 275 +f 275 280 281 274 +f 274 281 282 273 +f 273 282 283 272 +f 272 283 284 271 +f 271 284 285 270 +f 270 285 286 269 +f 269 286 287 268 +f 268 287 288 267 +f 267 288 289 266 +f 266 289 290 265 +f 265 290 291 264 +f 264 291 292 263 +f 263 292 293 262 +f 262 293 294 261 +f 261 294 295 260 +f 260 295 296 259 +f 259 296 297 258 +f 258 297 298 257 +f 257 298 299 256 +f 256 299 300 255 +f 255 300 301 254 +f 254 301 302 253 +f 253 302 303 252 +f 252 303 720 +f 303 304 720 +f 302 305 304 303 +f 301 306 305 302 +f 300 307 306 301 +f 299 308 307 300 +f 298 309 308 299 +f 297 310 309 298 +f 296 311 310 297 +f 295 312 311 296 +f 294 313 312 295 +f 293 314 313 294 +f 292 315 314 293 +f 291 316 315 292 +f 290 317 316 291 +f 289 318 317 290 +f 288 319 318 289 +f 287 320 319 288 +f 286 321 320 287 +f 285 322 321 286 +f 284 323 322 285 +f 283 324 323 284 +f 282 325 324 283 +f 281 326 325 282 +f 280 327 326 281 +f 279 328 327 280 +f 278 329 328 279 +f 329 330 331 328 +f 328 331 332 327 +f 327 332 333 326 +f 326 333 334 325 +f 325 334 335 324 +f 324 335 336 323 +f 323 336 337 322 +f 322 337 338 321 +f 321 338 339 320 +f 320 339 340 319 +f 319 340 341 318 +f 318 341 342 317 +f 317 342 343 316 +f 316 343 344 315 +f 315 344 345 314 +f 314 345 346 313 +f 313 346 347 312 +f 312 347 348 311 +f 311 348 349 310 +f 310 349 350 309 +f 309 350 351 308 +f 308 351 352 307 +f 307 352 353 306 +f 306 353 354 305 +f 305 354 355 304 +f 304 355 720 +f 355 356 720 +f 354 357 356 355 +f 353 358 357 354 +f 352 359 358 353 +f 351 360 359 352 +f 350 361 360 351 +f 349 362 361 350 +f 348 363 362 349 +f 347 364 363 348 +f 346 365 364 347 +f 345 366 365 346 +f 344 367 366 345 +f 343 368 367 344 +f 342 369 368 343 +f 341 370 369 342 +f 340 371 370 341 +f 339 372 371 340 +f 338 373 372 339 +f 337 374 373 338 +f 336 375 374 337 +f 335 376 375 336 +f 334 377 376 335 +f 333 378 377 334 +f 332 379 378 333 +f 331 380 379 332 +f 330 381 380 331 +f 381 382 383 380 +f 380 383 384 379 +f 379 384 385 378 +f 378 385 386 377 +f 377 386 387 376 +f 376 387 388 375 +f 375 388 389 374 +f 374 389 390 373 +f 373 390 391 372 +f 372 391 392 371 +f 371 392 393 370 +f 370 393 394 369 +f 369 394 395 368 +f 368 395 396 367 +f 367 396 397 366 +f 366 397 398 365 +f 365 398 399 364 +f 364 399 400 363 +f 363 400 401 362 +f 362 401 402 361 +f 361 402 403 360 +f 360 403 404 359 +f 359 404 405 358 +f 358 405 406 357 +f 357 406 407 356 +f 356 407 720 +f 407 408 720 +f 406 409 408 407 +f 405 410 409 406 +f 404 411 410 405 +f 403 412 411 404 +f 402 413 412 403 +f 401 414 413 402 +f 400 415 414 401 +f 399 416 415 400 +f 398 417 416 399 +f 397 418 417 398 +f 396 419 418 397 +f 395 420 419 396 +f 394 421 420 395 +f 393 422 421 394 +f 392 423 422 393 +f 391 424 423 392 +f 390 425 424 391 +f 389 426 425 390 +f 388 427 426 389 +f 387 428 427 388 +f 386 429 428 387 +f 385 430 429 386 +f 384 431 430 385 +f 383 432 431 384 +f 382 433 432 383 +f 433 434 435 432 +f 432 435 436 431 +f 431 436 437 430 +f 430 437 438 429 +f 429 438 439 428 +f 428 439 440 427 +f 427 440 441 426 +f 426 441 442 425 +f 425 442 443 424 +f 424 443 444 423 +f 423 444 445 422 +f 422 445 446 421 +f 421 446 447 420 +f 420 447 448 419 +f 419 448 449 418 +f 418 449 450 417 +f 417 450 451 416 +f 416 451 452 415 +f 415 452 453 414 +f 414 453 454 413 +f 413 454 455 412 +f 412 455 456 411 +f 411 456 457 410 +f 410 457 458 409 +f 409 458 459 408 +f 408 459 720 +f 459 460 720 +f 458 461 460 459 +f 457 462 461 458 +f 456 463 462 457 +f 455 464 463 456 +f 454 465 464 455 +f 453 466 465 454 +f 452 467 466 453 +f 451 468 467 452 +f 450 469 468 451 +f 449 470 469 450 +f 448 471 470 449 +f 447 472 471 448 +f 446 473 472 447 +f 445 474 473 446 +f 444 475 474 445 +f 443 476 475 444 +f 442 477 476 443 +f 441 478 477 442 +f 440 479 478 441 +f 439 480 479 440 +f 438 481 480 439 +f 437 482 481 438 +f 436 483 482 437 +f 435 484 483 436 +f 434 485 484 435 +f 485 486 487 484 +f 484 487 488 483 +f 483 488 489 482 +f 482 489 490 481 +f 481 490 491 480 +f 480 491 492 479 +f 479 492 493 478 +f 478 493 494 477 +f 477 494 495 476 +f 476 495 496 475 +f 475 496 497 474 +f 474 497 498 473 +f 473 498 499 472 +f 472 499 500 471 +f 471 500 501 470 +f 470 501 502 469 +f 469 502 503 468 +f 468 503 504 467 +f 467 504 505 466 +f 466 505 506 465 +f 465 506 507 464 +f 464 507 508 463 +f 463 508 509 462 +f 462 509 510 461 +f 461 510 511 460 +f 460 511 720 +f 511 512 720 +f 510 513 512 511 +f 509 514 513 510 +f 508 515 514 509 +f 507 516 515 508 +f 506 517 516 507 +f 505 518 517 506 +f 504 519 518 505 +f 503 520 519 504 +f 502 521 520 503 +f 501 522 521 502 +f 500 523 522 501 +f 499 524 523 500 +f 498 525 524 499 +f 497 526 525 498 +f 496 527 526 497 +f 495 528 527 496 +f 494 529 528 495 +f 493 530 529 494 +f 492 531 530 493 +f 491 532 531 492 +f 490 533 532 491 +f 489 534 533 490 +f 488 535 534 489 +f 487 536 535 488 +f 486 537 536 487 +f 537 538 539 536 +f 536 539 540 535 +f 535 540 541 534 +f 534 541 542 533 +f 533 542 543 532 +f 532 543 544 531 +f 531 544 545 530 +f 530 545 546 529 +f 529 546 547 528 +f 528 547 548 527 +f 527 548 549 526 +f 526 549 550 525 +f 525 550 551 524 +f 524 551 552 523 +f 523 552 553 522 +f 522 553 554 521 +f 521 554 555 520 +f 520 555 556 519 +f 519 556 557 518 +f 518 557 558 517 +f 517 558 559 516 +f 516 559 560 515 +f 515 560 561 514 +f 514 561 562 513 +f 513 562 563 512 +f 512 563 720 +f 563 564 720 +f 562 565 564 563 +f 561 566 565 562 +f 560 567 566 561 +f 559 568 567 560 +f 558 569 568 559 +f 557 570 569 558 +f 556 571 570 557 +f 555 572 571 556 +f 554 573 572 555 +f 553 574 573 554 +f 552 575 574 553 +f 551 576 575 552 +f 550 577 576 551 +f 549 578 577 550 +f 548 579 578 549 +f 547 580 579 548 +f 546 581 580 547 +f 545 582 581 546 +f 544 583 582 545 +f 543 584 583 544 +f 542 585 584 543 +f 541 586 585 542 +f 540 587 586 541 +f 539 588 587 540 +f 538 589 588 539 +f 589 590 591 588 +f 588 591 592 587 +f 587 592 593 586 +f 586 593 594 585 +f 585 594 595 584 +f 584 595 596 583 +f 583 596 597 582 +f 582 597 598 581 +f 581 598 599 580 +f 580 599 600 579 +f 579 600 601 578 +f 578 601 602 577 +f 577 602 603 576 +f 576 603 604 575 +f 575 604 605 574 +f 574 605 606 573 +f 573 606 607 572 +f 572 607 608 571 +f 571 608 609 570 +f 570 609 610 569 +f 569 610 611 568 +f 568 611 612 567 +f 567 612 613 566 +f 566 613 614 565 +f 565 614 615 564 +f 564 615 720 +f 615 616 720 +f 614 617 616 615 +f 613 618 617 614 +f 612 619 618 613 +f 611 620 619 612 +f 610 621 620 611 +f 609 622 621 610 +f 608 623 622 609 +f 607 624 623 608 +f 606 625 624 607 +f 605 626 625 606 +f 604 627 626 605 +f 603 628 627 604 +f 602 629 628 603 +f 601 630 629 602 +f 600 631 630 601 +f 599 632 631 600 +f 598 633 632 599 +f 597 634 633 598 +f 596 635 634 597 +f 595 636 635 596 +f 594 637 636 595 +f 593 638 637 594 +f 592 639 638 593 +f 591 640 639 592 +f 590 641 640 591 +f 641 642 643 640 +f 640 643 644 639 +f 639 644 645 638 +f 638 645 646 637 +f 637 646 647 636 +f 636 647 648 635 +f 635 648 649 634 +f 634 649 650 633 +f 633 650 651 632 +f 632 651 652 631 +f 631 652 653 630 +f 630 653 654 629 +f 629 654 655 628 +f 628 655 656 627 +f 627 656 657 626 +f 626 657 658 625 +f 625 658 659 624 +f 624 659 660 623 +f 623 660 661 622 +f 622 661 662 621 +f 621 662 663 620 +f 620 663 664 619 +f 619 664 665 618 +f 618 665 666 617 +f 617 666 667 616 +f 616 667 720 +f 667 668 720 +f 666 669 668 667 +f 665 670 669 666 +f 664 671 670 665 +f 663 672 671 664 +f 662 673 672 663 +f 661 674 673 662 +f 660 675 674 661 +f 659 676 675 660 +f 658 677 676 659 +f 657 678 677 658 +f 656 679 678 657 +f 655 680 679 656 +f 654 681 680 655 +f 653 682 681 654 +f 652 683 682 653 +f 651 684 683 652 +f 650 685 684 651 +f 649 686 685 650 +f 648 687 686 649 +f 647 688 687 648 +f 646 689 688 647 +f 645 690 689 646 +f 644 691 690 645 +f 643 692 691 644 +f 642 693 692 643 +f 693 694 695 692 +f 692 695 696 691 +f 691 696 697 690 +f 690 697 698 689 +f 689 698 699 688 +f 688 699 700 687 +f 687 700 701 686 +f 686 701 702 685 +f 685 702 703 684 +f 684 703 704 683 +f 683 704 705 682 +f 682 705 706 681 +f 681 706 707 680 +f 680 707 708 679 +f 679 708 709 678 +f 678 709 710 677 +f 677 710 711 676 +f 676 711 712 675 +f 675 712 713 674 +f 674 713 714 673 +f 673 714 715 672 +f 672 715 716 671 +f 671 716 717 670 +f 670 717 718 669 +f 669 718 719 668 +f 668 719 720 +f 719 721 720 +f 718 722 721 719 +f 717 723 722 718 +f 716 724 723 717 +f 715 725 724 716 +f 714 726 725 715 +f 713 727 726 714 +f 712 728 727 713 +f 711 729 728 712 +f 710 730 729 711 +f 709 731 730 710 +f 708 732 731 709 +f 707 733 732 708 +f 706 734 733 707 +f 705 735 734 706 +f 704 736 735 705 +f 703 737 736 704 +f 702 738 737 703 +f 701 739 738 702 +f 700 740 739 701 +f 699 741 740 700 +f 698 742 741 699 +f 697 743 742 698 +f 696 744 743 697 +f 695 745 744 696 +f 694 746 745 695 +f 746 747 748 745 +f 745 748 749 744 +f 744 749 750 743 +f 743 750 751 742 +f 742 751 752 741 +f 741 752 753 740 +f 740 753 754 739 +f 739 754 755 738 +f 738 755 756 737 +f 737 756 757 736 +f 736 757 758 735 +f 735 758 759 734 +f 734 759 760 733 +f 733 760 761 732 +f 732 761 762 731 +f 731 762 763 730 +f 730 763 764 729 +f 729 764 765 728 +f 728 765 766 727 +f 727 766 767 726 +f 726 767 768 725 +f 725 768 769 724 +f 724 769 770 723 +f 723 770 771 722 +f 722 771 772 721 +f 721 772 720 +f 772 773 720 +f 771 774 773 772 +f 770 775 774 771 +f 769 776 775 770 +f 768 777 776 769 +f 767 778 777 768 +f 766 779 778 767 +f 765 780 779 766 +f 764 781 780 765 +f 763 782 781 764 +f 762 783 782 763 +f 761 784 783 762 +f 760 785 784 761 +f 759 786 785 760 +f 758 787 786 759 +f 757 788 787 758 +f 756 789 788 757 +f 755 790 789 756 +f 754 791 790 755 +f 753 792 791 754 +f 752 793 792 753 +f 751 794 793 752 +f 750 795 794 751 +f 749 796 795 750 +f 748 797 796 749 +f 747 798 797 748 +f 798 799 800 797 +f 797 800 801 796 +f 796 801 802 795 +f 795 802 803 794 +f 794 803 804 793 +f 793 804 805 792 +f 792 805 806 791 +f 791 806 807 790 +f 790 807 808 789 +f 789 808 809 788 +f 788 809 810 787 +f 787 810 811 786 +f 786 811 812 785 +f 785 812 813 784 +f 784 813 814 783 +f 783 814 815 782 +f 782 815 816 781 +f 781 816 817 780 +f 780 817 818 779 +f 779 818 819 778 +f 778 819 820 777 +f 777 820 821 776 +f 776 821 822 775 +f 775 822 823 774 +f 774 823 824 773 +f 773 824 720 +f 824 825 720 +f 823 826 825 824 +f 822 827 826 823 +f 821 828 827 822 +f 820 829 828 821 +f 819 830 829 820 +f 818 831 830 819 +f 817 832 831 818 +f 816 833 832 817 +f 815 834 833 816 +f 814 835 834 815 +f 813 836 835 814 +f 812 837 836 813 +f 811 838 837 812 +f 810 839 838 811 +f 809 840 839 810 +f 808 841 840 809 +f 807 842 841 808 +f 806 843 842 807 +f 805 844 843 806 +f 804 845 844 805 +f 803 846 845 804 +f 802 847 846 803 +f 801 848 847 802 +f 800 849 848 801 +f 799 850 849 800 +f 850 851 852 849 +f 849 852 853 848 +f 848 853 854 847 +f 847 854 855 846 +f 846 855 856 845 +f 845 856 857 844 +f 844 857 858 843 +f 843 858 859 842 +f 842 859 860 841 +f 841 860 861 840 +f 840 861 862 839 +f 839 862 863 838 +f 838 863 864 837 +f 837 864 865 836 +f 836 865 866 835 +f 835 866 867 834 +f 834 867 868 833 +f 833 868 869 832 +f 832 869 870 831 +f 831 870 871 830 +f 830 871 872 829 +f 829 872 873 828 +f 828 873 874 827 +f 827 874 875 826 +f 826 875 876 825 +f 825 876 720 +f 876 877 720 +f 875 878 877 876 +f 874 879 878 875 +f 873 880 879 874 +f 872 881 880 873 +f 871 882 881 872 +f 870 883 882 871 +f 869 884 883 870 +f 868 885 884 869 +f 867 886 885 868 +f 866 887 886 867 +f 865 888 887 866 +f 864 889 888 865 +f 863 890 889 864 +f 862 891 890 863 +f 861 892 891 862 +f 860 893 892 861 +f 859 894 893 860 +f 858 895 894 859 +f 857 896 895 858 +f 856 897 896 857 +f 855 898 897 856 +f 854 899 898 855 +f 853 900 899 854 +f 852 901 900 853 +f 851 902 901 852 +f 902 903 904 901 +f 901 904 905 900 +f 900 905 906 899 +f 899 906 907 898 +f 898 907 908 897 +f 897 908 909 896 +f 896 909 910 895 +f 895 910 911 894 +f 894 911 912 893 +f 893 912 913 892 +f 892 913 914 891 +f 891 914 915 890 +f 890 915 916 889 +f 889 916 917 888 +f 888 917 918 887 +f 887 918 919 886 +f 886 919 920 885 +f 885 920 921 884 +f 884 921 922 883 +f 883 922 923 882 +f 882 923 924 881 +f 881 924 925 880 +f 880 925 926 879 +f 879 926 927 878 +f 878 927 928 877 +f 877 928 720 +f 928 929 720 +f 927 930 929 928 +f 926 931 930 927 +f 925 932 931 926 +f 924 933 932 925 +f 923 934 933 924 +f 922 935 934 923 +f 921 936 935 922 +f 920 937 936 921 +f 919 938 937 920 +f 918 939 938 919 +f 917 940 939 918 +f 916 941 940 917 +f 915 942 941 916 +f 914 943 942 915 +f 913 944 943 914 +f 912 945 944 913 +f 911 946 945 912 +f 910 947 946 911 +f 909 948 947 910 +f 908 949 948 909 +f 907 950 949 908 +f 906 951 950 907 +f 905 952 951 906 +f 904 953 952 905 +f 903 954 953 904 +f 954 955 956 953 +f 953 956 957 952 +f 952 957 958 951 +f 951 958 959 950 +f 950 959 960 949 +f 949 960 961 948 +f 948 961 962 947 +f 947 962 963 946 +f 946 963 964 945 +f 945 964 965 944 +f 944 965 966 943 +f 943 966 967 942 +f 942 967 968 941 +f 941 968 969 940 +f 940 969 970 939 +f 939 970 971 938 +f 938 971 972 937 +f 937 972 973 936 +f 936 973 974 935 +f 935 974 975 934 +f 934 975 976 933 +f 933 976 977 932 +f 932 977 978 931 +f 931 978 979 930 +f 930 979 980 929 +f 929 980 720 +f 980 981 720 +f 979 982 981 980 +f 978 983 982 979 +f 977 984 983 978 +f 976 985 984 977 +f 975 986 985 976 +f 974 987 986 975 +f 973 988 987 974 +f 972 989 988 973 +f 971 990 989 972 +f 970 991 990 971 +f 969 992 991 970 +f 968 993 992 969 +f 967 994 993 968 +f 966 995 994 967 +f 965 996 995 966 +f 964 997 996 965 +f 963 998 997 964 +f 962 999 998 963 +f 961 1000 999 962 +f 960 1001 1000 961 +f 959 1002 1001 960 +f 958 1003 1002 959 +f 957 1004 1003 958 +f 956 1005 1004 957 +f 955 1006 1005 956 +f 1006 1007 1008 1005 +f 1005 1008 1009 1004 +f 1004 1009 1010 1003 +f 1003 1010 1011 1002 +f 1002 1011 1012 1001 +f 1001 1012 1013 1000 +f 1000 1013 1014 999 +f 999 1014 1015 998 +f 998 1015 1016 997 +f 997 1016 1017 996 +f 996 1017 1018 995 +f 995 1018 1019 994 +f 994 1019 1020 993 +f 993 1020 1021 992 +f 992 1021 1022 991 +f 991 1022 1023 990 +f 990 1023 1024 989 +f 989 1024 1025 988 +f 988 1025 1026 987 +f 987 1026 1027 986 +f 986 1027 1028 985 +f 985 1028 1029 984 +f 984 1029 1030 983 +f 983 1030 1031 982 +f 982 1031 1032 981 +f 981 1032 720 +f 1032 1033 720 +f 1031 1034 1033 1032 +f 1030 1035 1034 1031 +f 1029 1036 1035 1030 +f 1028 1037 1036 1029 +f 1027 1038 1037 1028 +f 1026 1039 1038 1027 +f 1025 1040 1039 1026 +f 1024 1041 1040 1025 +f 1023 1042 1041 1024 +f 1022 1043 1042 1023 +f 1021 1044 1043 1022 +f 1020 1045 1044 1021 +f 1019 1046 1045 1020 +f 1018 1047 1046 1019 +f 1017 1048 1047 1018 +f 1016 1049 1048 1017 +f 1015 1050 1049 1016 +f 1014 1051 1050 1015 +f 1013 1052 1051 1014 +f 1012 1053 1052 1013 +f 1011 1054 1053 1012 +f 1010 1055 1054 1011 +f 1009 1056 1055 1010 +f 1008 1057 1056 1009 +f 1007 1058 1057 1008 +f 1060 1091 1092 1090 +f 1090 1092 1093 1089 +f 1089 1093 1094 1088 +f 1088 1094 1095 1087 +f 1087 1095 1096 1086 +f 1086 1096 1097 1085 +f 1085 1097 1098 1084 +f 1084 1098 1099 1083 +f 1083 1099 1100 1082 +f 1082 1100 1101 1081 +f 1081 1101 1102 1080 +f 1080 1102 1103 1079 +f 1079 1103 1104 1078 +f 1078 1104 1105 1077 +f 1077 1105 1106 1076 +f 1076 1106 1107 1075 +f 1075 1107 1108 1074 +f 1074 1108 1109 1073 +f 1073 1109 1110 1072 +f 1072 1110 1111 1071 +f 1071 1111 1112 1070 +f 1070 1112 1113 1069 +f 1069 1113 1114 1068 +f 1068 1114 1115 1067 +f 1067 1115 1116 1066 +f 1066 1116 1117 1065 +f 1065 1117 1118 1064 +f 1064 1118 1119 1063 +f 1063 1119 1120 1062 +f 1062 1120 1121 1061 +f 1061 1121 1122 1059 +f 1059 1122 1091 1060 +f 1122 330 329 1091 +f 1121 381 330 1122 +f 1120 382 381 1121 +f 1119 433 382 1120 +f 1118 434 433 1119 +f 1117 485 434 1118 +f 1116 486 485 1117 +f 1115 537 486 1116 +f 1114 538 537 1115 +f 1113 589 538 1114 +f 1112 590 589 1113 +f 1111 641 590 1112 +f 1110 642 641 1111 +f 1109 693 642 1110 +f 1108 694 693 1109 +f 1107 746 694 1108 +f 1106 747 746 1107 +f 1105 798 747 1106 +f 1104 799 798 1105 +f 1103 850 799 1104 +f 1102 851 850 1103 +f 1101 902 851 1102 +f 1100 903 902 1101 +f 1099 954 903 1100 +f 1098 955 954 1099 +f 1097 1006 955 1098 +f 1096 1007 1006 1097 +f 1095 1058 1007 1096 +f 1094 226 1058 1095 +f 1093 277 226 1094 +f 1092 278 277 1093 +f 1091 329 278 1092 +f 1123 64 63 1154 +f 1154 63 62 1153 +f 1153 62 61 1152 +f 1152 61 60 1151 +f 1151 60 59 1150 +f 1150 59 58 1149 +f 1149 58 57 1148 +f 1148 57 56 1147 +f 1147 56 55 1146 +f 1146 55 54 1145 +f 1145 54 53 1144 +f 1144 53 52 1143 +f 1143 52 51 1142 +f 1142 51 50 1141 +f 1141 50 49 1140 +f 1140 49 48 1139 +f 1139 48 47 1138 +f 1138 47 46 1137 +f 1137 46 45 1136 +f 1136 45 44 1135 +f 1135 44 43 1134 +f 1134 43 42 1133 +f 1133 42 41 1132 +f 1132 41 40 1131 +f 1131 40 39 1130 +f 1130 39 38 1129 +f 1129 38 37 1128 +f 1128 37 36 1127 +f 1127 36 35 1126 +f 1126 35 34 1125 +f 1125 34 33 1124 +f 1123 1155 1186 1124 +f 1155 1 32 1186 +f 1155 1123 1154 1156 +f 1156 1154 1153 1157 +f 1157 1153 1152 1158 +f 1158 1152 1151 1159 +f 1159 1151 1150 1160 +f 1160 1150 1149 1161 +f 1161 1149 1148 1162 +f 1162 1148 1147 1163 +f 1163 1147 1146 1164 +f 1164 1146 1145 1165 +f 1165 1145 1144 1166 +f 1166 1144 1143 1167 +f 1167 1143 1142 1168 +f 1168 1142 1141 1169 +f 1169 1141 1140 1170 +f 1170 1140 1139 1171 +f 1171 1139 1138 1172 +f 1172 1138 1137 1173 +f 1173 1137 1136 1174 +f 1174 1136 1135 1175 +f 1175 1135 1134 1176 +f 1176 1134 1133 1177 +f 1177 1133 1132 1178 +f 1178 1132 1131 1179 +f 1179 1131 1130 1180 +f 1180 1130 1129 1181 +f 1181 1129 1128 1182 +f 1182 1128 1127 1183 +f 1183 1127 1126 1184 +f 1184 1126 1125 1185 +f 1185 1125 1124 1186 diff --git a/Graph3D/Chess3D/queen.obj b/Graph3D/Chess3D/queen.obj new file mode 100644 index 0000000..78acb99 --- /dev/null +++ b/Graph3D/Chess3D/queen.obj @@ -0,0 +1,2214 @@ +# Blender3D v245 OBJ File: chess2.blend +# www.blender3d.org +v -0.400000 -6.400000 0.000000 +v -0.294475 -6.528583 0.000000 +v -0.216062 -6.675282 0.000000 +v -0.167776 -6.834460 0.000000 +v -0.151472 -7.000000 0.000000 +v -0.167776 -7.165540 0.000000 +v -0.216062 -7.324718 0.000000 +v -0.294475 -7.471417 0.000000 +v -0.400000 -7.600000 0.000000 +v -0.528583 -7.705525 0.000000 +v -0.675282 -7.783938 0.000000 +v -0.834461 -7.832224 0.000000 +v -1.000000 -7.848528 0.000000 +v -1.165540 -7.832224 0.000000 +v -1.324718 -7.783937 0.000000 +v -1.471417 -7.705525 0.000000 +v -1.600000 -7.599999 0.000000 +v -1.705526 -7.471416 0.000000 +v -1.783938 -7.324717 0.000000 +v -1.832224 -7.165539 0.000000 +v -1.848528 -6.999999 0.000000 +v -1.832224 -6.834459 0.000000 +v -1.783937 -6.675282 0.000000 +v -1.705525 -6.528582 0.000000 +v -1.599999 -6.399999 0.000000 +v -1.471416 -6.294474 0.000000 +v -1.324717 -6.216062 0.000000 +v -1.165538 -6.167776 0.000000 +v -0.999999 -6.151472 0.000000 +v -0.834459 -6.167777 0.000000 +v -0.675281 -6.216063 0.000000 +v -0.528582 -6.294476 0.000000 +v -0.528582 -6.294476 0.100000 +v -0.675281 -6.216063 0.100000 +v -0.834459 -6.167777 0.100000 +v -0.999999 -6.151472 0.100000 +v -1.165538 -6.167776 0.100000 +v -1.324717 -6.216062 0.100000 +v -1.471416 -6.294474 0.100000 +v -1.599999 -6.399999 0.100000 +v -1.705525 -6.528582 0.100000 +v -1.783937 -6.675282 0.100000 +v -1.832224 -6.834459 0.100000 +v -1.848528 -6.999999 0.100000 +v -1.832224 -7.165539 0.100000 +v -1.783938 -7.324717 0.100000 +v -1.705526 -7.471416 0.100000 +v -1.600000 -7.599999 0.100000 +v -1.471417 -7.705525 0.100000 +v -1.324718 -7.783937 0.100000 +v -1.165540 -7.832224 0.100000 +v -1.000000 -7.848528 0.100000 +v -0.834461 -7.832224 0.100000 +v -0.675282 -7.783938 0.100000 +v -0.528583 -7.705525 0.100000 +v -0.400000 -7.600000 0.100000 +v -0.294475 -7.471417 0.100000 +v -0.216062 -7.324718 0.100000 +v -0.167776 -7.165540 0.100000 +v -0.151472 -7.000000 0.100000 +v -0.167776 -6.834460 0.100000 +v -0.216062 -6.675282 0.100000 +v -0.294475 -6.528583 0.100000 +v -0.400000 -6.400000 0.100000 +v -0.520000 -6.520000 0.200000 +v -0.435580 -6.622867 0.200000 +v -0.372850 -6.740226 0.200000 +v -0.334221 -6.867568 0.200000 +v -0.321177 -7.000000 0.200000 +v -0.334221 -7.132432 0.200000 +v -0.372850 -7.259774 0.200000 +v -0.435580 -7.377133 0.200000 +v -0.520000 -7.480000 0.200000 +v -0.622866 -7.564420 0.200000 +v -0.740226 -7.627151 0.200000 +v -0.867568 -7.665779 0.200000 +v -1.000000 -7.678823 0.200000 +v -1.132432 -7.665779 0.200000 +v -1.259774 -7.627150 0.200000 +v -1.377134 -7.564420 0.200000 +v -1.480000 -7.480000 0.200000 +v -1.564421 -7.377133 0.200000 +v -1.627151 -7.259774 0.200000 +v -1.665779 -7.132431 0.200000 +v -1.678823 -7.000000 0.200000 +v -1.665779 -6.867568 0.200000 +v -1.627150 -6.740225 0.200000 +v -1.564420 -6.622866 0.200000 +v -1.479999 -6.520000 0.200000 +v -1.377133 -6.435579 0.200000 +v -1.259773 -6.372849 0.200000 +v -1.132431 -6.334221 0.200000 +v -0.999999 -6.321177 0.200000 +v -0.867567 -6.334221 0.200000 +v -0.740225 -6.372850 0.200000 +v -0.622865 -6.435580 0.200000 +v -0.585152 -6.379138 0.300000 +v -0.714247 -6.310135 0.300000 +v -0.854324 -6.267643 0.300000 +v -0.999999 -6.253295 0.300000 +v -1.145674 -6.267642 0.300000 +v -1.285751 -6.310134 0.300000 +v -1.414846 -6.379137 0.300000 +v -1.527999 -6.471999 0.300000 +v -1.620862 -6.585152 0.300000 +v -1.689865 -6.714248 0.300000 +v -1.732357 -6.854324 0.300000 +v -1.746705 -6.999999 0.300000 +v -1.732357 -7.145674 0.300000 +v -1.689866 -7.285751 0.300000 +v -1.620863 -7.414846 0.300000 +v -1.528000 -7.528000 0.300000 +v -1.414847 -7.620862 0.300000 +v -1.285752 -7.689865 0.300000 +v -1.145675 -7.732357 0.300000 +v -1.000000 -7.746705 0.300000 +v -0.854325 -7.732357 0.300000 +v -0.714249 -7.689865 0.300000 +v -0.585153 -7.620862 0.300000 +v -0.472000 -7.528000 0.300000 +v -0.379138 -7.414847 0.300000 +v -0.310135 -7.285751 0.300000 +v -0.267643 -7.145675 0.300000 +v -0.253295 -7.000000 0.300000 +v -0.267643 -6.854325 0.300000 +v -0.310135 -6.714249 0.300000 +v -0.379138 -6.585153 0.300000 +v -0.472000 -6.472000 0.300000 +v -0.657856 -6.657856 0.400000 +v -0.597681 -6.731179 0.400000 +v -0.552967 -6.814833 0.400000 +v -0.525433 -6.905602 0.400000 +v -0.516135 -7.000000 0.400000 +v -0.525433 -7.094397 0.400000 +v -0.552967 -7.185167 0.400000 +v -0.597681 -7.268821 0.400000 +v -0.657856 -7.342144 0.400000 +v -0.731179 -7.402319 0.400000 +v -0.814833 -7.447033 0.400000 +v -0.905603 -7.474567 0.400000 +v -1.000000 -7.483865 0.400000 +v -1.094398 -7.474567 0.400000 +v -1.185167 -7.447033 0.400000 +v -1.268821 -7.402319 0.400000 +v -1.342144 -7.342144 0.400000 +v -1.402319 -7.268821 0.400000 +v -1.447033 -7.185167 0.400000 +v -1.474568 -7.094397 0.400000 +v -1.483865 -7.000000 0.400000 +v -1.474567 -6.905602 0.400000 +v -1.447032 -6.814833 0.400000 +v -1.402318 -6.731179 0.400000 +v -1.342144 -6.657856 0.400000 +v -1.268820 -6.597681 0.400000 +v -1.185166 -6.552967 0.400000 +v -1.094397 -6.525433 0.400000 +v -0.999999 -6.516135 0.400000 +v -0.905602 -6.525433 0.400000 +v -0.814832 -6.552968 0.400000 +v -0.731178 -6.597682 0.400000 +v -0.806448 -6.710331 1.400000 +v -0.866679 -6.678137 1.400000 +v -0.932033 -6.658311 1.400000 +v -0.999999 -6.651618 1.400000 +v -1.067966 -6.658311 1.400000 +v -1.133320 -6.678136 1.400000 +v -1.193551 -6.710330 1.400000 +v -1.246343 -6.753656 1.400000 +v -1.289669 -6.806448 1.400000 +v -1.321863 -6.866679 1.400000 +v -1.341689 -6.932034 1.400000 +v -1.348383 -7.000000 1.400000 +v -1.341689 -7.067966 1.400000 +v -1.321864 -7.133320 1.400000 +v -1.289670 -7.193551 1.400000 +v -1.246344 -7.246344 1.400000 +v -1.193551 -7.289670 1.400000 +v -1.133320 -7.321864 1.400000 +v -1.067966 -7.341689 1.400000 +v -1.000000 -7.348382 1.400000 +v -0.932034 -7.341689 1.400000 +v -0.866680 -7.321864 1.400000 +v -0.806449 -7.289670 1.400000 +v -0.753656 -7.246344 1.400000 +v -0.710330 -7.193551 1.400000 +v -0.678136 -7.133320 1.400000 +v -0.658311 -7.067966 1.400000 +v -0.651617 -7.000000 1.400000 +v -0.658311 -6.932034 1.400000 +v -0.678136 -6.866680 1.400000 +v -0.710330 -6.806449 1.400000 +v -0.753656 -6.753656 1.400000 +v -0.704388 -6.704388 1.400000 +v -0.652396 -6.767739 1.400000 +v -0.613764 -6.840016 1.400000 +v -0.589974 -6.918441 1.400000 +v -0.581941 -7.000000 1.400000 +v -0.589974 -7.081559 1.400000 +v -0.613764 -7.159984 1.400000 +v -0.652396 -7.232261 1.400000 +v -0.704388 -7.295612 1.400000 +v -0.767739 -7.347603 1.400000 +v -0.840016 -7.386236 1.400000 +v -0.918441 -7.410027 1.400000 +v -1.000000 -7.418059 1.400000 +v -1.081559 -7.410026 1.400000 +v -1.159984 -7.386236 1.400000 +v -1.232261 -7.347603 1.400000 +v -1.295613 -7.295612 1.400000 +v -1.347604 -7.232261 1.400000 +v -1.386236 -7.159984 1.400000 +v -1.410026 -7.081559 1.400000 +v -1.418059 -7.000000 1.400000 +v -1.410026 -6.918440 1.400000 +v -1.386236 -6.840015 1.400000 +v -1.347603 -6.767738 1.400000 +v -1.295612 -6.704387 1.400000 +v -1.232261 -6.652396 1.400000 +v -1.159984 -6.613763 1.400000 +v -1.081559 -6.589973 1.400000 +v -0.999999 -6.581941 1.400000 +v -0.918440 -6.589974 1.400000 +v -0.840015 -6.613764 1.400000 +v -0.767738 -6.652397 1.400000 +v -0.716124 -6.575152 1.500000 +v -0.804463 -6.527934 1.500000 +v -0.900316 -6.498857 1.500000 +v -0.999999 -6.489039 1.500000 +v -1.099683 -6.498857 1.500000 +v -1.195536 -6.527933 1.500000 +v -1.283874 -6.575151 1.500000 +v -1.361304 -6.638695 1.500000 +v -1.424848 -6.716125 1.500000 +v -1.472066 -6.804463 1.500000 +v -1.501143 -6.900316 1.500000 +v -1.510961 -7.000000 1.500000 +v -1.501143 -7.099683 1.500000 +v -1.472067 -7.195536 1.500000 +v -1.424849 -7.283875 1.500000 +v -1.361304 -7.361304 1.500000 +v -1.283875 -7.424849 1.500000 +v -1.195537 -7.472066 1.500000 +v -1.099684 -7.501143 1.500000 +v -1.000000 -7.510961 1.500000 +v -0.900317 -7.501143 1.500000 +v -0.804464 -7.472066 1.500000 +v -0.716125 -7.424849 1.500000 +v -0.638696 -7.361304 1.500000 +v -0.575151 -7.283875 1.500000 +v -0.527933 -7.195536 1.500000 +v -0.498857 -7.099684 1.500000 +v -0.489039 -7.000000 1.500000 +v -0.498857 -6.900316 1.500000 +v -0.527933 -6.804463 1.500000 +v -0.575151 -6.716125 1.500000 +v -0.638696 -6.638696 1.500000 +v -0.707344 -6.707344 1.600000 +v -0.655872 -6.770061 1.600000 +v -0.617626 -6.841616 1.600000 +v -0.594074 -6.919256 1.600000 +v -0.586121 -7.000000 1.600000 +v -0.594074 -7.080744 1.600000 +v -0.617626 -7.158384 1.600000 +v -0.655872 -7.229939 1.600000 +v -0.707344 -7.292656 1.600000 +v -0.770061 -7.344128 1.600000 +v -0.841616 -7.382374 1.600000 +v -0.919256 -7.405926 1.600000 +v -1.000000 -7.413878 1.600000 +v -1.080744 -7.405926 1.600000 +v -1.158385 -7.382374 1.600000 +v -1.229939 -7.344127 1.600000 +v -1.292657 -7.292656 1.600000 +v -1.344128 -7.229939 1.600000 +v -1.382374 -7.158384 1.600000 +v -1.405926 -7.080743 1.600000 +v -1.413879 -7.000000 1.600000 +v -1.405926 -6.919256 1.600000 +v -1.382374 -6.841615 1.600000 +v -1.344127 -6.770061 1.600000 +v -1.292656 -6.707343 1.600000 +v -1.229938 -6.655872 1.600000 +v -1.158384 -6.617626 1.600000 +v -1.080743 -6.594074 1.600000 +v -0.999999 -6.586122 1.600000 +v -0.919256 -6.594074 1.600000 +v -0.841615 -6.617626 1.600000 +v -0.770061 -6.655873 1.600000 +v -0.718963 -6.579400 2.300000 +v -0.806418 -6.532654 2.300000 +v -0.901312 -6.503868 2.300000 +v -0.999999 -6.494148 2.300000 +v -1.098686 -6.503868 2.300000 +v -1.193580 -6.532654 2.300000 +v -1.281036 -6.579400 2.300000 +v -1.357691 -6.642308 2.300000 +v -1.420600 -6.718964 2.300000 +v -1.467346 -6.806418 2.300000 +v -1.496132 -6.901313 2.300000 +v -1.505852 -7.000000 2.300000 +v -1.496132 -7.098686 2.300000 +v -1.467346 -7.193581 2.300000 +v -1.420600 -7.281036 2.300000 +v -1.357691 -7.357691 2.300000 +v -1.281036 -7.420600 2.300000 +v -1.193581 -7.467346 2.300000 +v -1.098687 -7.496132 2.300000 +v -1.000000 -7.505852 2.300000 +v -0.901313 -7.496132 2.300000 +v -0.806419 -7.467346 2.300000 +v -0.718964 -7.420600 2.300000 +v -0.642309 -7.357691 2.300000 +v -0.579400 -7.281036 2.300000 +v -0.532654 -7.193581 2.300000 +v -0.503868 -7.098687 2.300000 +v -0.494148 -7.000000 2.300000 +v -0.503868 -6.901313 2.300000 +v -0.532654 -6.806419 2.300000 +v -0.579400 -6.718964 2.300000 +v -0.642309 -6.642309 2.300000 +v -0.562822 -6.562822 2.400000 +v -0.485933 -6.656511 2.400000 +v -0.428799 -6.763401 2.400000 +v -0.393617 -6.879383 2.400000 +v -0.381737 -7.000000 2.400000 +v -0.393617 -7.120617 2.400000 +v -0.428799 -7.236599 2.400000 +v -0.485933 -7.343489 2.400000 +v -0.562822 -7.437178 2.400000 +v -0.656511 -7.514067 2.400000 +v -0.763401 -7.571200 2.400000 +v -0.879383 -7.606383 2.400000 +v -1.000000 -7.618263 2.400000 +v -1.120617 -7.606383 2.400000 +v -1.236599 -7.571200 2.400000 +v -1.343489 -7.514067 2.400000 +v -1.437178 -7.437178 2.400000 +v -1.514067 -7.343488 2.400000 +v -1.571201 -7.236598 2.400000 +v -1.606383 -7.120616 2.400000 +v -1.618263 -7.000000 2.400000 +v -1.606383 -6.879382 2.400000 +v -1.571200 -6.763400 2.400000 +v -1.514067 -6.656511 2.400000 +v -1.437178 -6.562821 2.400000 +v -1.343488 -6.485932 2.400000 +v -1.236598 -6.428799 2.400000 +v -1.120616 -6.393617 2.400000 +v -0.999999 -6.381737 2.400000 +v -0.879382 -6.393617 2.400000 +v -0.763400 -6.428800 2.400000 +v -0.656510 -6.485934 2.400000 +v -0.725208 -6.588747 2.400000 +v -0.810720 -6.543040 2.400000 +v -0.903505 -6.514894 2.400000 +v -0.999999 -6.505390 2.400000 +v -1.096493 -6.514893 2.400000 +v -1.189279 -6.543039 2.400000 +v -1.274790 -6.588746 2.400000 +v -1.349742 -6.650257 2.400000 +v -1.411253 -6.725209 2.400000 +v -1.456960 -6.810720 2.400000 +v -1.485107 -6.903506 2.400000 +v -1.494611 -7.000000 2.400000 +v -1.485107 -7.096493 2.400000 +v -1.456961 -7.189279 2.400000 +v -1.411254 -7.274791 2.400000 +v -1.349743 -7.349742 2.400000 +v -1.274791 -7.411253 2.400000 +v -1.189279 -7.456961 2.400000 +v -1.096494 -7.485106 2.400000 +v -1.000000 -7.494610 2.400000 +v -0.903506 -7.485106 2.400000 +v -0.810721 -7.456961 2.400000 +v -0.725209 -7.411253 2.400000 +v -0.650258 -7.349742 2.400000 +v -0.588746 -7.274791 2.400000 +v -0.543040 -7.189279 2.400000 +v -0.514893 -7.096494 2.400000 +v -0.505389 -7.000000 2.400000 +v -0.514893 -6.903506 2.400000 +v -0.543040 -6.810721 2.400000 +v -0.588746 -6.725209 2.400000 +v -0.650258 -6.650258 2.400000 +v -0.685232 -6.685232 2.200000 +v -0.629872 -6.752688 2.200000 +v -0.588736 -6.829648 2.200000 +v -0.563404 -6.913156 2.200000 +v -0.554851 -7.000000 2.200000 +v -0.563404 -7.086844 2.200000 +v -0.588736 -7.170351 2.200000 +v -0.629872 -7.247312 2.200000 +v -0.685232 -7.314768 2.200000 +v -0.752688 -7.370128 2.200000 +v -0.829649 -7.411264 2.200000 +v -0.913156 -7.436596 2.200000 +v -1.000000 -7.445149 2.200000 +v -1.086845 -7.436596 2.200000 +v -1.170352 -7.411264 2.200000 +v -1.247312 -7.370128 2.200000 +v -1.314768 -7.314768 2.200000 +v -1.370128 -7.247312 2.200000 +v -1.411265 -7.170351 2.200000 +v -1.436596 -7.086844 2.200000 +v -1.445149 -7.000000 2.200000 +v -1.436596 -6.913155 2.200000 +v -1.411264 -6.829648 2.200000 +v -1.370128 -6.752688 2.200000 +v -1.314768 -6.685231 2.200000 +v -1.247311 -6.629871 2.200000 +v -1.170351 -6.588735 2.200000 +v -1.086844 -6.563404 2.200000 +v -0.999999 -6.554851 2.200000 +v -0.913155 -6.563404 2.200000 +v -0.829648 -6.588736 2.200000 +v -0.752688 -6.629872 2.200000 +v -1.123376 -6.917562 2.350016 +v -1.137088 -6.943216 2.350016 +v -1.145532 -6.971052 2.350016 +v -1.148383 -7.000000 2.350016 +v -1.145532 -7.028948 2.350016 +v -1.137088 -7.056784 2.350016 +v -1.123376 -7.082437 2.350016 +v -1.104923 -7.104923 2.350016 +v -1.082437 -7.123376 2.350016 +v -1.056784 -7.137088 2.350016 +v -1.028948 -7.145532 2.350016 +v -1.000000 -7.148383 2.350016 +v -0.971052 -7.145532 2.350016 +v -0.943216 -7.137088 2.350016 +v -0.917563 -7.123376 2.350016 +v -0.971144 -7.000001 2.495095 +v -0.943394 -7.000001 2.486677 +v -0.854922 -6.971143 2.350015 +v -0.855621 -6.971282 2.364514 +v -0.857710 -6.971697 2.378873 +v -0.861169 -6.972385 2.392954 +v -0.865965 -6.973340 2.406622 +v -0.872053 -6.974550 2.419745 +v -0.879372 -6.976007 2.432196 +v -0.887854 -6.977694 2.443856 +v -0.897415 -6.979595 2.454611 +v -0.907964 -6.981694 2.464360 +v -0.919400 -6.983968 2.473007 +v -0.931612 -6.986397 2.480470 +v -0.944482 -6.988957 2.486677 +v -0.957887 -6.991624 2.491567 +v -0.971698 -6.994371 2.495095 +v -0.985781 -6.997172 2.497225 +v -0.986607 -6.994452 2.497225 +v -0.973340 -6.988957 2.495095 +v -0.960331 -6.983569 2.491567 +v -0.947703 -6.978338 2.486677 +v -0.935580 -6.973317 2.480470 +v -0.924076 -6.968552 2.473007 +v -0.913304 -6.964090 2.464360 +v -0.903367 -6.959974 2.454611 +v -0.894360 -6.956243 2.443856 +v -0.886371 -6.952934 2.432196 +v -0.879476 -6.950078 2.419745 +v -0.873742 -6.947703 2.406622 +v -0.869224 -6.945831 2.392954 +v -0.865965 -6.944481 2.378873 +v -0.863998 -6.943666 2.364514 +v -0.863340 -6.943394 2.350015 +v -0.877009 -6.917820 2.350015 +v -0.877601 -6.918216 2.364514 +v -0.879372 -6.919399 2.378873 +v -0.882305 -6.921359 2.392954 +v -0.886371 -6.924076 2.406622 +v -0.891532 -6.927524 2.419745 +v -0.897737 -6.931670 2.432196 +v -0.904927 -6.936474 2.443856 +v -0.913033 -6.941890 2.454611 +v -0.921976 -6.947866 2.464360 +v -0.931671 -6.954344 2.473007 +v -0.942023 -6.961261 2.480470 +v -0.952935 -6.968552 2.486677 +v -0.964299 -6.976145 2.491567 +v -0.976007 -6.983968 2.495095 +v -0.987946 -6.991946 2.497225 +v -0.989750 -6.989749 2.497225 +v -0.979596 -6.979595 2.495095 +v -0.969639 -6.969638 2.491567 +v -0.959974 -6.959974 2.486677 +v -0.950695 -6.950695 2.480470 +v -0.941891 -6.941890 2.473007 +v -0.933646 -6.933646 2.464360 +v -0.926041 -6.926040 2.454611 +v -0.919147 -6.919147 2.443856 +v -0.913033 -6.913032 2.432196 +v -0.907756 -6.907755 2.419745 +v -0.903367 -6.903366 2.406622 +v -0.899909 -6.899908 2.392954 +v -0.897415 -6.897414 2.378873 +v -0.895909 -6.895908 2.364514 +v -0.895405 -6.895404 2.350015 +v -0.917821 -6.877008 2.350015 +v -0.918216 -6.877601 2.364514 +v -0.919400 -6.879372 2.378873 +v -0.921359 -6.882304 2.392954 +v -0.924076 -6.886371 2.406622 +v -0.927525 -6.891531 2.419745 +v -0.931671 -6.897737 2.432196 +v -0.936475 -6.904926 2.443856 +v -0.941891 -6.913032 2.454611 +v -0.947867 -6.921975 2.464360 +v -0.954344 -6.931670 2.473007 +v -0.961262 -6.942023 2.480470 +v -0.968552 -6.952934 2.486677 +v -0.976146 -6.964298 2.491567 +v -0.983969 -6.976007 2.495095 +v -0.991947 -6.987946 2.497225 +v -0.994453 -6.986606 2.497225 +v -0.988958 -6.973340 2.495095 +v -0.983570 -6.960330 2.491567 +v -0.978339 -6.947703 2.486677 +v -0.973317 -6.935579 2.480470 +v -0.968552 -6.924076 2.473007 +v -0.964090 -6.913303 2.464360 +v -0.959974 -6.903366 2.454611 +v -0.956244 -6.894360 2.443856 +v -0.952935 -6.886371 2.432196 +v -0.950079 -6.879476 2.419745 +v -0.947703 -6.873742 2.406622 +v -0.945832 -6.869224 2.392954 +v -0.944482 -6.865965 2.378873 +v -0.943667 -6.863997 2.364514 +v -0.943394 -6.863339 2.350015 +v -0.971144 -6.854921 2.350015 +v -0.971283 -6.855620 2.364514 +v -0.971698 -6.857709 2.378873 +v -0.972386 -6.861168 2.392954 +v -0.973340 -6.865965 2.406622 +v -0.974551 -6.872052 2.419745 +v -0.976007 -6.879372 2.432196 +v -0.977694 -6.887853 2.443856 +v -0.979596 -6.897414 2.454611 +v -0.981694 -6.907963 2.464360 +v -0.983969 -6.919399 2.473007 +v -0.986398 -6.931611 2.480470 +v -0.988958 -6.944481 2.486677 +v -0.991625 -6.957887 2.491567 +v -0.994372 -6.971697 2.495095 +v -0.997173 -6.985781 2.497225 +v -1.000002 -6.985502 2.497225 +v -1.000002 -6.971143 2.495095 +v -1.000002 -6.957062 2.491567 +v -1.000002 -6.943394 2.486677 +v -1.000002 -6.930271 2.480470 +v -1.000002 -6.917820 2.473007 +v -1.000002 -6.906160 2.464360 +v -1.000002 -6.895404 2.454611 +v -1.000002 -6.885656 2.443856 +v -1.000002 -6.877008 2.432196 +v -1.000002 -6.869545 2.419745 +v -1.000002 -6.863339 2.406622 +v -1.000002 -6.858449 2.392954 +v -1.000002 -6.854921 2.378873 +v -1.000002 -6.852791 2.364514 +v -1.000002 -6.852079 2.350015 +v -1.028860 -6.854921 2.350015 +v -1.028721 -6.855620 2.364514 +v -1.028306 -6.857709 2.378873 +v -1.027617 -6.861168 2.392954 +v -1.026663 -6.865965 2.406622 +v -1.025452 -6.872052 2.419745 +v -1.023996 -6.879372 2.432196 +v -1.022310 -6.887853 2.443856 +v -1.020408 -6.897414 2.454611 +v -1.018309 -6.907963 2.464360 +v -1.016035 -6.919399 2.473007 +v -1.013605 -6.931611 2.480470 +v -1.011045 -6.944481 2.486677 +v -1.008379 -6.957887 2.491567 +v -1.005632 -6.971697 2.495095 +v -1.002830 -6.985781 2.497225 +v -1.005550 -6.986606 2.497225 +v -1.011045 -6.973340 2.495095 +v -1.016434 -6.960330 2.491567 +v -1.021665 -6.947703 2.486677 +v -1.026686 -6.935579 2.480470 +v -1.031451 -6.924076 2.473007 +v -1.035913 -6.913303 2.464360 +v -1.040029 -6.903366 2.454611 +v -1.043760 -6.894360 2.443856 +v -1.047069 -6.886371 2.432196 +v -1.049925 -6.879476 2.419745 +v -1.052300 -6.873742 2.406622 +v -1.054172 -6.869224 2.392954 +v -1.055521 -6.865965 2.378873 +v -1.056337 -6.863997 2.364514 +v -1.056609 -6.863339 2.350015 +v -1.082183 -6.877008 2.350015 +v -1.081787 -6.877601 2.364514 +v -1.080604 -6.879372 2.378873 +v -1.078644 -6.882304 2.392954 +v -1.075927 -6.886371 2.406622 +v -1.072479 -6.891531 2.419745 +v -1.068333 -6.897737 2.432196 +v -1.063529 -6.904926 2.443856 +v -1.058113 -6.913032 2.454611 +v -1.052137 -6.921975 2.464360 +v -1.045659 -6.931670 2.473007 +v -1.038742 -6.942023 2.480470 +v -1.031451 -6.952934 2.486677 +v -1.023858 -6.964298 2.491567 +v -1.016035 -6.976007 2.495095 +v -1.008057 -6.987946 2.497225 +v -1.010254 -6.989749 2.497225 +v -1.020408 -6.979595 2.495095 +v -1.030365 -6.969638 2.491567 +v -1.040029 -6.959974 2.486677 +v -1.049308 -6.950695 2.480470 +v -1.058113 -6.941890 2.473007 +v -1.066357 -6.933646 2.464360 +v -1.073963 -6.926040 2.454611 +v -1.080856 -6.919147 2.443856 +v -1.086971 -6.913032 2.432196 +v -1.092248 -6.907755 2.419745 +v -1.096637 -6.903366 2.406622 +v -1.100095 -6.899908 2.392954 +v -1.102589 -6.897414 2.378873 +v -1.104095 -6.895908 2.364514 +v -1.104599 -6.895404 2.350015 +v -1.122402 -6.918216 2.364514 +v -1.120631 -6.919399 2.378873 +v -1.117699 -6.921359 2.392954 +v -1.113632 -6.924076 2.406622 +v -1.108472 -6.927524 2.419745 +v -1.102267 -6.931670 2.432196 +v -1.095076 -6.936474 2.443856 +v -1.086971 -6.941890 2.454611 +v -1.078028 -6.947866 2.464360 +v -1.068333 -6.954344 2.473007 +v -1.057980 -6.961261 2.480470 +v -1.047069 -6.968552 2.486677 +v -1.035705 -6.976145 2.491567 +v -1.023996 -6.983968 2.495095 +v -1.012057 -6.991946 2.497225 +v -1.000002 -7.000001 2.497937 +v -1.013397 -6.994452 2.497225 +v -1.026663 -6.988957 2.495095 +v -1.039673 -6.983569 2.491567 +v -1.052300 -6.978338 2.486677 +v -1.064424 -6.973317 2.480470 +v -1.075927 -6.968552 2.473007 +v -1.086699 -6.964090 2.464360 +v -1.096637 -6.959974 2.454611 +v -1.105643 -6.956243 2.443856 +v -1.113632 -6.952934 2.432196 +v -1.120527 -6.950078 2.419745 +v -1.126261 -6.947703 2.406622 +v -1.130779 -6.945831 2.392954 +v -1.134038 -6.944481 2.378873 +v -1.136006 -6.943666 2.364514 +v -1.144383 -6.971282 2.364514 +v -1.142294 -6.971697 2.378873 +v -1.138835 -6.972385 2.392954 +v -1.134038 -6.973340 2.406622 +v -1.127951 -6.974551 2.419745 +v -1.120631 -6.976007 2.432196 +v -1.112150 -6.977694 2.443856 +v -1.102589 -6.979595 2.454611 +v -1.092039 -6.981694 2.464360 +v -1.080604 -6.983968 2.473007 +v -1.068392 -6.986397 2.480470 +v -1.055521 -6.988957 2.486677 +v -1.042116 -6.991624 2.491567 +v -1.028306 -6.994371 2.495095 +v -1.014222 -6.997172 2.497225 +v -1.014501 -7.000001 2.497225 +v -1.028860 -7.000001 2.495095 +v -1.042941 -7.000001 2.491567 +v -1.056609 -7.000001 2.486677 +v -1.069732 -7.000001 2.480470 +v -1.082183 -7.000001 2.473007 +v -1.093843 -7.000001 2.464360 +v -1.104599 -7.000001 2.454611 +v -1.114347 -7.000001 2.443856 +v -1.122995 -7.000001 2.432196 +v -1.130457 -7.000001 2.419745 +v -1.136664 -7.000001 2.406622 +v -1.141554 -7.000001 2.392954 +v -1.145082 -7.000001 2.378873 +v -1.147212 -7.000001 2.364514 +v -1.144383 -7.028720 2.364514 +v -1.142294 -7.028305 2.378873 +v -1.138834 -7.027617 2.392954 +v -1.134038 -7.026663 2.406622 +v -1.127951 -7.025452 2.419745 +v -1.120631 -7.023996 2.432196 +v -1.112150 -7.022309 2.443856 +v -1.102589 -7.020407 2.454611 +v -1.092039 -7.018309 2.464360 +v -1.080604 -7.016034 2.473007 +v -1.068392 -7.013605 2.480470 +v -1.055521 -7.011045 2.486677 +v -1.042116 -7.008378 2.491567 +v -1.028306 -7.005631 2.495095 +v -1.014222 -7.002830 2.497225 +v -1.013397 -7.005549 2.497225 +v -1.026663 -7.011045 2.495095 +v -1.039673 -7.016433 2.491567 +v -1.052300 -7.021664 2.486677 +v -1.064424 -7.026686 2.480470 +v -1.075927 -7.031450 2.473007 +v -1.086699 -7.035913 2.464360 +v -1.096637 -7.040029 2.454611 +v -1.105643 -7.043759 2.443856 +v -1.113632 -7.047069 2.432196 +v -1.120527 -7.049924 2.419745 +v -1.126261 -7.052299 2.406622 +v -1.130779 -7.054171 2.392954 +v -1.134038 -7.055521 2.378873 +v -1.136006 -7.056336 2.364514 +v -1.122402 -7.081787 2.364514 +v -1.120631 -7.080603 2.378873 +v -1.117698 -7.078643 2.392954 +v -1.113632 -7.075927 2.406622 +v -1.108472 -7.072478 2.419745 +v -1.102267 -7.068332 2.432196 +v -1.095076 -7.063528 2.443856 +v -1.086971 -7.058112 2.454611 +v -1.078028 -7.052136 2.464360 +v -1.068333 -7.045659 2.473007 +v -1.057980 -7.038741 2.480470 +v -1.047069 -7.031450 2.486677 +v -1.035705 -7.023857 2.491567 +v -1.023996 -7.016034 2.495095 +v -1.012057 -7.008056 2.497225 +v -1.010254 -7.010253 2.497225 +v -1.020408 -7.020407 2.495095 +v -1.030365 -7.030364 2.491567 +v -1.040029 -7.040029 2.486677 +v -1.049308 -7.049308 2.480470 +v -1.058113 -7.058112 2.473007 +v -1.066357 -7.066357 2.464360 +v -1.073963 -7.073962 2.454611 +v -1.080856 -7.080855 2.443856 +v -1.086971 -7.086970 2.432196 +v -1.092248 -7.092247 2.419745 +v -1.096637 -7.096636 2.406622 +v -1.100095 -7.100094 2.392954 +v -1.102589 -7.102588 2.378873 +v -1.104095 -7.104094 2.364514 +v -1.081787 -7.122402 2.364514 +v -1.080604 -7.120631 2.378873 +v -1.078644 -7.117698 2.392954 +v -1.075927 -7.113632 2.406622 +v -1.072479 -7.108471 2.419745 +v -1.068333 -7.102266 2.432196 +v -1.063529 -7.095076 2.443856 +v -1.058113 -7.086970 2.454611 +v -1.052137 -7.078027 2.464360 +v -1.045659 -7.068332 2.473007 +v -1.038742 -7.057980 2.480470 +v -1.031451 -7.047069 2.486677 +v -1.023858 -7.035704 2.491567 +v -1.016035 -7.023996 2.495095 +v -1.008057 -7.012056 2.497225 +v -1.005550 -7.013396 2.497225 +v -1.011045 -7.026662 2.495095 +v -1.016434 -7.039672 2.491567 +v -1.021665 -7.052299 2.486677 +v -1.026686 -7.064423 2.480470 +v -1.031451 -7.075927 2.473007 +v -1.035913 -7.086699 2.464360 +v -1.040029 -7.096636 2.454611 +v -1.043760 -7.105642 2.443856 +v -1.047069 -7.113632 2.432196 +v -1.049925 -7.120526 2.419745 +v -1.052300 -7.126261 2.406622 +v -1.054172 -7.130779 2.392954 +v -1.055521 -7.134037 2.378873 +v -1.056337 -7.136005 2.364514 +v -1.028721 -7.144382 2.364514 +v -1.028305 -7.142293 2.378873 +v -1.027617 -7.138834 2.392954 +v -1.026663 -7.134037 2.406622 +v -1.025452 -7.127950 2.419745 +v -1.023996 -7.120631 2.432196 +v -1.022309 -7.112149 2.443856 +v -1.020408 -7.102588 2.454611 +v -1.018309 -7.092039 2.464360 +v -1.016034 -7.080603 2.473007 +v -1.013605 -7.068391 2.480470 +v -1.011045 -7.055521 2.486677 +v -1.008379 -7.042116 2.491567 +v -1.005632 -7.028305 2.495095 +v -1.002830 -7.014221 2.497225 +v -1.000002 -7.014500 2.497225 +v -1.000002 -7.028859 2.495095 +v -1.000002 -7.042941 2.491567 +v -1.000002 -7.056609 2.486677 +v -1.000002 -7.069731 2.480470 +v -1.000002 -7.082182 2.473007 +v -1.000002 -7.093842 2.464360 +v -1.000002 -7.104598 2.454611 +v -1.000002 -7.114347 2.443856 +v -1.000002 -7.122994 2.432196 +v -1.000002 -7.130457 2.419745 +v -1.000002 -7.136663 2.406622 +v -1.000002 -7.141554 2.392954 +v -1.000002 -7.145081 2.378873 +v -1.000002 -7.147211 2.364514 +v -0.971283 -7.144382 2.364514 +v -0.971698 -7.142293 2.378873 +v -0.972386 -7.138834 2.392954 +v -0.973340 -7.134037 2.406622 +v -0.974551 -7.127950 2.419745 +v -0.976007 -7.120631 2.432196 +v -0.977694 -7.112149 2.443856 +v -0.979596 -7.102588 2.454611 +v -0.981694 -7.092039 2.464360 +v -0.983969 -7.080603 2.473007 +v -0.986398 -7.068391 2.480470 +v -0.988958 -7.055521 2.486677 +v -0.991625 -7.042116 2.491567 +v -0.994372 -7.028305 2.495095 +v -0.997173 -7.014221 2.497225 +v -0.994453 -7.013396 2.497225 +v -0.988958 -7.026662 2.495095 +v -0.983570 -7.039672 2.491567 +v -0.978339 -7.052299 2.486677 +v -0.973317 -7.064423 2.480470 +v -0.968552 -7.075926 2.473007 +v -0.964090 -7.086699 2.464360 +v -0.959974 -7.096636 2.454611 +v -0.956244 -7.105642 2.443856 +v -0.952935 -7.113632 2.432196 +v -0.950079 -7.120526 2.419745 +v -0.947703 -7.126260 2.406622 +v -0.945832 -7.130779 2.392954 +v -0.944482 -7.134037 2.378873 +v -0.943667 -7.136005 2.364514 +v -0.918216 -7.122402 2.364514 +v -0.919400 -7.120631 2.378873 +v -0.921359 -7.117698 2.392954 +v -0.924076 -7.113632 2.406622 +v -0.927525 -7.108471 2.419745 +v -0.931671 -7.102266 2.432196 +v -0.936475 -7.095076 2.443856 +v -0.941891 -7.086970 2.454611 +v -0.947867 -7.078027 2.464360 +v -0.954344 -7.068332 2.473007 +v -0.961262 -7.057980 2.480470 +v -0.968552 -7.047069 2.486677 +v -0.976146 -7.035704 2.491567 +v -0.983969 -7.023996 2.495095 +v -0.991947 -7.012056 2.497225 +v -0.989750 -7.010253 2.497225 +v -0.979596 -7.020407 2.495095 +v -0.969639 -7.030364 2.491567 +v -0.959974 -7.040029 2.486677 +v -0.950695 -7.049308 2.480470 +v -0.941891 -7.058112 2.473007 +v -0.933646 -7.066357 2.464360 +v -0.926041 -7.073962 2.454611 +v -0.919147 -7.080855 2.443856 +v -0.913033 -7.086970 2.432196 +v -0.907756 -7.092247 2.419745 +v -0.903367 -7.096636 2.406622 +v -0.899909 -7.100094 2.392954 +v -0.897415 -7.102588 2.378873 +v -0.895909 -7.104094 2.364514 +v -0.895405 -7.104598 2.350015 +v -0.877009 -7.082182 2.350015 +v -0.877601 -7.081787 2.364514 +v -0.879372 -7.080603 2.378873 +v -0.882305 -7.078643 2.392954 +v -0.886371 -7.075926 2.406622 +v -0.891532 -7.072478 2.419745 +v -0.897737 -7.068332 2.432196 +v -0.904927 -7.063528 2.443856 +v -0.913033 -7.058112 2.454611 +v -0.921976 -7.052136 2.464360 +v -0.931671 -7.045659 2.473007 +v -0.942023 -7.038741 2.480470 +v -0.952935 -7.031450 2.486677 +v -0.964299 -7.023857 2.491567 +v -0.976007 -7.016034 2.495095 +v -0.987946 -7.008056 2.497225 +v -0.986607 -7.005549 2.497225 +v -0.973340 -7.011045 2.495095 +v -0.960331 -7.016433 2.491567 +v -0.947703 -7.021664 2.486677 +v -0.935580 -7.026686 2.480470 +v -0.924076 -7.031450 2.473007 +v -0.913304 -7.035913 2.464360 +v -0.903367 -7.040029 2.454611 +v -0.894361 -7.043759 2.443856 +v -0.886371 -7.047068 2.432196 +v -0.879477 -7.049924 2.419745 +v -0.873742 -7.052299 2.406622 +v -0.869224 -7.054171 2.392954 +v -0.865966 -7.055521 2.378873 +v -0.863998 -7.056336 2.364514 +v -0.863340 -7.056608 2.350015 +v -0.854922 -7.028859 2.350015 +v -0.855621 -7.028720 2.364514 +v -0.857710 -7.028305 2.378873 +v -0.861169 -7.027617 2.392954 +v -0.865966 -7.026662 2.406622 +v -0.872053 -7.025452 2.419745 +v -0.879372 -7.023996 2.432196 +v -0.887854 -7.022309 2.443856 +v -0.897415 -7.020407 2.454611 +v -0.907964 -7.018309 2.464360 +v -0.919400 -7.016034 2.473007 +v -0.931612 -7.013605 2.480470 +v -0.944482 -7.011045 2.486677 +v -0.957887 -7.008378 2.491567 +v -0.971698 -7.005631 2.495095 +v -0.985781 -7.002830 2.497225 +v -0.985503 -7.000001 2.497225 +v -0.957062 -7.000001 2.491567 +v -0.930272 -7.000001 2.480470 +v -0.917821 -7.000001 2.473007 +v -0.906161 -7.000001 2.464360 +v -0.895405 -7.000001 2.454611 +v -0.885657 -7.000001 2.443856 +v -0.877009 -7.000001 2.432196 +v -0.869546 -7.000001 2.419745 +v -0.863340 -7.000001 2.406622 +v -0.858449 -7.000001 2.392954 +v -0.854922 -7.000001 2.378873 +v -0.852792 -7.000001 2.364514 +v -0.852080 -7.000001 2.350015 +v -1.000000 -7.000000 0.000000 +v -0.400000 -6.400000 0.016519 +v -0.528582 -6.294476 0.016519 +v -0.675281 -6.216063 0.016519 +v -0.834459 -6.167777 0.016519 +v -0.999999 -6.151472 0.016519 +v -1.165538 -6.167776 0.016519 +v -1.324717 -6.216062 0.016519 +v -1.471416 -6.294474 0.016519 +v -1.599999 -6.399999 0.016519 +v -1.705525 -6.528582 0.016519 +v -1.783937 -6.675282 0.016519 +v -1.832224 -6.834459 0.016519 +v -1.848528 -6.999999 0.016519 +v -1.832224 -7.165539 0.016519 +v -1.783938 -7.324717 0.016519 +v -1.705526 -7.471416 0.016519 +v -1.600000 -7.599999 0.016519 +v -1.471417 -7.705525 0.016519 +v -1.324718 -7.783937 0.016519 +v -1.165540 -7.832224 0.016519 +v -1.000000 -7.848528 0.016519 +v -0.834461 -7.832224 0.016519 +v -0.675282 -7.783938 0.016519 +v -0.528583 -7.705525 0.016519 +v -0.400000 -7.600000 0.016519 +v -0.294475 -7.471417 0.016519 +v -0.216062 -7.324718 0.016519 +v -0.167776 -7.165540 0.016519 +v -0.151472 -7.000000 0.016519 +v -0.167776 -6.834460 0.016519 +v -0.216062 -6.675282 0.016519 +v -0.294475 -6.528583 0.016519 +v -0.460000 -6.460000 0.150000 +v -0.365027 -6.575725 0.150000 +v -0.294456 -6.707754 0.150000 +v -0.250998 -6.851014 0.150000 +v -0.236325 -7.000000 0.150000 +v -0.250998 -7.148985 0.150000 +v -0.294456 -7.292246 0.150000 +v -0.365027 -7.424275 0.150000 +v -0.460000 -7.540000 0.150000 +v -0.575725 -7.634973 0.150000 +v -0.707754 -7.705544 0.150000 +v -0.851014 -7.749002 0.150000 +v -1.000000 -7.763675 0.150000 +v -1.148986 -7.749002 0.150000 +v -1.292246 -7.705544 0.150000 +v -1.424276 -7.634973 0.150000 +v -1.540000 -7.539999 0.150000 +v -1.634973 -7.424275 0.150000 +v -1.705544 -7.292245 0.150000 +v -1.749002 -7.148985 0.150000 +v -1.763675 -6.999999 0.150000 +v -1.749001 -6.851014 0.150000 +v -1.705544 -6.707753 0.150000 +v -1.634972 -6.575724 0.150000 +v -1.539999 -6.459999 0.150000 +v -1.424274 -6.365026 0.150000 +v -1.292245 -6.294456 0.150000 +v -1.148985 -6.250998 0.150000 +v -0.999999 -6.236325 0.150000 +v -0.851013 -6.250998 0.150000 +v -0.707753 -6.294456 0.150000 +v -0.575724 -6.365028 0.150000 +v -0.564928 -6.564928 0.350000 +v -0.488409 -6.658166 0.350000 +v -0.431551 -6.764541 0.350000 +v -0.396538 -6.879964 0.350000 +v -0.384715 -7.000000 0.350000 +v -0.396538 -7.120036 0.350000 +v -0.431551 -7.235459 0.350000 +v -0.488409 -7.341834 0.350000 +v -0.564928 -7.435072 0.350000 +v -0.658166 -7.511590 0.350000 +v -0.764541 -7.568449 0.350000 +v -0.879964 -7.603462 0.350000 +v -1.000000 -7.615285 0.350000 +v -1.120036 -7.603462 0.350000 +v -1.235460 -7.568449 0.350000 +v -1.341834 -7.511590 0.350000 +v -1.435072 -7.435072 0.350000 +v -1.511591 -7.341834 0.350000 +v -1.568449 -7.235459 0.350000 +v -1.603462 -7.120036 0.350000 +v -1.615285 -7.000000 0.350000 +v -1.603462 -6.879963 0.350000 +v -1.568449 -6.764540 0.350000 +v -1.511590 -6.658165 0.350000 +v -1.435071 -6.564928 0.350000 +v -1.341833 -6.488409 0.350000 +v -1.235458 -6.431551 0.350000 +v -1.120035 -6.396538 0.350000 +v -0.999999 -6.384715 0.350000 +v -0.879963 -6.396538 0.350000 +v -0.764540 -6.431551 0.350000 +v -0.658165 -6.488410 0.350000 +v -0.496000 -6.496000 0.250000 +v -0.604009 -6.407359 0.250000 +v -0.727236 -6.341493 0.250000 +v -0.860946 -6.300932 0.250000 +v -0.999999 -6.287236 0.250000 +v -1.139052 -6.300932 0.250000 +v -1.272762 -6.341492 0.250000 +v -1.395989 -6.407358 0.250000 +v -1.503999 -6.495999 0.250000 +v -1.592641 -6.604009 0.250000 +v -1.658507 -6.727236 0.250000 +v -1.699068 -6.860946 0.250000 +v -1.712764 -7.000000 0.250000 +v -1.699068 -7.139053 0.250000 +v -1.658508 -7.272762 0.250000 +v -1.592642 -7.395990 0.250000 +v -1.504000 -7.504000 0.250000 +v -1.395991 -7.592641 0.250000 +v -1.272763 -7.658508 0.250000 +v -1.139054 -7.699068 0.250000 +v -1.000000 -7.712764 0.250000 +v -0.860947 -7.699068 0.250000 +v -0.727237 -7.658508 0.250000 +v -0.604010 -7.592641 0.250000 +v -0.496000 -7.504000 0.250000 +v -0.407359 -7.395990 0.250000 +v -0.341492 -7.272763 0.250000 +v -0.300932 -7.139053 0.250000 +v -0.287236 -7.000000 0.250000 +v -0.300932 -6.860947 0.250000 +v -0.341492 -6.727237 0.250000 +v -0.407359 -6.604010 0.250000 +v -0.400000 -6.400000 0.090810 +v -0.294475 -6.528583 0.090810 +v -0.216062 -6.675282 0.090810 +v -0.167776 -6.834460 0.090810 +v -0.151472 -7.000000 0.090810 +v -0.167776 -7.165540 0.090810 +v -0.216062 -7.324718 0.090810 +v -0.294475 -7.471417 0.090810 +v -0.400000 -7.600000 0.090810 +v -0.528583 -7.705525 0.090810 +v -0.675282 -7.783938 0.090810 +v -0.834461 -7.832224 0.090810 +v -1.000000 -7.848528 0.090810 +v -1.165540 -7.832224 0.090810 +v -1.324718 -7.783937 0.090810 +v -1.471417 -7.705525 0.090810 +v -1.600000 -7.599999 0.090810 +v -1.705526 -7.471416 0.090810 +v -1.783938 -7.324717 0.090810 +v -1.832224 -7.165539 0.090810 +v -1.848528 -6.999999 0.090810 +v -1.832224 -6.834459 0.090810 +v -1.783937 -6.675282 0.090810 +v -1.705525 -6.528582 0.090810 +v -1.599999 -6.399999 0.090810 +v -1.471416 -6.294474 0.090810 +v -1.324717 -6.216062 0.090810 +v -1.165538 -6.167776 0.090810 +v -0.999999 -6.151472 0.090810 +v -0.834459 -6.167777 0.090810 +v -0.675281 -6.216063 0.090810 +v -0.528582 -6.294476 0.090810 +usemtl Material +s 1 +f 931 1 32 932 +f 31 933 932 32 +f 30 934 933 31 +f 30 29 935 934 +f 28 936 935 29 +f 27 937 936 28 +f 26 938 937 27 +f 26 25 939 938 +f 24 940 939 25 +f 24 23 941 940 +f 22 942 941 23 +f 21 943 942 22 +f 20 944 943 21 +f 20 19 945 944 +f 18 946 945 19 +f 18 17 947 946 +f 16 948 947 17 +f 16 15 949 948 +f 14 950 949 15 +f 14 13 951 950 +f 12 952 951 13 +f 11 953 952 12 +f 10 954 953 11 +f 10 9 955 954 +f 9 8 956 955 +f 7 957 956 8 +f 7 6 958 957 +f 5 959 958 6 +f 5 4 960 959 +f 3 961 960 4 +f 3 2 962 961 +f 2 1 931 962 +f 63 64 963 964 +f 62 63 964 965 +f 62 965 966 61 +f 60 61 966 967 +f 60 967 968 59 +f 58 59 968 969 +f 58 969 970 57 +f 56 57 970 971 +f 55 56 971 972 +f 55 972 973 54 +f 54 973 974 53 +f 53 974 975 52 +f 51 52 975 976 +f 51 976 977 50 +f 49 50 977 978 +f 49 978 979 48 +f 47 48 979 980 +f 47 980 981 46 +f 45 46 981 982 +f 45 982 983 44 +f 44 983 984 43 +f 43 984 985 42 +f 41 42 985 986 +f 41 986 987 40 +f 39 40 987 988 +f 39 988 989 38 +f 38 989 990 37 +f 37 990 991 36 +f 35 36 991 992 +f 35 992 993 34 +f 34 993 994 33 +f 33 994 963 64 +f 96 1028 1027 65 +f 95 1029 1028 96 +f 94 1030 1029 95 +f 94 93 1031 1030 +f 92 1032 1031 93 +f 91 1033 1032 92 +f 90 1034 1033 91 +f 90 89 1035 1034 +f 88 1036 1035 89 +f 88 87 1037 1036 +f 86 1038 1037 87 +f 85 1039 1038 86 +f 84 1040 1039 85 +f 84 83 1041 1040 +f 82 1042 1041 83 +f 82 81 1043 1042 +f 80 1044 1043 81 +f 80 79 1045 1044 +f 78 1046 1045 79 +f 78 77 1047 1046 +f 76 1048 1047 77 +f 75 1049 1048 76 +f 74 1050 1049 75 +f 74 73 1051 1050 +f 73 72 1052 1051 +f 71 1053 1052 72 +f 71 70 1054 1053 +f 69 1055 1054 70 +f 69 68 1056 1055 +f 67 1057 1056 68 +f 67 66 1058 1057 +f 66 65 1027 1058 +f 127 128 995 996 +f 126 127 996 997 +f 126 997 998 125 +f 124 125 998 999 +f 124 999 1000 123 +f 122 123 1000 1001 +f 122 1001 1002 121 +f 120 121 1002 1003 +f 119 120 1003 1004 +f 119 1004 1005 118 +f 118 1005 1006 117 +f 117 1006 1007 116 +f 115 116 1007 1008 +f 115 1008 1009 114 +f 113 114 1009 1010 +f 113 1010 1011 112 +f 111 112 1011 1012 +f 111 1012 1013 110 +f 109 110 1013 1014 +f 109 1014 1015 108 +f 108 1015 1016 107 +f 107 1016 1017 106 +f 105 106 1017 1018 +f 105 1018 1019 104 +f 103 104 1019 1020 +f 103 1020 1021 102 +f 102 1021 1022 101 +f 101 1022 1023 100 +f 99 100 1023 1024 +f 99 1024 1025 98 +f 98 1025 1026 97 +f 97 1026 995 128 +f 160 161 192 129 +f 159 162 161 160 +f 158 163 162 159 +f 158 157 164 163 +f 156 165 164 157 +f 155 166 165 156 +f 154 167 166 155 +f 154 153 168 167 +f 152 169 168 153 +f 152 151 170 169 +f 150 171 170 151 +f 149 172 171 150 +f 148 173 172 149 +f 148 147 174 173 +f 146 175 174 147 +f 146 145 176 175 +f 144 177 176 145 +f 144 143 178 177 +f 142 179 178 143 +f 142 141 180 179 +f 140 181 180 141 +f 139 182 181 140 +f 138 183 182 139 +f 138 137 184 183 +f 137 136 185 184 +f 135 186 185 136 +f 135 134 187 186 +f 133 188 187 134 +f 133 132 189 188 +f 131 190 189 132 +f 131 130 191 190 +f 130 129 192 191 +f 191 192 193 194 +f 190 191 194 195 +f 190 195 196 189 +f 188 189 196 197 +f 188 197 198 187 +f 186 187 198 199 +f 186 199 200 185 +f 184 185 200 201 +f 183 184 201 202 +f 183 202 203 182 +f 182 203 204 181 +f 181 204 205 180 +f 179 180 205 206 +f 179 206 207 178 +f 177 178 207 208 +f 177 208 209 176 +f 175 176 209 210 +f 175 210 211 174 +f 173 174 211 212 +f 173 212 213 172 +f 172 213 214 171 +f 171 214 215 170 +f 169 170 215 216 +f 169 216 217 168 +f 167 168 217 218 +f 167 218 219 166 +f 166 219 220 165 +f 165 220 221 164 +f 163 164 221 222 +f 163 222 223 162 +f 162 223 224 161 +f 161 224 193 192 +f 224 225 256 193 +f 223 226 225 224 +f 222 227 226 223 +f 222 221 228 227 +f 220 229 228 221 +f 219 230 229 220 +f 218 231 230 219 +f 218 217 232 231 +f 216 233 232 217 +f 216 215 234 233 +f 214 235 234 215 +f 213 236 235 214 +f 212 237 236 213 +f 212 211 238 237 +f 210 239 238 211 +f 210 209 240 239 +f 208 241 240 209 +f 208 207 242 241 +f 206 243 242 207 +f 206 205 244 243 +f 204 245 244 205 +f 203 246 245 204 +f 202 247 246 203 +f 202 201 248 247 +f 201 200 249 248 +f 199 250 249 200 +f 199 198 251 250 +f 197 252 251 198 +f 197 196 253 252 +f 195 254 253 196 +f 195 194 255 254 +f 194 193 256 255 +f 255 256 257 258 +f 254 255 258 259 +f 254 259 260 253 +f 252 253 260 261 +f 252 261 262 251 +f 250 251 262 263 +f 250 263 264 249 +f 248 249 264 265 +f 247 248 265 266 +f 247 266 267 246 +f 246 267 268 245 +f 245 268 269 244 +f 243 244 269 270 +f 243 270 271 242 +f 241 242 271 272 +f 241 272 273 240 +f 239 240 273 274 +f 239 274 275 238 +f 237 238 275 276 +f 237 276 277 236 +f 236 277 278 235 +f 235 278 279 234 +f 233 234 279 280 +f 233 280 281 232 +f 231 232 281 282 +f 231 282 283 230 +f 230 283 284 229 +f 229 284 285 228 +f 227 228 285 286 +f 227 286 287 226 +f 226 287 288 225 +f 225 288 257 256 +f 288 289 320 257 +f 287 290 289 288 +f 286 291 290 287 +f 286 285 292 291 +f 284 293 292 285 +f 283 294 293 284 +f 282 295 294 283 +f 282 281 296 295 +f 280 297 296 281 +f 280 279 298 297 +f 278 299 298 279 +f 277 300 299 278 +f 276 301 300 277 +f 276 275 302 301 +f 274 303 302 275 +f 274 273 304 303 +f 272 305 304 273 +f 272 271 306 305 +f 270 307 306 271 +f 270 269 308 307 +f 268 309 308 269 +f 267 310 309 268 +f 266 311 310 267 +f 266 265 312 311 +f 265 264 313 312 +f 263 314 313 264 +f 263 262 315 314 +f 261 316 315 262 +f 261 260 317 316 +f 259 318 317 260 +f 259 258 319 318 +f 258 257 320 319 +f 319 320 321 322 +f 318 319 322 323 +f 318 323 324 317 +f 316 317 324 325 +f 316 325 326 315 +f 314 315 326 327 +f 314 327 328 313 +f 312 313 328 329 +f 311 312 329 330 +f 311 330 331 310 +f 310 331 332 309 +f 309 332 333 308 +f 307 308 333 334 +f 307 334 335 306 +f 305 306 335 336 +f 305 336 337 304 +f 303 304 337 338 +f 303 338 339 302 +f 301 302 339 340 +f 301 340 341 300 +f 300 341 342 299 +f 299 342 343 298 +f 297 298 343 344 +f 297 344 345 296 +f 295 296 345 346 +f 295 346 347 294 +f 294 347 348 293 +f 293 348 349 292 +f 291 292 349 350 +f 291 350 351 290 +f 290 351 352 289 +f 289 352 321 320 +f 352 353 384 321 +f 351 354 353 352 +f 350 355 354 351 +f 350 349 356 355 +f 348 357 356 349 +f 347 358 357 348 +f 346 359 358 347 +f 346 345 360 359 +f 344 361 360 345 +f 344 343 362 361 +f 342 363 362 343 +f 341 364 363 342 +f 340 365 364 341 +f 340 339 366 365 +f 338 367 366 339 +f 338 337 368 367 +f 336 369 368 337 +f 336 335 370 369 +f 334 371 370 335 +f 334 333 372 371 +f 332 373 372 333 +f 331 374 373 332 +f 330 375 374 331 +f 330 329 376 375 +f 329 328 377 376 +f 327 378 377 328 +f 327 326 379 378 +f 325 380 379 326 +f 325 324 381 380 +f 323 382 381 324 +f 323 322 383 382 +f 322 321 384 383 +f 383 384 385 386 +f 382 383 386 387 +f 382 387 388 381 +f 380 381 388 389 +f 380 389 390 379 +f 378 379 390 391 +f 378 391 392 377 +f 376 377 392 393 +f 375 376 393 394 +f 375 394 395 374 +f 374 395 396 373 +f 373 396 397 372 +f 371 372 397 398 +f 371 398 399 370 +f 369 370 399 400 +f 369 400 401 368 +f 367 368 401 402 +f 367 402 403 366 +f 365 366 403 404 +f 365 404 405 364 +f 364 405 406 363 +f 363 406 407 362 +f 361 362 407 408 +f 361 408 409 360 +f 359 360 409 410 +f 359 410 411 358 +f 358 411 412 357 +f 357 412 413 356 +f 355 356 413 414 +f 355 414 415 354 +f 354 415 416 353 +f 353 416 385 384 +f 416 498 497 385 +f 415 529 498 416 +f 414 530 529 415 +f 414 413 561 530 +f 412 562 561 413 +f 411 593 562 412 +f 410 594 593 411 +f 410 409 625 594 +f 408 417 625 409 +f 408 407 418 417 +f 406 419 418 407 +f 405 420 419 406 +f 404 421 420 405 +f 404 403 422 421 +f 402 423 422 403 +f 402 401 424 423 +f 400 425 424 401 +f 400 399 426 425 +f 398 427 426 399 +f 398 397 428 427 +f 396 429 428 397 +f 395 430 429 396 +f 394 431 430 395 +f 394 393 867 431 +f 393 392 868 867 +f 391 899 868 392 +f 391 390 900 899 +f 389 929 900 390 +f 389 388 434 929 +f 387 465 434 388 +f 387 386 466 465 +f 386 385 497 466 +f 929 434 435 928 +f 928 435 436 927 +f 927 436 437 926 +f 926 437 438 925 +f 925 438 439 924 +f 924 439 440 923 +f 923 440 441 922 +f 922 441 442 921 +f 921 442 443 920 +f 920 443 444 919 +f 919 444 445 918 +f 918 445 446 433 +f 433 446 447 917 +f 917 447 448 432 +f 432 448 449 916 +f 916 449 641 +f 449 450 641 +f 448 451 450 449 +f 447 452 451 448 +f 446 453 452 447 +f 445 454 453 446 +f 444 455 454 445 +f 443 456 455 444 +f 442 457 456 443 +f 441 458 457 442 +f 440 459 458 441 +f 439 460 459 440 +f 438 461 460 439 +f 437 462 461 438 +f 436 463 462 437 +f 435 464 463 436 +f 434 465 464 435 +f 465 466 467 464 +f 464 467 468 463 +f 463 468 469 462 +f 462 469 470 461 +f 461 470 471 460 +f 460 471 472 459 +f 459 472 473 458 +f 458 473 474 457 +f 457 474 475 456 +f 456 475 476 455 +f 455 476 477 454 +f 454 477 478 453 +f 453 478 479 452 +f 452 479 480 451 +f 451 480 481 450 +f 450 481 641 +f 481 482 641 +f 480 483 482 481 +f 479 484 483 480 +f 478 485 484 479 +f 477 486 485 478 +f 476 487 486 477 +f 475 488 487 476 +f 474 489 488 475 +f 473 490 489 474 +f 472 491 490 473 +f 471 492 491 472 +f 470 493 492 471 +f 469 494 493 470 +f 468 495 494 469 +f 467 496 495 468 +f 466 497 496 467 +f 497 498 499 496 +f 496 499 500 495 +f 495 500 501 494 +f 494 501 502 493 +f 493 502 503 492 +f 492 503 504 491 +f 491 504 505 490 +f 490 505 506 489 +f 489 506 507 488 +f 488 507 508 487 +f 487 508 509 486 +f 486 509 510 485 +f 485 510 511 484 +f 484 511 512 483 +f 483 512 513 482 +f 482 513 641 +f 513 514 641 +f 512 515 514 513 +f 511 516 515 512 +f 510 517 516 511 +f 509 518 517 510 +f 508 519 518 509 +f 507 520 519 508 +f 506 521 520 507 +f 505 522 521 506 +f 504 523 522 505 +f 503 524 523 504 +f 502 525 524 503 +f 501 526 525 502 +f 500 527 526 501 +f 499 528 527 500 +f 498 529 528 499 +f 529 530 531 528 +f 528 531 532 527 +f 527 532 533 526 +f 526 533 534 525 +f 525 534 535 524 +f 524 535 536 523 +f 523 536 537 522 +f 522 537 538 521 +f 521 538 539 520 +f 520 539 540 519 +f 519 540 541 518 +f 518 541 542 517 +f 517 542 543 516 +f 516 543 544 515 +f 515 544 545 514 +f 514 545 641 +f 545 546 641 +f 544 547 546 545 +f 543 548 547 544 +f 542 549 548 543 +f 541 550 549 542 +f 540 551 550 541 +f 539 552 551 540 +f 538 553 552 539 +f 537 554 553 538 +f 536 555 554 537 +f 535 556 555 536 +f 534 557 556 535 +f 533 558 557 534 +f 532 559 558 533 +f 531 560 559 532 +f 530 561 560 531 +f 561 562 563 560 +f 560 563 564 559 +f 559 564 565 558 +f 558 565 566 557 +f 557 566 567 556 +f 556 567 568 555 +f 555 568 569 554 +f 554 569 570 553 +f 553 570 571 552 +f 552 571 572 551 +f 551 572 573 550 +f 550 573 574 549 +f 549 574 575 548 +f 548 575 576 547 +f 547 576 577 546 +f 546 577 641 +f 577 578 641 +f 576 579 578 577 +f 575 580 579 576 +f 574 581 580 575 +f 573 582 581 574 +f 572 583 582 573 +f 571 584 583 572 +f 570 585 584 571 +f 569 586 585 570 +f 568 587 586 569 +f 567 588 587 568 +f 566 589 588 567 +f 565 590 589 566 +f 564 591 590 565 +f 563 592 591 564 +f 562 593 592 563 +f 593 594 595 592 +f 592 595 596 591 +f 591 596 597 590 +f 590 597 598 589 +f 589 598 599 588 +f 588 599 600 587 +f 587 600 601 586 +f 586 601 602 585 +f 585 602 603 584 +f 584 603 604 583 +f 583 604 605 582 +f 582 605 606 581 +f 581 606 607 580 +f 580 607 608 579 +f 579 608 609 578 +f 578 609 641 +f 609 610 641 +f 608 611 610 609 +f 607 612 611 608 +f 606 613 612 607 +f 605 614 613 606 +f 604 615 614 605 +f 603 616 615 604 +f 602 617 616 603 +f 601 618 617 602 +f 600 619 618 601 +f 599 620 619 600 +f 598 621 620 599 +f 597 622 621 598 +f 596 623 622 597 +f 595 624 623 596 +f 594 625 624 595 +f 625 417 626 624 +f 624 626 627 623 +f 623 627 628 622 +f 622 628 629 621 +f 621 629 630 620 +f 620 630 631 619 +f 619 631 632 618 +f 618 632 633 617 +f 617 633 634 616 +f 616 634 635 615 +f 615 635 636 614 +f 614 636 637 613 +f 613 637 638 612 +f 612 638 639 611 +f 611 639 640 610 +f 610 640 641 +f 640 642 641 +f 639 643 642 640 +f 638 644 643 639 +f 637 645 644 638 +f 636 646 645 637 +f 635 647 646 636 +f 634 648 647 635 +f 633 649 648 634 +f 632 650 649 633 +f 631 651 650 632 +f 630 652 651 631 +f 629 653 652 630 +f 628 654 653 629 +f 627 655 654 628 +f 626 656 655 627 +f 417 418 656 626 +f 418 419 657 656 +f 656 657 658 655 +f 655 658 659 654 +f 654 659 660 653 +f 653 660 661 652 +f 652 661 662 651 +f 651 662 663 650 +f 650 663 664 649 +f 649 664 665 648 +f 648 665 666 647 +f 647 666 667 646 +f 646 667 668 645 +f 645 668 669 644 +f 644 669 670 643 +f 643 670 671 642 +f 642 671 641 +f 671 672 641 +f 670 673 672 671 +f 669 674 673 670 +f 668 675 674 669 +f 667 676 675 668 +f 666 677 676 667 +f 665 678 677 666 +f 664 679 678 665 +f 663 680 679 664 +f 662 681 680 663 +f 661 682 681 662 +f 660 683 682 661 +f 659 684 683 660 +f 658 685 684 659 +f 657 686 685 658 +f 419 420 686 657 +f 420 421 687 686 +f 686 687 688 685 +f 685 688 689 684 +f 684 689 690 683 +f 683 690 691 682 +f 682 691 692 681 +f 681 692 693 680 +f 680 693 694 679 +f 679 694 695 678 +f 678 695 696 677 +f 677 696 697 676 +f 676 697 698 675 +f 675 698 699 674 +f 674 699 700 673 +f 673 700 701 672 +f 672 701 641 +f 701 702 641 +f 700 703 702 701 +f 699 704 703 700 +f 698 705 704 699 +f 697 706 705 698 +f 696 707 706 697 +f 695 708 707 696 +f 694 709 708 695 +f 693 710 709 694 +f 692 711 710 693 +f 691 712 711 692 +f 690 713 712 691 +f 689 714 713 690 +f 688 715 714 689 +f 687 716 715 688 +f 421 422 716 687 +f 422 423 717 716 +f 716 717 718 715 +f 715 718 719 714 +f 714 719 720 713 +f 713 720 721 712 +f 712 721 722 711 +f 711 722 723 710 +f 710 723 724 709 +f 709 724 725 708 +f 708 725 726 707 +f 707 726 727 706 +f 706 727 728 705 +f 705 728 729 704 +f 704 729 730 703 +f 703 730 731 702 +f 702 731 641 +f 731 732 641 +f 730 733 732 731 +f 729 734 733 730 +f 728 735 734 729 +f 727 736 735 728 +f 726 737 736 727 +f 725 738 737 726 +f 724 739 738 725 +f 723 740 739 724 +f 722 741 740 723 +f 721 742 741 722 +f 720 743 742 721 +f 719 744 743 720 +f 718 745 744 719 +f 717 746 745 718 +f 423 424 746 717 +f 424 425 747 746 +f 746 747 748 745 +f 745 748 749 744 +f 744 749 750 743 +f 743 750 751 742 +f 742 751 752 741 +f 741 752 753 740 +f 740 753 754 739 +f 739 754 755 738 +f 738 755 756 737 +f 737 756 757 736 +f 736 757 758 735 +f 735 758 759 734 +f 734 759 760 733 +f 733 760 761 732 +f 732 761 641 +f 761 762 641 +f 760 763 762 761 +f 759 764 763 760 +f 758 765 764 759 +f 757 766 765 758 +f 756 767 766 757 +f 755 768 767 756 +f 754 769 768 755 +f 753 770 769 754 +f 752 771 770 753 +f 751 772 771 752 +f 750 773 772 751 +f 749 774 773 750 +f 748 775 774 749 +f 747 776 775 748 +f 425 426 776 747 +f 426 427 777 776 +f 776 777 778 775 +f 775 778 779 774 +f 774 779 780 773 +f 773 780 781 772 +f 772 781 782 771 +f 771 782 783 770 +f 770 783 784 769 +f 769 784 785 768 +f 768 785 786 767 +f 767 786 787 766 +f 766 787 788 765 +f 765 788 789 764 +f 764 789 790 763 +f 763 790 791 762 +f 762 791 641 +f 791 792 641 +f 790 793 792 791 +f 789 794 793 790 +f 788 795 794 789 +f 787 796 795 788 +f 786 797 796 787 +f 785 798 797 786 +f 784 799 798 785 +f 783 800 799 784 +f 782 801 800 783 +f 781 802 801 782 +f 780 803 802 781 +f 779 804 803 780 +f 778 805 804 779 +f 777 806 805 778 +f 427 428 806 777 +f 428 429 807 806 +f 806 807 808 805 +f 805 808 809 804 +f 804 809 810 803 +f 803 810 811 802 +f 802 811 812 801 +f 801 812 813 800 +f 800 813 814 799 +f 799 814 815 798 +f 798 815 816 797 +f 797 816 817 796 +f 796 817 818 795 +f 795 818 819 794 +f 794 819 820 793 +f 793 820 821 792 +f 792 821 641 +f 821 822 641 +f 820 823 822 821 +f 819 824 823 820 +f 818 825 824 819 +f 817 826 825 818 +f 816 827 826 817 +f 815 828 827 816 +f 814 829 828 815 +f 813 830 829 814 +f 812 831 830 813 +f 811 832 831 812 +f 810 833 832 811 +f 809 834 833 810 +f 808 835 834 809 +f 807 836 835 808 +f 429 430 836 807 +f 430 431 837 836 +f 836 837 838 835 +f 835 838 839 834 +f 834 839 840 833 +f 833 840 841 832 +f 832 841 842 831 +f 831 842 843 830 +f 830 843 844 829 +f 829 844 845 828 +f 828 845 846 827 +f 827 846 847 826 +f 826 847 848 825 +f 825 848 849 824 +f 824 849 850 823 +f 823 850 851 822 +f 822 851 641 +f 851 852 641 +f 850 853 852 851 +f 849 854 853 850 +f 848 855 854 849 +f 847 856 855 848 +f 846 857 856 847 +f 845 858 857 846 +f 844 859 858 845 +f 843 860 859 844 +f 842 861 860 843 +f 841 862 861 842 +f 840 863 862 841 +f 839 864 863 840 +f 838 865 864 839 +f 837 866 865 838 +f 431 867 866 837 +f 867 868 869 866 +f 866 869 870 865 +f 865 870 871 864 +f 864 871 872 863 +f 863 872 873 862 +f 862 873 874 861 +f 861 874 875 860 +f 860 875 876 859 +f 859 876 877 858 +f 858 877 878 857 +f 857 878 879 856 +f 856 879 880 855 +f 855 880 881 854 +f 854 881 882 853 +f 853 882 883 852 +f 852 883 641 +f 883 884 641 +f 882 885 884 883 +f 881 886 885 882 +f 880 887 886 881 +f 879 888 887 880 +f 878 889 888 879 +f 877 890 889 878 +f 876 891 890 877 +f 875 892 891 876 +f 874 893 892 875 +f 873 894 893 874 +f 872 895 894 873 +f 871 896 895 872 +f 870 897 896 871 +f 869 898 897 870 +f 868 899 898 869 +f 899 900 901 898 +f 898 901 902 897 +f 897 902 903 896 +f 896 903 904 895 +f 895 904 905 894 +f 894 905 906 893 +f 893 906 907 892 +f 892 907 908 891 +f 891 908 909 890 +f 890 909 910 889 +f 889 910 911 888 +f 888 911 912 887 +f 887 912 913 886 +f 886 913 914 885 +f 885 914 915 884 +f 884 915 641 +f 915 916 641 +f 914 432 916 915 +f 913 917 432 914 +f 912 433 917 913 +f 911 918 433 912 +f 910 919 918 911 +f 909 920 919 910 +f 908 921 920 909 +f 907 922 921 908 +f 906 923 922 907 +f 905 924 923 906 +f 904 925 924 905 +f 903 926 925 904 +f 902 927 926 903 +f 901 928 927 902 +f 900 929 928 901 +f 32 1 930 +f 31 32 930 +f 30 31 930 +f 30 29 930 +f 28 29 930 +f 27 28 930 +f 26 27 930 +f 26 25 930 +f 24 25 930 +f 24 23 930 +f 22 23 930 +f 21 22 930 +f 20 21 930 +f 20 19 930 +f 18 19 930 +f 18 17 930 +f 16 17 930 +f 16 15 930 +f 14 15 930 +f 14 13 930 +f 12 13 930 +f 11 12 930 +f 10 11 930 +f 10 9 930 +f 9 8 930 +f 7 8 930 +f 7 6 930 +f 5 6 930 +f 5 4 930 +f 3 4 930 +f 3 2 930 +f 2 1 930 +f 1026 160 129 995 +f 1025 159 160 1026 +f 1024 158 159 1025 +f 1023 157 158 1024 +f 1022 156 157 1023 +f 1021 155 156 1022 +f 1020 154 155 1021 +f 1019 153 154 1020 +f 1018 152 153 1019 +f 1017 151 152 1018 +f 1016 150 151 1017 +f 1015 149 150 1016 +f 1014 148 149 1015 +f 1013 147 148 1014 +f 1012 146 147 1013 +f 1011 145 146 1012 +f 1010 144 145 1011 +f 1009 143 144 1010 +f 1008 142 143 1009 +f 1007 141 142 1008 +f 1006 140 141 1007 +f 1005 139 140 1006 +f 1004 138 139 1005 +f 1003 137 138 1004 +f 1002 136 137 1003 +f 1001 135 136 1002 +f 1000 134 135 1001 +f 999 133 134 1000 +f 998 132 133 999 +f 997 131 132 998 +f 996 130 131 997 +f 995 129 130 996 +f 994 96 65 963 +f 993 95 96 994 +f 992 94 95 993 +f 991 93 94 992 +f 990 92 93 991 +f 989 91 92 990 +f 988 90 91 989 +f 987 89 90 988 +f 986 88 89 987 +f 985 87 88 986 +f 984 86 87 985 +f 983 85 86 984 +f 982 84 85 983 +f 981 83 84 982 +f 980 82 83 981 +f 979 81 82 980 +f 978 80 81 979 +f 977 79 80 978 +f 976 78 79 977 +f 975 77 78 976 +f 974 76 77 975 +f 973 75 76 974 +f 972 74 75 973 +f 971 73 74 972 +f 970 72 73 971 +f 969 71 72 970 +f 968 70 71 969 +f 967 69 70 968 +f 966 68 69 967 +f 965 67 68 966 +f 964 66 67 965 +f 963 65 66 964 +f 931 1059 1060 962 +f 962 1060 1061 961 +f 961 1061 1062 960 +f 960 1062 1063 959 +f 959 1063 1064 958 +f 958 1064 1065 957 +f 957 1065 1066 956 +f 956 1066 1067 955 +f 955 1067 1068 954 +f 954 1068 1069 953 +f 953 1069 1070 952 +f 952 1070 1071 951 +f 951 1071 1072 950 +f 950 1072 1073 949 +f 949 1073 1074 948 +f 948 1074 1075 947 +f 947 1075 1076 946 +f 946 1076 1077 945 +f 945 1077 1078 944 +f 944 1078 1079 943 +f 943 1079 1080 942 +f 942 1080 1081 941 +f 941 1081 1082 940 +f 940 1082 1083 939 +f 939 1083 1084 938 +f 938 1084 1085 937 +f 937 1085 1086 936 +f 936 1086 1087 935 +f 935 1087 1088 934 +f 934 1088 1089 933 +f 933 1089 1090 932 +f 932 1090 1059 931 +f 1090 33 64 1059 +f 1089 34 33 1090 +f 1088 35 34 1089 +f 1087 36 35 1088 +f 1086 37 36 1087 +f 1085 38 37 1086 +f 1084 39 38 1085 +f 1083 40 39 1084 +f 1082 41 40 1083 +f 1081 42 41 1082 +f 1080 43 42 1081 +f 1079 44 43 1080 +f 1078 45 44 1079 +f 1077 46 45 1078 +f 1076 47 46 1077 +f 1075 48 47 1076 +f 1074 49 48 1075 +f 1073 50 49 1074 +f 1072 51 50 1073 +f 1071 52 51 1072 +f 1070 53 52 1071 +f 1069 54 53 1070 +f 1068 55 54 1069 +f 1067 56 55 1068 +f 1066 57 56 1067 +f 1065 58 57 1066 +f 1064 59 58 1065 +f 1063 60 59 1064 +f 1062 61 60 1063 +f 1061 62 61 1062 +f 1060 63 62 1061 +f 1059 64 63 1060 +f 1027 128 127 1058 +f 1058 127 126 1057 +f 1057 126 125 1056 +f 1056 125 124 1055 +f 1055 124 123 1054 +f 1054 123 122 1053 +f 1053 122 121 1052 +f 1052 121 120 1051 +f 1051 120 119 1050 +f 1050 119 118 1049 +f 1049 118 117 1048 +f 1048 117 116 1047 +f 1047 116 115 1046 +f 1046 115 114 1045 +f 1045 114 113 1044 +f 1044 113 112 1043 +f 1043 112 111 1042 +f 1042 111 110 1041 +f 1041 110 109 1040 +f 1040 109 108 1039 +f 1039 108 107 1038 +f 1038 107 106 1037 +f 1037 106 105 1036 +f 1036 105 104 1035 +f 1035 104 103 1034 +f 1034 103 102 1033 +f 1033 102 101 1032 +f 1032 101 100 1031 +f 1031 100 99 1030 +f 1030 99 98 1029 +f 1029 98 97 1028 +f 1028 97 128 1027 diff --git a/Graph3D/Chess3D/rook.obj b/Graph3D/Chess3D/rook.obj new file mode 100644 index 0000000..25598a1 --- /dev/null +++ b/Graph3D/Chess3D/rook.obj @@ -0,0 +1,1542 @@ +# Blender3D v245 OBJ File: chess2.blend +# www.blender3d.org +v 7.600000 -6.400000 0.000000 +v 7.705525 -6.528583 0.000000 +v 7.783938 -6.675282 0.000000 +v 7.832224 -6.834460 0.000000 +v 7.848528 -7.000000 0.000000 +v 7.832224 -7.165540 0.000000 +v 7.783938 -7.324718 0.000000 +v 7.705525 -7.471417 0.000000 +v 7.600000 -7.600000 0.000000 +v 7.471417 -7.705525 0.000000 +v 7.324718 -7.783938 0.000000 +v 7.165539 -7.832224 0.000000 +v 7.000000 -7.848528 0.000000 +v 6.834460 -7.832224 0.000000 +v 6.675282 -7.783937 0.000000 +v 6.528583 -7.705525 0.000000 +v 6.400000 -7.599999 0.000000 +v 6.294474 -7.471416 0.000000 +v 6.216062 -7.324717 0.000000 +v 6.167776 -7.165539 0.000000 +v 6.151472 -6.999999 0.000000 +v 6.167776 -6.834459 0.000000 +v 6.216063 -6.675282 0.000000 +v 6.294475 -6.528582 0.000000 +v 6.400001 -6.399999 0.000000 +v 6.528584 -6.294474 0.000000 +v 6.675283 -6.216062 0.000000 +v 6.834462 -6.167776 0.000000 +v 7.000001 -6.151472 0.000000 +v 7.165541 -6.167777 0.000000 +v 7.324719 -6.216063 0.000000 +v 7.471418 -6.294476 0.000000 +v 7.471418 -6.294476 0.123118 +v 7.324719 -6.216063 0.123118 +v 7.165541 -6.167777 0.123118 +v 7.000001 -6.151472 0.123118 +v 6.834462 -6.167776 0.123118 +v 6.675283 -6.216062 0.123118 +v 6.528584 -6.294474 0.123118 +v 6.400001 -6.399999 0.123118 +v 6.294475 -6.528582 0.123118 +v 6.216063 -6.675282 0.123118 +v 6.167776 -6.834459 0.123118 +v 6.151472 -6.999999 0.123118 +v 6.167776 -7.165539 0.123118 +v 6.216062 -7.324717 0.123118 +v 6.294474 -7.471416 0.123118 +v 6.400000 -7.599999 0.123118 +v 6.528583 -7.705525 0.123118 +v 6.675282 -7.783937 0.123118 +v 6.834460 -7.832224 0.123118 +v 7.000000 -7.848528 0.123118 +v 7.165539 -7.832224 0.123118 +v 7.324718 -7.783938 0.123118 +v 7.471417 -7.705525 0.123118 +v 7.600000 -7.600000 0.123118 +v 7.705525 -7.471417 0.123118 +v 7.783938 -7.324718 0.123118 +v 7.832224 -7.165540 0.123118 +v 7.848528 -7.000000 0.123118 +v 7.832224 -6.834460 0.123118 +v 7.783938 -6.675282 0.123118 +v 7.705525 -6.528583 0.123118 +v 7.600000 -6.400000 0.123118 +v 7.300000 -6.700000 0.323118 +v 7.352763 -6.764292 0.323118 +v 7.391969 -6.837641 0.323118 +v 7.416112 -6.917230 0.323118 +v 7.424264 -7.000000 0.323118 +v 7.416112 -7.082770 0.323118 +v 7.391969 -7.162359 0.323118 +v 7.352763 -7.235708 0.323118 +v 7.300000 -7.300000 0.323118 +v 7.235708 -7.352763 0.323118 +v 7.162359 -7.391969 0.323118 +v 7.082770 -7.416112 0.323118 +v 7.000000 -7.424264 0.323118 +v 6.917230 -7.416112 0.323118 +v 6.837641 -7.391969 0.323118 +v 6.764291 -7.352763 0.323118 +v 6.700000 -7.300000 0.323118 +v 6.647237 -7.235708 0.323118 +v 6.608031 -7.162358 0.323118 +v 6.583888 -7.082769 0.323118 +v 6.575736 -7.000000 0.323118 +v 6.583888 -6.917230 0.323118 +v 6.608031 -6.837641 0.323118 +v 6.647238 -6.764291 0.323118 +v 6.700000 -6.700000 0.323118 +v 6.764292 -6.647237 0.323118 +v 6.837642 -6.608031 0.323118 +v 6.917231 -6.583888 0.323118 +v 7.000000 -6.575736 0.323118 +v 7.082770 -6.583888 0.323118 +v 7.162360 -6.608031 0.323118 +v 7.235709 -6.647238 0.323118 +v 7.499945 -6.500055 0.223118 +v 7.587873 -6.607196 0.223118 +v 7.653209 -6.729432 0.223118 +v 7.693443 -6.862066 0.223118 +v 7.707028 -7.000000 0.223118 +v 7.693443 -7.137934 0.223118 +v 7.653209 -7.270568 0.223118 +v 7.587873 -7.392804 0.223118 +v 7.499945 -7.499945 0.223118 +v 7.392804 -7.587873 0.223118 +v 7.270568 -7.653209 0.223118 +v 7.137934 -7.693443 0.223118 +v 7.000000 -7.707028 0.223118 +v 6.862065 -7.693443 0.223118 +v 6.729432 -7.653209 0.223118 +v 6.607196 -7.587873 0.223118 +v 6.500055 -7.499944 0.223118 +v 6.412127 -7.392803 0.223118 +v 6.346791 -7.270567 0.223118 +v 6.306557 -7.137934 0.223118 +v 6.292972 -7.000000 0.223118 +v 6.306557 -6.862065 0.223118 +v 6.346791 -6.729431 0.223118 +v 6.412128 -6.607195 0.223118 +v 6.500056 -6.500055 0.223118 +v 6.607197 -6.412127 0.223118 +v 6.729433 -6.346791 0.223118 +v 6.862067 -6.306557 0.223118 +v 7.000001 -6.292972 0.223118 +v 7.137936 -6.306557 0.223118 +v 7.270569 -6.346791 0.223118 +v 7.392805 -6.412128 0.223118 +v 7.457335 -6.542665 0.173118 +v 7.400127 -6.599873 0.256465 +v 7.314379 -6.529500 0.256465 +v 7.359326 -6.462232 0.173118 +v 7.247509 -6.402464 0.173118 +v 7.216548 -6.477209 0.256465 +v 7.110396 -6.445008 0.256465 +v 7.126179 -6.365659 0.173118 +v 7.000001 -6.353231 0.173118 +v 7.000001 -6.434134 0.256465 +v 6.873823 -6.365658 0.173118 +v 6.889606 -6.445007 0.256465 +v 6.783453 -6.477208 0.256465 +v 6.752493 -6.402463 0.173118 +v 6.640675 -6.462231 0.173118 +v 6.685623 -6.529500 0.256465 +v 6.599873 -6.599872 0.256465 +v 6.542666 -6.542665 0.173118 +v 6.529500 -6.685621 0.256465 +v 6.462232 -6.640674 0.173118 +v 6.402464 -6.752491 0.173118 +v 6.477209 -6.783452 0.256465 +v 6.365659 -6.873821 0.173118 +v 6.445008 -6.889605 0.256465 +v 6.434134 -7.000000 0.256465 +v 6.353231 -7.000000 0.173118 +v 6.445007 -7.110394 0.256465 +v 6.365659 -7.126178 0.173118 +v 6.402463 -7.247507 0.173118 +v 6.477208 -7.216547 0.256465 +v 6.462231 -7.359325 0.173118 +v 6.529500 -7.314378 0.256465 +v 6.542665 -7.457335 0.173118 +v 6.599873 -7.400127 0.256465 +v 6.640674 -7.537768 0.173118 +v 6.685622 -7.470500 0.256465 +v 6.752492 -7.597537 0.173118 +v 6.783453 -7.522791 0.256465 +v 6.889605 -7.554993 0.256465 +v 6.873821 -7.634341 0.173118 +v 7.000000 -7.646769 0.173118 +v 7.000000 -7.565866 0.256465 +v 7.110395 -7.554993 0.256465 +v 7.126178 -7.634341 0.173118 +v 7.247508 -7.597537 0.173118 +v 7.216547 -7.522791 0.256465 +v 7.359325 -7.537769 0.173118 +v 7.314378 -7.470500 0.256465 +v 7.400127 -7.400127 0.256465 +v 7.457335 -7.457335 0.173118 +v 7.470500 -7.314378 0.256465 +v 7.537769 -7.359325 0.173118 +v 7.597537 -7.247508 0.173118 +v 7.522791 -7.216547 0.256465 +v 7.554993 -7.110395 0.256465 +v 7.634341 -7.126178 0.173118 +v 7.565866 -7.000000 0.256465 +v 7.646769 -7.000000 0.173118 +v 7.554993 -6.889605 0.256465 +v 7.634341 -6.873822 0.173118 +v 7.597537 -6.752492 0.173118 +v 7.522791 -6.783453 0.256465 +v 7.470500 -6.685622 0.256465 +v 7.537769 -6.640675 0.173118 +v 7.190925 -6.714262 1.400000 +v 7.131511 -6.682506 1.400000 +v 7.067044 -6.662950 1.400000 +v 7.000000 -6.656346 1.400000 +v 6.932957 -6.662949 1.400000 +v 6.868490 -6.682505 1.400000 +v 6.809076 -6.714262 1.400000 +v 6.757000 -6.756999 1.400000 +v 6.714262 -6.809076 1.400000 +v 6.682505 -6.868489 1.400000 +v 6.662950 -6.932956 1.400000 +v 6.656346 -7.000000 1.400000 +v 6.662949 -7.067043 1.400000 +v 6.682505 -7.131510 1.400000 +v 6.714262 -7.190924 1.400000 +v 6.757000 -7.243000 1.400000 +v 6.809076 -7.285738 1.400000 +v 6.868489 -7.317495 1.400000 +v 6.932956 -7.337050 1.400000 +v 7.000000 -7.343654 1.400000 +v 7.067043 -7.337051 1.400000 +v 7.131511 -7.317495 1.400000 +v 7.190924 -7.285738 1.400000 +v 7.243000 -7.243000 1.400000 +v 7.285738 -7.190924 1.400000 +v 7.317495 -7.131511 1.400000 +v 7.337051 -7.067043 1.400000 +v 7.343654 -7.000000 1.400000 +v 7.337050 -6.932956 1.400000 +v 7.317495 -6.868489 1.400000 +v 7.285738 -6.809076 1.400000 +v 7.243000 -6.757000 1.400000 +v 7.379080 -6.620920 1.398646 +v 7.445751 -6.702159 1.398646 +v 7.495292 -6.794843 1.398646 +v 7.525799 -6.895412 1.398646 +v 7.536100 -7.000000 1.398646 +v 7.525799 -7.104588 1.398646 +v 7.495292 -7.205156 1.398646 +v 7.445751 -7.297841 1.398646 +v 7.379080 -7.379080 1.398646 +v 7.297841 -7.445751 1.398646 +v 7.205156 -7.495292 1.398646 +v 7.104588 -7.525799 1.398646 +v 7.000000 -7.536100 1.398646 +v 6.895412 -7.525799 1.398646 +v 6.794843 -7.495292 1.398646 +v 6.702158 -7.445751 1.398646 +v 6.620920 -7.379080 1.398646 +v 6.554249 -7.297841 1.398646 +v 6.504708 -7.205156 1.398646 +v 6.474201 -7.104588 1.398646 +v 6.463900 -7.000000 1.398646 +v 6.474201 -6.895411 1.398646 +v 6.504708 -6.794843 1.398646 +v 6.554249 -6.702158 1.398646 +v 6.620920 -6.620919 1.398646 +v 6.702159 -6.554249 1.398646 +v 6.794844 -6.504708 1.398646 +v 6.895413 -6.474201 1.398646 +v 7.000001 -6.463900 1.398646 +v 7.104589 -6.474201 1.398646 +v 7.205158 -6.504708 1.398646 +v 7.297842 -6.554250 1.398646 +v 7.339530 -6.491860 1.548626 +v 7.233872 -6.435385 1.548626 +v 7.119227 -6.400608 1.548626 +v 7.000001 -6.388865 1.548626 +v 6.880774 -6.400608 1.548626 +v 6.766129 -6.435384 1.548626 +v 6.660472 -6.491859 1.548626 +v 6.567863 -6.567862 1.548626 +v 6.491860 -6.660471 1.548626 +v 6.435385 -6.766128 1.548626 +v 6.400608 -6.880773 1.548626 +v 6.388865 -7.000000 1.548626 +v 6.400608 -7.119226 1.548626 +v 6.435385 -7.233871 1.548626 +v 6.491859 -7.339528 1.548626 +v 6.567862 -7.432137 1.548626 +v 6.660471 -7.508140 1.548626 +v 6.766129 -7.564615 1.548626 +v 6.880773 -7.599392 1.548626 +v 7.000000 -7.611135 1.548626 +v 7.119226 -7.599392 1.548626 +v 7.233871 -7.564615 1.548626 +v 7.339529 -7.508140 1.548626 +v 7.432137 -7.432137 1.548626 +v 7.508140 -7.339529 1.548626 +v 7.564615 -7.233871 1.548626 +v 7.599392 -7.119226 1.548626 +v 7.611135 -7.000000 1.548626 +v 7.599392 -6.880774 1.548626 +v 7.564615 -6.766129 1.548626 +v 7.508140 -6.660471 1.548626 +v 7.432137 -6.567863 1.548626 +v 7.412818 -6.587182 1.698646 +v 7.485423 -6.675651 1.698646 +v 7.539373 -6.776584 1.698646 +v 7.572595 -6.886104 1.698646 +v 7.583813 -7.000000 1.698646 +v 7.572595 -7.113896 1.698646 +v 7.539373 -7.223415 1.698646 +v 7.485423 -7.324349 1.698646 +v 7.412818 -7.412818 1.698646 +v 7.324349 -7.485423 1.698646 +v 7.223415 -7.539373 1.698646 +v 7.113896 -7.572595 1.698646 +v 7.000000 -7.583813 1.698646 +v 6.886104 -7.572595 1.698646 +v 6.776584 -7.539373 1.698646 +v 6.675651 -7.485423 1.698646 +v 6.587182 -7.412818 1.698646 +v 6.514577 -7.324349 1.698646 +v 6.460627 -7.223415 1.698646 +v 6.427404 -7.113896 1.698646 +v 6.416187 -7.000000 1.698646 +v 6.427405 -6.886103 1.698646 +v 6.460627 -6.776584 1.698646 +v 6.514577 -6.675650 1.698646 +v 6.587182 -6.587181 1.698646 +v 6.675652 -6.514577 1.698646 +v 6.776585 -6.460627 1.698646 +v 6.886105 -6.427404 1.698646 +v 7.000001 -6.416187 1.698646 +v 7.113897 -6.427405 1.698646 +v 7.223416 -6.460628 1.698646 +v 7.324350 -6.514578 1.698646 +v 7.294864 -6.558707 2.498646 +v 7.203106 -6.509661 2.498646 +v 7.103543 -6.479459 2.198646 +v 7.000001 -6.469261 2.198646 +v 6.896459 -6.479459 2.198646 +v 6.796896 -6.509661 2.498646 +v 6.705138 -6.558706 2.498646 +v 6.624711 -6.624710 2.498646 +v 6.558707 -6.705136 2.498646 +v 6.509661 -6.796895 2.498646 +v 6.479459 -6.896457 2.198646 +v 6.469261 -7.000000 2.198646 +v 6.479459 -7.103542 2.198646 +v 6.509661 -7.203104 2.498646 +v 6.558706 -7.294863 2.498646 +v 6.624711 -7.375289 2.498646 +v 6.705137 -7.441293 2.498646 +v 6.796895 -7.490339 2.498646 +v 6.896458 -7.520541 2.198646 +v 7.000000 -7.530739 2.198646 +v 7.103542 -7.520541 2.198646 +v 7.203105 -7.490339 2.498646 +v 7.294863 -7.441294 2.498646 +v 7.375289 -7.375289 2.498646 +v 7.441294 -7.294863 2.498646 +v 7.490339 -7.203105 2.498646 +v 7.520541 -7.103542 2.198646 +v 7.530739 -7.000000 2.198646 +v 7.520541 -6.896458 2.198646 +v 7.490339 -6.796895 2.498646 +v 7.441294 -6.705137 2.498646 +v 7.375289 -6.624711 2.498646 +v 7.300231 -6.699769 2.498646 +v 7.353035 -6.764110 2.498646 +v 7.392271 -6.837516 2.498646 +v 7.416433 -6.917166 2.198646 +v 7.424592 -7.000000 2.198646 +v 7.416433 -7.082834 2.198646 +v 7.392272 -7.162484 2.498646 +v 7.353035 -7.235890 2.498646 +v 7.300231 -7.300231 2.498646 +v 7.235890 -7.353035 2.498646 +v 7.162484 -7.392272 2.498646 +v 7.082834 -7.416433 2.198646 +v 7.000000 -7.424592 2.198646 +v 6.917166 -7.416433 2.198646 +v 6.837516 -7.392271 2.498646 +v 6.764110 -7.353035 2.498646 +v 6.699769 -7.300231 2.498646 +v 6.646965 -7.235890 2.498646 +v 6.607728 -7.162484 2.498646 +v 6.583567 -7.082833 2.198646 +v 6.575408 -7.000000 2.198646 +v 6.583567 -6.917166 2.198646 +v 6.607729 -6.837515 2.498646 +v 6.646966 -6.764109 2.498646 +v 6.699769 -6.699768 2.498646 +v 6.764110 -6.646965 2.498646 +v 6.837516 -6.607728 2.498646 +v 6.917167 -6.583567 2.198646 +v 7.000000 -6.575408 2.198646 +v 7.082834 -6.583567 2.198646 +v 7.162485 -6.607729 2.498646 +v 7.235891 -6.646966 2.498646 +v 7.235891 -6.646966 2.398646 +v 7.162485 -6.607729 2.398646 +v 7.082834 -6.583567 2.098646 +v 7.000000 -6.575408 2.098646 +v 6.917167 -6.583567 2.098646 +v 6.837516 -6.607728 2.398646 +v 6.764110 -6.646965 2.398646 +v 6.699769 -6.699768 2.398646 +v 6.646966 -6.764109 2.398646 +v 6.607729 -6.837515 2.398646 +v 6.583567 -6.917166 2.098646 +v 6.575408 -7.000000 2.098646 +v 6.583567 -7.082833 2.098646 +v 6.607728 -7.162484 2.398646 +v 6.646965 -7.235890 2.398646 +v 6.699769 -7.300231 2.398646 +v 6.764110 -7.353035 2.398646 +v 6.837516 -7.392271 2.398646 +v 6.917166 -7.416433 2.098646 +v 7.000000 -7.424592 2.098646 +v 7.082834 -7.416433 2.098646 +v 7.162484 -7.392272 2.398646 +v 7.235890 -7.353035 2.398646 +v 7.300231 -7.300231 2.398646 +v 7.353035 -7.235890 2.398646 +v 7.392272 -7.162484 2.398646 +v 7.416433 -7.082834 2.098646 +v 7.424592 -7.000000 2.098646 +v 7.416433 -6.917166 2.098646 +v 7.392271 -6.837516 2.398646 +v 7.353035 -6.764110 2.398646 +v 7.300231 -6.699769 2.398646 +v 7.300231 -6.699769 1.798646 +v 7.353035 -6.764110 1.798646 +v 7.392271 -6.837516 1.798646 +v 7.416433 -6.917166 1.798646 +v 7.424592 -7.000000 1.798646 +v 7.416433 -7.082834 1.798646 +v 7.392272 -7.162484 1.798646 +v 7.353035 -7.235890 1.798646 +v 7.300231 -7.300231 1.798646 +v 7.235890 -7.353035 1.798646 +v 7.162484 -7.392272 1.798646 +v 7.082834 -7.416433 1.798646 +v 7.000000 -7.424592 1.798646 +v 6.917166 -7.416433 1.798646 +v 6.837516 -7.392271 1.798646 +v 6.764110 -7.353035 1.798646 +v 6.699769 -7.300231 1.798646 +v 6.646965 -7.235890 1.798646 +v 6.607728 -7.162484 1.798646 +v 6.583567 -7.082833 1.798646 +v 6.575408 -7.000000 1.798646 +v 6.583567 -6.917166 1.798646 +v 6.607729 -6.837515 1.798646 +v 6.646966 -6.764109 1.798646 +v 6.699769 -6.699768 1.798646 +v 6.764110 -6.646965 1.798646 +v 6.837516 -6.607728 1.798646 +v 6.917167 -6.583567 1.798646 +v 7.000000 -6.575408 1.798646 +v 7.082834 -6.583567 1.798646 +v 7.162485 -6.607729 1.798646 +v 7.235891 -6.646966 1.798646 +v 7.000000 -7.000000 1.798646 +v 7.000000 -7.000000 0.000000 +v 7.396139 -6.603861 1.648646 +v 7.465810 -6.688756 1.648646 +v 7.517580 -6.785611 1.648646 +v 7.549460 -6.890706 1.648646 +v 7.560225 -7.000000 1.648646 +v 7.549460 -7.109294 1.648646 +v 7.517580 -7.214389 1.648646 +v 7.465810 -7.311244 1.648646 +v 7.396139 -7.396139 1.648646 +v 7.311244 -7.465810 1.648646 +v 7.214389 -7.517580 1.648646 +v 7.109294 -7.549460 1.648646 +v 7.000000 -7.560225 1.648646 +v 6.890706 -7.549460 1.648646 +v 6.785611 -7.517580 1.648646 +v 6.688756 -7.465810 1.648646 +v 6.603861 -7.396138 1.648646 +v 6.534190 -7.311244 1.648646 +v 6.482419 -7.214388 1.648646 +v 6.450540 -7.109294 1.648646 +v 6.439775 -7.000000 1.648646 +v 6.450540 -6.890705 1.648646 +v 6.482420 -6.785611 1.648646 +v 6.534191 -6.688755 1.648646 +v 6.603862 -6.603861 1.648646 +v 6.688756 -6.534190 1.648646 +v 6.785612 -6.482419 1.648646 +v 6.890707 -6.450540 1.648646 +v 7.000001 -6.439775 1.648646 +v 7.109295 -6.450540 1.648646 +v 7.214390 -6.482420 1.648646 +v 7.311245 -6.534191 1.648646 +v 7.398034 -6.601966 1.448646 +v 7.312734 -6.531962 1.448646 +v 7.215415 -6.479944 1.448646 +v 7.109818 -6.447911 1.448646 +v 7.000001 -6.437095 1.448646 +v 6.890183 -6.447911 1.448646 +v 6.784586 -6.479943 1.448646 +v 6.687267 -6.531961 1.448646 +v 6.601966 -6.601965 1.448646 +v 6.531962 -6.687266 1.448646 +v 6.479944 -6.784585 1.448646 +v 6.447911 -6.890182 1.448646 +v 6.437095 -7.000000 1.448646 +v 6.447911 -7.109817 1.448646 +v 6.479943 -7.215414 1.448646 +v 6.531961 -7.312733 1.448646 +v 6.601966 -7.398034 1.448646 +v 6.687266 -7.468039 1.448646 +v 6.784585 -7.520057 1.448646 +v 6.890182 -7.552089 1.448646 +v 7.000000 -7.562905 1.448646 +v 7.109817 -7.552089 1.448646 +v 7.215415 -7.520057 1.448646 +v 7.312733 -7.468039 1.448646 +v 7.398034 -7.398034 1.448646 +v 7.468039 -7.312733 1.448646 +v 7.520057 -7.215415 1.448646 +v 7.552089 -7.109818 1.448646 +v 7.562905 -7.000000 1.448646 +v 7.552089 -6.890182 1.448646 +v 7.520057 -6.784585 1.448646 +v 7.468039 -6.687267 1.448646 +v 7.335076 -6.591709 2.498646 +v 7.248985 -6.534184 2.498646 +v 7.153325 -6.494560 2.348646 +v 7.051772 -6.474360 2.198646 +v 6.948230 -6.474360 2.198646 +v 6.846677 -6.494560 2.348646 +v 6.751017 -6.534184 2.498646 +v 6.664925 -6.591708 2.498646 +v 6.591709 -6.664923 2.498646 +v 6.534184 -6.751016 2.498646 +v 6.494560 -6.846676 2.348646 +v 6.474360 -6.948228 2.198646 +v 6.474360 -7.051771 2.198646 +v 6.494560 -7.153323 2.348646 +v 6.534184 -7.248984 2.498646 +v 6.591708 -7.335076 2.498646 +v 6.664924 -7.408291 2.498646 +v 6.751016 -7.465816 2.498646 +v 6.846676 -7.505440 2.348646 +v 6.948229 -7.525640 2.198646 +v 7.051771 -7.525640 2.198646 +v 7.153324 -7.505440 2.348646 +v 7.248984 -7.465816 2.498646 +v 7.335076 -7.408291 2.498646 +v 7.408291 -7.335076 2.498646 +v 7.465816 -7.248984 2.498646 +v 7.505440 -7.153324 2.348646 +v 7.525640 -7.051771 2.198646 +v 7.525640 -6.948229 2.198646 +v 7.505440 -6.846676 2.348646 +v 7.465816 -6.751016 2.498646 +v 7.408291 -6.664924 2.498646 +v 7.337760 -6.662240 2.498646 +v 7.326633 -6.731939 2.498646 +v 7.397164 -6.734623 2.498646 +v 7.372653 -6.800813 2.498646 +v 7.441305 -6.817205 2.498646 +v 7.404352 -6.877341 2.348646 +v 7.468487 -6.906812 2.198646 +v 7.420512 -6.958583 2.198646 +v 7.477665 -7.000000 2.198646 +v 7.420512 -7.041417 2.198646 +v 7.468487 -7.093188 2.198646 +v 7.404352 -7.122659 2.348646 +v 7.441305 -7.182795 2.498646 +v 7.372653 -7.199187 2.498646 +v 7.397164 -7.265377 2.498646 +v 7.326633 -7.268061 2.498646 +v 7.337760 -7.337760 2.498646 +v 7.268061 -7.326633 2.498646 +v 7.265377 -7.397164 2.498646 +v 7.199187 -7.372653 2.498646 +v 7.182795 -7.441305 2.498646 +v 7.122659 -7.404352 2.348646 +v 7.093188 -7.468487 2.198646 +v 7.041417 -7.420512 2.198646 +v 7.000000 -7.477665 2.198646 +v 6.958583 -7.420512 2.198646 +v 6.906812 -7.468487 2.198646 +v 6.877341 -7.404352 2.348646 +v 6.817205 -7.441305 2.498646 +v 6.800813 -7.372653 2.498646 +v 6.734623 -7.397164 2.498646 +v 6.731939 -7.326633 2.498646 +v 6.662240 -7.337760 2.498646 +v 6.673367 -7.268061 2.498646 +v 6.602836 -7.265376 2.498646 +v 6.627347 -7.199187 2.498646 +v 6.558695 -7.182794 2.498646 +v 6.595648 -7.122659 2.348646 +v 6.531513 -7.093187 2.198646 +v 6.579488 -7.041417 2.198646 +v 6.522335 -7.000000 2.198646 +v 6.579488 -6.958583 2.198646 +v 6.531513 -6.906812 2.198646 +v 6.595648 -6.877341 2.348646 +v 6.558695 -6.817205 2.498646 +v 6.627347 -6.800812 2.498646 +v 6.602836 -6.734623 2.498646 +v 6.673367 -6.731939 2.498646 +v 6.662240 -6.662239 2.498646 +v 6.731939 -6.673367 2.498646 +v 6.734624 -6.602836 2.498646 +v 6.800813 -6.627347 2.498646 +v 6.817206 -6.558694 2.498646 +v 6.877342 -6.595648 2.348646 +v 6.906813 -6.531513 2.198646 +v 6.958584 -6.579488 2.198646 +v 7.000001 -6.522335 2.198646 +v 7.041418 -6.579488 2.198646 +v 7.093189 -6.531513 2.198646 +v 7.122660 -6.595648 2.348646 +v 7.182796 -6.558695 2.498646 +v 7.199188 -6.627347 2.498646 +v 7.265378 -6.602836 2.498646 +v 7.268061 -6.673367 2.498646 +v 7.301569 -6.632538 2.498646 +v 7.224086 -6.580766 2.498646 +v 7.137992 -6.545104 2.348646 +v 7.046595 -6.526924 2.198646 +v 6.953407 -6.526924 2.198646 +v 6.862010 -6.545104 2.348646 +v 6.775915 -6.580765 2.498646 +v 6.698432 -6.632537 2.498646 +v 6.632538 -6.698431 2.498646 +v 6.580766 -6.775914 2.498646 +v 6.545104 -6.862008 2.348646 +v 6.526924 -6.953405 2.198646 +v 6.526924 -7.046594 2.198646 +v 6.545104 -7.137991 2.348646 +v 6.580765 -7.224085 2.498646 +v 6.632537 -7.301568 2.498646 +v 6.698431 -7.367462 2.498646 +v 6.775914 -7.419235 2.498646 +v 6.862009 -7.454896 2.348646 +v 6.953406 -7.473076 2.198646 +v 7.046594 -7.473076 2.198646 +v 7.137991 -7.454896 2.348646 +v 7.224085 -7.419235 2.498646 +v 7.301569 -7.367462 2.498646 +v 7.367462 -7.301569 2.498646 +v 7.419235 -7.224085 2.498646 +v 7.454896 -7.137991 2.348646 +v 7.473076 -7.046594 2.198646 +v 7.473076 -6.953406 2.198646 +v 7.454896 -6.862009 2.348646 +v 7.419235 -6.775914 2.498646 +v 7.367462 -6.698431 2.498646 +v 7.600000 -6.400000 0.030734 +v 7.471418 -6.294476 0.030734 +v 7.324719 -6.216063 0.030734 +v 7.165541 -6.167777 0.030734 +v 7.000001 -6.151472 0.030734 +v 6.834462 -6.167776 0.030734 +v 6.675283 -6.216062 0.030734 +v 6.528584 -6.294474 0.030734 +v 6.400001 -6.399999 0.030734 +v 6.294475 -6.528582 0.030734 +v 6.216063 -6.675282 0.030734 +v 6.167776 -6.834459 0.030734 +v 6.151472 -6.999999 0.030734 +v 6.167776 -7.165539 0.030734 +v 6.216062 -7.324717 0.030734 +v 6.294474 -7.471416 0.030734 +v 6.400000 -7.599999 0.030734 +v 6.528583 -7.705525 0.030734 +v 6.675282 -7.783937 0.030734 +v 6.834460 -7.832224 0.030734 +v 7.000000 -7.848528 0.030734 +v 7.165539 -7.832224 0.030734 +v 7.324718 -7.783938 0.030734 +v 7.471417 -7.705525 0.030734 +v 7.600000 -7.600000 0.030734 +v 7.705525 -7.471417 0.030734 +v 7.783938 -7.324718 0.030734 +v 7.832224 -7.165540 0.030734 +v 7.848528 -7.000000 0.030734 +v 7.832224 -6.834460 0.030734 +v 7.783938 -6.675282 0.030734 +v 7.705525 -6.528583 0.030734 +v 7.600000 -6.400000 0.101007 +v 7.471418 -6.294476 0.101007 +v 7.705525 -6.528583 0.101007 +v 7.783938 -6.675282 0.101007 +v 7.832224 -6.834460 0.101007 +v 7.848528 -7.000000 0.101007 +v 7.832224 -7.165540 0.101007 +v 7.783938 -7.324718 0.101007 +v 7.705525 -7.471417 0.101007 +v 7.600000 -7.600000 0.101007 +v 7.471417 -7.705525 0.101007 +v 7.324718 -7.783938 0.101007 +v 7.165539 -7.832224 0.101007 +v 7.000000 -7.848528 0.101007 +v 6.834460 -7.832224 0.101007 +v 6.675282 -7.783937 0.101007 +v 6.528583 -7.705525 0.101007 +v 6.400000 -7.599999 0.101007 +v 6.294474 -7.471416 0.101007 +v 6.216062 -7.324717 0.101007 +v 6.167776 -7.165539 0.101007 +v 6.151472 -6.999999 0.101007 +v 6.167776 -6.834459 0.101007 +v 6.216063 -6.675282 0.101007 +v 6.294475 -6.528582 0.101007 +v 6.400001 -6.399999 0.101007 +v 6.528584 -6.294474 0.101007 +v 6.675283 -6.216062 0.101007 +v 6.834462 -6.167776 0.101007 +v 7.000001 -6.151472 0.101007 +v 7.165541 -6.167777 0.101007 +v 7.324719 -6.216063 0.101007 +usemtl Material +s 1 +f 64 675 676 33 +f 31 645 644 32 +f 30 646 645 31 +f 30 29 647 646 +f 28 648 647 29 +f 27 649 648 28 +f 26 650 649 27 +f 26 25 651 650 +f 24 652 651 25 +f 24 23 653 652 +f 22 654 653 23 +f 21 655 654 22 +f 20 656 655 21 +f 20 19 657 656 +f 18 658 657 19 +f 18 17 659 658 +f 16 660 659 17 +f 16 15 661 660 +f 14 662 661 15 +f 14 13 663 662 +f 12 664 663 13 +f 11 665 664 12 +f 10 666 665 11 +f 10 9 667 666 +f 9 8 668 667 +f 7 669 668 8 +f 7 6 670 669 +f 5 671 670 6 +f 5 4 672 671 +f 3 673 672 4 +f 3 2 674 673 +f 2 1 643 674 +f 63 64 129 192 +f 62 63 192 189 +f 62 189 188 61 +f 60 61 188 186 +f 60 186 184 59 +f 58 59 184 181 +f 58 181 180 57 +f 56 57 180 178 +f 55 56 178 175 +f 55 175 173 54 +f 54 173 172 53 +f 53 172 169 52 +f 51 52 169 168 +f 51 168 165 50 +f 49 50 165 163 +f 49 163 161 48 +f 47 48 161 159 +f 47 159 157 46 +f 45 46 157 156 +f 45 156 154 44 +f 44 154 151 43 +f 43 151 149 42 +f 41 42 149 148 +f 41 148 146 40 +f 39 40 146 143 +f 39 143 142 38 +f 38 142 139 37 +f 37 139 137 36 +f 35 36 137 136 +f 35 136 133 34 +f 34 133 132 33 +f 33 132 129 64 +f 97 128 131 130 +f 128 127 134 131 +f 127 126 135 134 +f 125 138 135 126 +f 125 124 140 138 +f 124 123 141 140 +f 123 122 144 141 +f 121 145 144 122 +f 121 120 147 145 +f 119 150 147 120 +f 119 118 152 150 +f 118 117 153 152 +f 117 116 155 153 +f 115 158 155 116 +f 115 114 160 158 +f 113 162 160 114 +f 113 112 164 162 +f 111 166 164 112 +f 111 110 167 166 +f 109 170 167 110 +f 109 108 171 170 +f 108 107 174 171 +f 107 106 176 174 +f 105 177 176 106 +f 104 179 177 105 +f 104 103 182 179 +f 102 183 182 103 +f 102 101 185 183 +f 100 187 185 101 +f 100 99 190 187 +f 98 191 190 99 +f 97 130 191 98 +f 130 65 66 191 +f 191 66 67 190 +f 187 190 67 68 +f 187 68 69 185 +f 183 185 69 70 +f 183 70 71 182 +f 179 182 71 72 +f 179 72 73 177 +f 177 73 74 176 +f 174 176 74 75 +f 171 174 75 76 +f 170 171 76 77 +f 170 77 78 167 +f 166 167 78 79 +f 166 79 80 164 +f 162 164 80 81 +f 162 81 82 160 +f 158 160 82 83 +f 158 83 84 155 +f 153 155 84 85 +f 152 153 85 86 +f 150 152 86 87 +f 150 87 88 147 +f 145 147 88 89 +f 145 89 90 144 +f 141 144 90 91 +f 140 141 91 92 +f 138 140 92 93 +f 138 93 94 135 +f 134 135 94 95 +f 131 134 95 96 +f 130 131 96 65 +f 129 132 128 97 +f 132 133 127 128 +f 133 136 126 127 +f 137 125 126 136 +f 137 139 124 125 +f 139 142 123 124 +f 142 143 122 123 +f 146 121 122 143 +f 146 148 120 121 +f 149 119 120 148 +f 149 151 118 119 +f 151 154 117 118 +f 154 156 116 117 +f 157 115 116 156 +f 157 159 114 115 +f 161 113 114 159 +f 161 163 112 113 +f 165 111 112 163 +f 165 168 110 111 +f 169 109 110 168 +f 169 172 108 109 +f 172 173 107 108 +f 173 175 106 107 +f 178 105 106 175 +f 180 104 105 178 +f 180 181 103 104 +f 184 102 103 181 +f 184 186 101 102 +f 188 100 101 186 +f 188 189 99 100 +f 192 98 99 189 +f 129 97 98 192 +f 96 193 224 65 +f 95 194 193 96 +f 94 195 194 95 +f 94 93 196 195 +f 92 197 196 93 +f 91 198 197 92 +f 90 199 198 91 +f 90 89 200 199 +f 88 201 200 89 +f 88 87 202 201 +f 86 203 202 87 +f 85 204 203 86 +f 84 205 204 85 +f 84 83 206 205 +f 82 207 206 83 +f 82 81 208 207 +f 80 209 208 81 +f 80 79 210 209 +f 78 211 210 79 +f 78 77 212 211 +f 76 213 212 77 +f 75 214 213 76 +f 74 215 214 75 +f 74 73 216 215 +f 73 72 217 216 +f 71 218 217 72 +f 71 70 219 218 +f 69 220 219 70 +f 69 68 221 220 +f 67 222 221 68 +f 67 66 223 222 +f 66 65 224 223 +f 223 224 225 226 +f 222 223 226 227 +f 222 227 228 221 +f 220 221 228 229 +f 220 229 230 219 +f 218 219 230 231 +f 218 231 232 217 +f 216 217 232 233 +f 215 216 233 234 +f 215 234 235 214 +f 214 235 236 213 +f 213 236 237 212 +f 211 212 237 238 +f 211 238 239 210 +f 209 210 239 240 +f 209 240 241 208 +f 207 208 241 242 +f 207 242 243 206 +f 205 206 243 244 +f 205 244 245 204 +f 204 245 246 203 +f 203 246 247 202 +f 201 202 247 248 +f 201 248 249 200 +f 199 200 249 250 +f 199 250 251 198 +f 198 251 252 197 +f 197 252 253 196 +f 195 196 253 254 +f 195 254 255 194 +f 194 255 256 193 +f 193 256 225 224 +f 256 484 483 225 +f 255 485 484 256 +f 254 486 485 255 +f 254 253 487 486 +f 252 488 487 253 +f 251 489 488 252 +f 250 490 489 251 +f 250 249 491 490 +f 248 492 491 249 +f 248 247 493 492 +f 246 494 493 247 +f 245 495 494 246 +f 244 496 495 245 +f 244 243 497 496 +f 242 498 497 243 +f 242 241 499 498 +f 240 500 499 241 +f 240 239 501 500 +f 238 502 501 239 +f 238 237 503 502 +f 236 504 503 237 +f 235 505 504 236 +f 234 506 505 235 +f 234 233 507 506 +f 233 232 508 507 +f 231 509 508 232 +f 231 230 510 509 +f 229 511 510 230 +f 229 228 512 511 +f 227 513 512 228 +f 227 226 514 513 +f 226 225 483 514 +f 287 288 451 452 +f 286 287 452 453 +f 286 453 454 285 +f 284 285 454 455 +f 284 455 456 283 +f 282 283 456 457 +f 282 457 458 281 +f 280 281 458 459 +f 279 280 459 460 +f 279 460 461 278 +f 278 461 462 277 +f 277 462 463 276 +f 275 276 463 464 +f 275 464 465 274 +f 273 274 465 466 +f 273 466 467 272 +f 271 272 467 468 +f 271 468 469 270 +f 269 270 469 470 +f 269 470 471 268 +f 268 471 472 267 +f 267 472 473 266 +f 265 266 473 474 +f 265 474 475 264 +f 263 264 475 476 +f 263 476 477 262 +f 262 477 478 261 +f 261 478 479 260 +f 259 260 479 480 +f 259 480 481 258 +f 258 481 482 257 +f 257 482 451 288 +f 317 324 518 +f 316 325 519 +f 309 332 526 +f 308 333 527 +f 301 340 534 +f 300 341 535 +f 293 348 542 +f 292 349 543 +f 351 546 642 549 +f 350 545 641 551 +f 350 551 640 544 +f 348 543 639 555 +f 348 555 638 542 +f 346 541 637 559 +f 346 559 636 540 +f 344 539 635 563 +f 343 538 634 565 +f 343 565 633 537 +f 342 567 632 536 +f 341 569 631 535 +f 339 534 630 573 +f 339 573 629 533 +f 337 532 628 577 +f 337 577 627 531 +f 335 530 626 581 +f 335 581 625 529 +f 333 528 624 585 +f 333 585 623 527 +f 332 587 622 526 +f 331 589 621 525 +f 329 524 620 593 +f 329 593 619 523 +f 327 522 618 597 +f 327 597 617 521 +f 326 599 616 520 +f 325 601 615 519 +f 323 518 614 605 +f 323 605 613 517 +f 322 607 612 516 +f 321 609 611 515 +f 416 353 610 +f 385 384 608 +f 386 383 606 +f 382 604 387 +f 388 381 602 +f 390 379 598 +f 378 596 391 +f 392 377 594 +f 376 592 393 +f 394 375 590 +f 395 374 588 +f 396 373 586 +f 398 371 582 +f 370 580 399 +f 400 369 578 +f 368 576 401 +f 402 367 574 +f 366 572 403 +f 404 365 570 +f 406 363 566 +f 362 564 407 +f 361 562 408 +f 409 360 560 +f 359 558 410 +f 411 358 556 +f 357 554 412 +f 355 550 414 +f 354 548 415 +f 415 416 417 418 +f 414 415 418 419 +f 414 419 420 413 +f 412 413 420 421 +f 412 421 422 411 +f 410 411 422 423 +f 410 423 424 409 +f 408 409 424 425 +f 407 408 425 426 +f 407 426 427 406 +f 406 427 428 405 +f 405 428 429 404 +f 403 404 429 430 +f 403 430 431 402 +f 401 402 431 432 +f 401 432 433 400 +f 399 400 433 434 +f 399 434 435 398 +f 397 398 435 436 +f 397 436 437 396 +f 396 437 438 395 +f 395 438 439 394 +f 393 394 439 440 +f 393 440 441 392 +f 391 392 441 442 +f 391 442 443 390 +f 390 443 444 389 +f 389 444 445 388 +f 387 388 445 446 +f 387 446 447 386 +f 386 447 448 385 +f 385 448 417 416 +f 448 449 417 +f 447 449 448 +f 446 449 447 +f 446 445 449 +f 444 449 445 +f 443 449 444 +f 442 449 443 +f 442 441 449 +f 440 449 441 +f 440 439 449 +f 438 449 439 +f 437 449 438 +f 436 449 437 +f 436 435 449 +f 434 449 435 +f 434 433 449 +f 432 449 433 +f 432 431 449 +f 430 449 431 +f 430 429 449 +f 428 449 429 +f 427 449 428 +f 426 449 427 +f 426 425 449 +f 425 424 449 +f 423 449 424 +f 423 422 449 +f 421 449 422 +f 421 420 449 +f 419 449 420 +f 419 418 449 +f 418 417 449 +f 32 1 450 +f 31 32 450 +f 30 31 450 +f 30 450 29 +f 28 29 450 +f 27 28 450 +f 26 27 450 +f 26 450 25 +f 24 25 450 +f 24 450 23 +f 22 23 450 +f 21 22 450 +f 20 21 450 +f 20 450 19 +f 18 19 450 +f 18 450 17 +f 16 17 450 +f 16 450 15 +f 14 15 450 +f 14 450 13 +f 12 13 450 +f 11 12 450 +f 10 11 450 +f 10 450 9 +f 9 450 8 +f 7 8 450 +f 7 450 6 +f 5 6 450 +f 5 450 4 +f 3 4 450 +f 3 450 2 +f 450 1 2 +f 482 320 289 451 +f 481 319 320 482 +f 480 318 319 481 +f 479 317 318 480 +f 478 316 317 479 +f 477 315 316 478 +f 476 314 315 477 +f 475 313 314 476 +f 474 312 313 475 +f 473 311 312 474 +f 472 310 311 473 +f 471 309 310 472 +f 470 308 309 471 +f 469 307 308 470 +f 468 306 307 469 +f 467 305 306 468 +f 466 304 305 467 +f 465 303 304 466 +f 464 302 303 465 +f 463 301 302 464 +f 462 300 301 463 +f 461 299 300 462 +f 460 298 299 461 +f 459 297 298 460 +f 458 296 297 459 +f 457 295 296 458 +f 456 294 295 457 +f 455 293 294 456 +f 454 292 293 455 +f 453 291 292 454 +f 452 290 291 453 +f 451 289 290 452 +f 483 288 287 514 +f 514 287 286 513 +f 513 286 285 512 +f 512 285 284 511 +f 511 284 283 510 +f 510 283 282 509 +f 509 282 281 508 +f 508 281 280 507 +f 507 280 279 506 +f 506 279 278 505 +f 505 278 277 504 +f 504 277 276 503 +f 503 276 275 502 +f 502 275 274 501 +f 501 274 273 500 +f 500 273 272 499 +f 499 272 271 498 +f 498 271 270 497 +f 497 270 269 496 +f 496 269 268 495 +f 495 268 267 494 +f 494 267 266 493 +f 493 266 265 492 +f 492 265 264 491 +f 491 264 263 490 +f 490 263 262 489 +f 489 262 261 488 +f 488 261 260 487 +f 487 260 259 486 +f 486 259 258 485 +f 485 258 257 484 +f 484 257 288 483 +f 548 353 416 +f 548 416 415 +f 550 354 415 +f 550 415 414 +f 552 355 414 +f 554 356 413 +f 554 413 412 +f 556 357 412 +f 556 412 411 +f 560 359 410 +f 560 410 409 +f 562 360 409 +f 562 409 408 +f 564 361 408 +f 564 408 407 +f 566 362 407 +f 566 407 406 +f 568 363 406 +f 570 364 405 +f 570 405 404 +f 572 365 404 +f 572 404 403 +f 576 367 402 +f 576 402 401 +f 578 368 401 +f 578 401 400 +f 580 369 400 +f 580 400 399 +f 582 370 399 +f 582 399 398 +f 584 371 398 +f 586 372 397 +f 586 397 396 +f 588 373 396 +f 588 396 395 +f 592 375 394 +f 592 394 393 +f 594 376 393 +f 594 393 392 +f 596 377 392 +f 596 392 391 +f 598 378 391 +f 598 391 390 +f 600 379 390 +f 602 380 389 +f 602 389 388 +f 604 381 388 +f 604 388 387 +f 608 383 386 +f 608 386 385 +f 610 384 385 +f 610 385 416 +f 384 610 611 609 +f 353 547 611 610 +f 352 515 611 547 +f 383 608 612 607 +f 384 609 612 608 +f 321 516 612 609 +f 382 606 613 605 +f 383 607 613 606 +f 322 517 613 607 +f 324 603 614 518 +f 381 604 614 603 +f 382 605 614 604 +f 380 602 615 601 +f 381 603 615 602 +f 324 519 615 603 +f 379 600 616 599 +f 380 601 616 600 +f 325 520 616 601 +f 378 598 617 597 +f 379 599 617 598 +f 326 521 617 599 +f 328 595 618 522 +f 377 596 618 595 +f 378 597 618 596 +f 376 594 619 593 +f 377 595 619 594 +f 328 523 619 595 +f 330 591 620 524 +f 375 592 620 591 +f 376 593 620 592 +f 374 590 621 589 +f 375 591 621 590 +f 330 525 621 591 +f 373 588 622 587 +f 374 589 622 588 +f 331 526 622 589 +f 372 586 623 585 +f 373 587 623 586 +f 332 527 623 587 +f 334 583 624 528 +f 371 584 624 583 +f 372 585 624 584 +f 370 582 625 581 +f 371 583 625 582 +f 334 529 625 583 +f 336 579 626 530 +f 369 580 626 579 +f 370 581 626 580 +f 368 578 627 577 +f 369 579 627 578 +f 336 531 627 579 +f 338 575 628 532 +f 367 576 628 575 +f 368 577 628 576 +f 366 574 629 573 +f 367 575 629 574 +f 338 533 629 575 +f 340 571 630 534 +f 365 572 630 571 +f 366 573 630 572 +f 364 570 631 569 +f 365 571 631 570 +f 340 535 631 571 +f 363 568 632 567 +f 364 569 632 568 +f 341 536 632 569 +f 362 566 633 565 +f 363 567 633 566 +f 342 537 633 567 +f 344 563 634 538 +f 361 564 634 563 +f 362 565 634 564 +f 345 561 635 539 +f 360 562 635 561 +f 361 563 635 562 +f 359 560 636 559 +f 360 561 636 560 +f 345 540 636 561 +f 347 557 637 541 +f 358 558 637 557 +f 359 559 637 558 +f 357 556 638 555 +f 358 557 638 556 +f 347 542 638 557 +f 349 553 639 543 +f 356 554 639 553 +f 357 555 639 554 +f 355 552 640 551 +f 356 553 640 552 +f 349 544 640 553 +f 351 549 641 545 +f 354 550 641 549 +f 355 551 641 550 +f 352 547 642 546 +f 353 548 642 547 +f 354 549 642 548 +f 543 348 293 +f 543 293 292 +f 542 347 294 +f 542 294 293 +f 535 340 301 +f 535 301 300 +f 534 339 302 +f 534 302 301 +f 527 332 309 +f 527 309 308 +f 526 331 310 +f 526 310 309 +f 519 324 317 +f 519 317 316 +f 518 323 318 +f 518 318 317 +f 643 675 677 674 +f 674 677 678 673 +f 673 678 679 672 +f 672 679 680 671 +f 671 680 681 670 +f 670 681 682 669 +f 669 682 683 668 +f 668 683 684 667 +f 667 684 685 666 +f 666 685 686 665 +f 665 686 687 664 +f 664 687 688 663 +f 663 688 689 662 +f 662 689 690 661 +f 661 690 691 660 +f 660 691 692 659 +f 659 692 693 658 +f 658 693 694 657 +f 657 694 695 656 +f 656 695 696 655 +f 655 696 697 654 +f 654 697 698 653 +f 653 698 699 652 +f 652 699 700 651 +f 651 700 701 650 +f 650 701 702 649 +f 649 702 703 648 +f 648 703 704 647 +f 647 704 705 646 +f 646 705 706 645 +f 645 706 676 644 +f 643 1 32 644 +f 706 34 33 676 +f 705 35 34 706 +f 704 36 35 705 +f 703 37 36 704 +f 702 38 37 703 +f 701 39 38 702 +f 700 40 39 701 +f 699 41 40 700 +f 698 42 41 699 +f 697 43 42 698 +f 696 44 43 697 +f 695 45 44 696 +f 694 46 45 695 +f 693 47 46 694 +f 692 48 47 693 +f 691 49 48 692 +f 690 50 49 691 +f 689 51 50 690 +f 688 52 51 689 +f 687 53 52 688 +f 686 54 53 687 +f 685 55 54 686 +f 684 56 55 685 +f 683 57 56 684 +f 682 58 57 683 +f 681 59 58 682 +f 680 60 59 681 +f 679 61 60 680 +f 678 62 61 679 +f 677 63 62 678 +f 675 64 63 677 +f 675 643 644 676 +f 516 517 322 +f 323 319 318 +f 520 521 326 +f 524 525 330 +f 331 311 310 +f 528 529 334 +f 532 533 338 +f 339 303 302 +f 536 537 342 +f 540 541 346 +f 347 295 294 +f 544 545 350 +f 380 600 390 +f 380 390 389 +f 372 584 398 +f 372 398 397 +f 364 568 406 +f 364 406 405 +f 356 552 414 +f 356 414 413 +f 358 411 410 +f 358 410 558 +f 366 403 402 +f 366 402 574 +f 374 395 394 +f 374 394 590 +f 382 387 386 +f 382 386 606 +f 349 292 291 +f 341 300 299 +f 333 308 307 +f 325 316 315 +f 325 315 314 +f 333 307 306 +f 341 299 298 +f 349 291 290 +f 347 296 295 +f 339 304 303 +f 331 312 311 +f 323 320 319 +f 321 515 517 +f 321 517 516 +f 327 521 520 +f 327 520 522 +f 329 523 525 +f 329 525 524 +f 335 529 528 +f 335 528 530 +f 337 531 533 +f 337 533 532 +f 343 537 536 +f 343 536 538 +f 345 539 541 +f 345 541 540 +f 351 545 544 +f 351 544 546 +f 323 289 320 +f 331 313 312 +f 339 305 304 +f 347 297 296 +f 349 290 289 +f 341 298 297 +f 333 306 305 +f 325 314 313 +f 328 522 520 +f 336 530 528 +f 344 538 536 +f 352 546 544 +f 323 517 544 +f 331 525 520 +f 339 533 528 +f 347 541 536 +f 525 523 328 +f 525 328 520 +f 533 531 336 +f 533 336 528 +f 541 539 344 +f 541 344 536 +f 517 515 352 +f 517 352 544 +f 349 289 323 +f 349 323 544 +f 341 297 347 +f 341 347 536 +f 333 305 339 +f 333 339 528 +f 325 313 331 +f 325 331 520 diff --git a/Graph3D/Earth.jpg b/Graph3D/Earth.jpg new file mode 100644 index 0000000..07f9d8a Binary files /dev/null and b/Graph3D/Earth.jpg differ diff --git a/Graph3D/EarthImageMaterial.pas b/Graph3D/EarthImageMaterial.pas new file mode 100644 index 0000000..ec3918a --- /dev/null +++ b/Graph3D/EarthImageMaterial.pas @@ -0,0 +1,25 @@ +uses Graph3D; + +begin + View3D.Title := ' '; + View3D.CameraMode := CameraMode.Inspect; + View3D.ShowCoordinateSystem := False; + View3D.ShowGridLines := False; + View3D.ShowViewCube := False; + View3D.ShowCameraInfo := False; + View3D.BackgroundColor := Colors.Black; + + var c := Sphere(0,0,0,5,Colors.Wheat); + c.Material := ImageMaterial('Earth.jpg'); + var gr := 0; + var dgr := 1; + while True do + begin + c.Rotate(V3D(0,0,1),1); + Sleep(10); + gr += dgr; + if (gr<=0) or (gr>=255) then + dgr := - dgr; + View3D.BackgroundColor := RGB(gr,gr,gr); + end; +end. \ No newline at end of file diff --git a/Graph3D/Platonic.pas b/Graph3D/Platonic.pas new file mode 100644 index 0000000..6e46df8 --- /dev/null +++ b/Graph3D/Platonic.pas @@ -0,0 +1,24 @@ +uses Graph3D; + +begin + var РисоватьОписанныеСферы := True; + var p := P3D(6,0,0); + var p1 := p; + var h := -4; + Icosahedron(p,2,Colors.Green); + p.Offset(h,0,0); + Dodecahedron(p,2,Colors.Blue); + p.Offset(h,0,0); + Tetrahedron(p,2,Colors.Red); + p.Offset(h,0,0); + Octahedron(p,2,Colors.Magenta); + + p := p1; + if РисоватьОписанныеСферы then + loop 4 do + begin + var s := Sphere(p,2.0,DiffuseMaterial(Colors.Gold.ChangeAlpha(64))+SpecularMaterial(64)); + s.BackMaterial := nil; + p.Offset(h,0,0); + end; +end. \ No newline at end of file diff --git a/Graph3D/ReGroup1.pas b/Graph3D/ReGroup1.pas new file mode 100644 index 0000000..8939e2f --- /dev/null +++ b/Graph3D/ReGroup1.pas @@ -0,0 +1,14 @@ +uses Graph3D; +// ошибка! +begin + var b := Box(0,0,0,3,1,2,Colors.Blue); + var s := Sphere(0,0,2,1,Colors.Green); + var b1 := b.Clone; + var s1 := s.Clone; + + var g := Group(b,s); + var g1 := Group(b1,s1); + g1.MoveByY(3); + g.AddChild(g1[0]);// он должен отсоединиться от g! + b1.MoveByY(3); +end. \ No newline at end of file diff --git a/Graph3D/SunSystem/PlanetsRotateAlgAnim.pas b/Graph3D/SunSystem/PlanetsRotateAlgAnim.pas new file mode 100644 index 0000000..dc5a7e0 --- /dev/null +++ b/Graph3D/SunSystem/PlanetsRotateAlgAnim.pas @@ -0,0 +1,23 @@ +uses Graph3D; + +begin + Window.Title := 'Вращение планет'; + View3D.HideAll; + View3D.BackgroundColor := Colors.Black; + + var s := Sphere(0,0,0,30); + s.BackMaterial := ImageMaterial('skymap.jpg'); + + var Sun := Sphere(0,0,0,2,ImageMaterial('sunmap.jpg')); + var Earth := Sphere(-7,0,0,1,ImageMaterial('earthmap.jpg')); + var Moon := Sphere(2,0,0,0.5,ImageMaterial('moonmap.jpg')); + Earth.AddChild(Moon); + + var tr := ParametricTrajectory(0,2*Pi,100,t->P3D(7*cos(t),7*sin(t),0)); + Polyline3D(tr,1.2,GrayColor(70)); + + Moon.AnimRotateAt(OrtZ,360,P3D(-2,0,0),2.sec).Forever.Begin; + Earth.AnimRotateAtAbsolute(OrtZ,360,Origin,20.sec).Forever.Begin; + Earth.AnimRotate(OrtZ,-360,5.sec).Forever.Begin; + Sun.AnimRotate(OrtZ,-360,20.sec).Forever.Begin; +end. \ No newline at end of file diff --git a/Graph3D/SunSystem/PlanetsRotateFrBased.pas b/Graph3D/SunSystem/PlanetsRotateFrBased.pas new file mode 100644 index 0000000..b46eb69 --- /dev/null +++ b/Graph3D/SunSystem/PlanetsRotateFrBased.pas @@ -0,0 +1,27 @@ +uses Graph3D; + +begin + Window.Title := 'Вращение планет'; + View3D.HideAll; + + var s := Sphere(0,0,0,30); + s.BackMaterial := ImageMaterial('skymap.jpg'); + + var earth := Sphere(-7,0,0,1,ImageMaterial('earthmap.jpg')); + var moon := Sphere(2,0,0,0.5,ImageMaterial('moonmap.jpg')); + earth.AddChild(moon); + var Sun := Sphere(0,0,0,2,ImageMaterial('sunmap.jpg')); + Sun.AnimRotate(OrtZ,-360,20.sec).Forever.Begin; + + var tr := ParametricTrajectory(0,2*Pi,100,t->P3D(7*cos(t),7*sin(t),0)); + Polyline3D(tr,1.2,GrayColor(80)); + + var tr1 := ParametricTrajectory(0,2*Pi,100,t->P3D(2*cos(t),2*sin(t),0)); + var pl1 := Polyline3D(tr1,1.2,GrayColor(80)); + earth.AddChild(pl1); + + OnDrawFrame := dt -> begin + moon.RotateAt(OrtZ,360*dt/3,P3D(-2,0,0)); + earth.RotateAtAbsolute(OrtZ,360*dt/6,Origin); + end; +end. \ No newline at end of file diff --git a/Graph3D/SunSystem/earthmap.jpg b/Graph3D/SunSystem/earthmap.jpg new file mode 100644 index 0000000..9efef16 Binary files /dev/null and b/Graph3D/SunSystem/earthmap.jpg differ diff --git a/Graph3D/SunSystem/moonmap.jpg b/Graph3D/SunSystem/moonmap.jpg new file mode 100644 index 0000000..52b199b Binary files /dev/null and b/Graph3D/SunSystem/moonmap.jpg differ diff --git a/Graph3D/SunSystem/skymap.jpg b/Graph3D/SunSystem/skymap.jpg new file mode 100644 index 0000000..10ba8ef Binary files /dev/null and b/Graph3D/SunSystem/skymap.jpg differ diff --git a/Graph3D/SunSystem/sunmap.jpg b/Graph3D/SunSystem/sunmap.jpg new file mode 100644 index 0000000..aa448cc Binary files /dev/null and b/Graph3D/SunSystem/sunmap.jpg differ diff --git a/Graph3D/animOperationsPlusMult.pas b/Graph3D/animOperationsPlusMult.pas new file mode 100644 index 0000000..2332493 --- /dev/null +++ b/Graph3D/animOperationsPlusMult.pas @@ -0,0 +1,13 @@ +uses Graph3D; + +begin + Window.Title := 'a+b+c - последовательное выполнение, a*b - параллельное выполнение'; + var s := Box(0,0,0,3,1,2,Colors.Blue); + var p1 := P3D(5,0,0); + var p2 := P3D(5,5,0); + var OrtZ := V3D(0,0,1); + var an := s.AnimMoveTo(p1,1.Sec)*s.AnimScale(1.5,1.Sec) + + s.AnimMoveTo(p2,1.Sec)*s.AnimScale(1,1.Sec) + + s.AnimRotate(OrtZ,90,1.Sec); + an.Begin; +end. \ No newline at end of file diff --git a/Graph3D/pr3.pas b/Graph3D/pr3.pas new file mode 100644 index 0000000..5641cf1 --- /dev/null +++ b/Graph3D/pr3.pas @@ -0,0 +1,16 @@ +uses Graph3D; + +begin + View3D.Title := ' '; + var t := Teapot(0, 0, 1, Colors.Green); + OnKeyDown := k -> begin + case k of + Key.Left: t.X += 1; + Key.Right: t.X -= 1; + Key.Down: t.Y += 1; + Key.Up: t.Y -= 1; + Key.PageUp: t.Z += 1; + Key.PageDown: t.Z -= 1; + end; + end; +end. \ No newline at end of file diff --git a/Graph3D/pr4_Planes.pas b/Graph3D/pr4_Planes.pas new file mode 100644 index 0000000..d19e5da --- /dev/null +++ b/Graph3D/pr4_Planes.pas @@ -0,0 +1,22 @@ +uses Graph3D; + +begin + View3D.ShowGridLines := False; + + Camera.Position := P3D(12,16,24); + Camera.LookDirection := Camera.Position.Multiply(-1).ToVector3D; + + var sz := 12; + var alpha := 100; + var planeXZ := Rectangle3D(0,0,0,sz,sz,V3D(0,1,0),Colors.Green.ChangeAlpha(alpha)); + var planeXY := Rectangle3D(0,0,0,sz,sz,V3D(0,0,1),Colors.Blue.ChangeAlpha(alpha)); + var planeYZ := Rectangle3D(0,0,0,sz,sz,V3D(1,0,0),V3D(0,1,0),Colors.Red.ChangeAlpha(alpha)); + BillboardText(sz/2,sz/2,0,'XY',20); + BillboardText(0,sz/2,sz/2,'YZ',20); + BillboardText(sz/2,0,sz/2,'XZ',20); + var len := 8; + CoordinateSystem(len,0.3); + BillboardText(len+0.5,0,0,'X',20); + BillboardText(0,len+0.5,0,'Y',20); + BillboardText(0,0,len+0.5,'Z',20); +end. \ No newline at end of file diff --git a/Graph3D/pr5_cam.pas b/Graph3D/pr5_cam.pas new file mode 100644 index 0000000..e3fe6c7 --- /dev/null +++ b/Graph3D/pr5_cam.pas @@ -0,0 +1,27 @@ +uses Graph3D; + +begin + Window.Title := 'Вращение камеры'; + var tp := Teapot(0,0,2,Colors.Green); + tp.Scale(2); + Camera.Position := P3D(8,16,20); + Camera.LookDirection := Camera.Position.Multiply(-1).ToVector3D; + var d := 26.0; + {loop 200 do + begin + Sleep(20); + Camera.SetDistanse(d); + d -= 0.05; + end;} + var t := 0.0; + while True do + begin + Sleep(10); + Camera.Position := P3D(15*cos(t),15*sin(t),10); + Camera.UpDirection := V3D(0,0,1); + Camera.LookDirection := Camera.Position.Multiply(-1).ToVector3D; + t += 2*Pi/360/2; + end; + + Camera.LookDirection := Camera.Position.Multiply(-1).ToVector3D; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Анимация по траектории/AnimMoveTrajectory2.pas b/Graph3D/Анимация/Анимация по траектории/AnimMoveTrajectory2.pas new file mode 100644 index 0000000..f43e204 --- /dev/null +++ b/Graph3D/Анимация/Анимация по траектории/AnimMoveTrajectory2.pas @@ -0,0 +1,10 @@ +uses Graph3D; + +function ParametricTrajectory(a,b: real; N: integer; fun: real->Point3D) := PartitionPoints(a,b,N).Select(fun); + +begin + var tr := ParametricTrajectory(0,2*Pi,100,t->P3D(8*cos(t),4*sin(t),0)); + Polyline3D(tr); + var b := Sphere(tr.First,1,Colors.Blue); + b.AnimMoveTrajectory(tr.Skip(1),5).Forever.Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Анимация по траектории/AnimMoveTrajectoryPoints.pas b/Graph3D/Анимация/Анимация по траектории/AnimMoveTrajectoryPoints.pas new file mode 100644 index 0000000..50bcbd4 --- /dev/null +++ b/Graph3D/Анимация/Анимация по траектории/AnimMoveTrajectoryPoints.pas @@ -0,0 +1,10 @@ +uses Graph3D; + +begin + var b := Sphere(Origin,1,Colors.Blue); + + var (p1,p2,p3,p4) := (P3D(3,0,0),P3D(3,3,0),P3D(0,3,0),P3D(0,0,0)); + + b.MoveTo(p1); + b.AnimMoveTrajectory(Arr(p2,p3,p4,p1),3).Forever.Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Декораторы Анимаций/AnimAccelerationRatio1.pas b/Graph3D/Анимация/Декораторы Анимаций/AnimAccelerationRatio1.pas new file mode 100644 index 0000000..56f1bba --- /dev/null +++ b/Graph3D/Анимация/Декораторы Анимаций/AnimAccelerationRatio1.pas @@ -0,0 +1,10 @@ +uses Graph3D; + +begin + var ss := Cube(0,0,0,1.5,Colors.Red); + var anim := ss.AnimMoveByX(10).AutoReverse.Forever.AccelerationRatio(0.5,0.5); + //var anim := ss.AnimScale(3).Forever.AutoReverse; + //var anim := ss.AnimRotate(OrtZ,360).Forever.AutoReverse; + //var anim := ss.AnimRotateAt(OrtZ,360,P3D(3,0,0),2).Forever; + anim.Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Декораторы Анимаций/AnimAccelerationRatio2.pas b/Graph3D/Анимация/Декораторы Анимаций/AnimAccelerationRatio2.pas new file mode 100644 index 0000000..9475f57 --- /dev/null +++ b/Graph3D/Анимация/Декораторы Анимаций/AnimAccelerationRatio2.pas @@ -0,0 +1,11 @@ +uses Graph3D; + +begin + View3D.ShowGridLines := False; + var disc := Cylinder(0,0,0,0.2,6,Colors.DeepPink); + + var r := 5; + foreach var x in PartitionPoints(0,2*Pi,12) do + disc.AddChild(Sphere(r*cos(x),r*sin(x),0.2,0.1,Colors.White)); + disc.AnimRotate(OrtZ,360,2).AccelerationRatio(1,1).AutoReverse.Forever.Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Декораторы Анимаций/AnimDecorators1.pas b/Graph3D/Анимация/Декораторы Анимаций/AnimDecorators1.pas new file mode 100644 index 0000000..49109a8 --- /dev/null +++ b/Graph3D/Анимация/Декораторы Анимаций/AnimDecorators1.pas @@ -0,0 +1,7 @@ +uses Graph3D; + +begin + var ss := Cube(0,0,0,1.5,Colors.Red); + var anim := ss.AnimScale(3).Forever.AutoReverse; + anim.Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Декораторы Анимаций/AnimDecorators2.pas b/Graph3D/Анимация/Декораторы Анимаций/AnimDecorators2.pas new file mode 100644 index 0000000..16aacbd --- /dev/null +++ b/Graph3D/Анимация/Декораторы Анимаций/AnimDecorators2.pas @@ -0,0 +1,7 @@ +uses Graph3D; + +begin + var ss := Cube(0,0,0,1.5,Colors.Red); + var anim := ss.AnimRotate(OrtZ,360).Forever.AutoReverse; + anim.Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Декораторы Анимаций/AnimDecorators3.pas b/Graph3D/Анимация/Декораторы Анимаций/AnimDecorators3.pas new file mode 100644 index 0000000..ed7a7e2 --- /dev/null +++ b/Graph3D/Анимация/Декораторы Анимаций/AnimDecorators3.pas @@ -0,0 +1,8 @@ +uses Graph3D; + +begin + Cylinder(Origin,6,0.3,Colors.Green); + var ss := Cube(-3,0,0,1.5,Colors.Red); + var anim := ss.AnimRotateAt(OrtZ,360,P3D(3,0,0),2).Forever; + anim.Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Декораторы Анимаций/GroupAnimForever.pas b/Graph3D/Анимация/Декораторы Анимаций/GroupAnimForever.pas new file mode 100644 index 0000000..251cf63 --- /dev/null +++ b/Graph3D/Анимация/Декораторы Анимаций/GroupAnimForever.pas @@ -0,0 +1,8 @@ +uses Graph3D; + +begin + var c := Cube(-2,0,0,2,Colors.Beige); + var c1 := Cube(2,0,0,2,Colors.Green); + var a := c.AnimRotate(OrtZ,360,4).Forever * c1.AnimRotate(OrtZ,360,1).Forever; + a.Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Декораторы Анимаций/ProbaGroup3.pas b/Graph3D/Анимация/Декораторы Анимаций/ProbaGroup3.pas new file mode 100644 index 0000000..eb354b6 --- /dev/null +++ b/Graph3D/Анимация/Декораторы Анимаций/ProbaGroup3.pas @@ -0,0 +1,7 @@ +uses Graph3D; + +begin + var bb := ArrGen(15,i -> Object3D(Box(0.5*i,0,0,0.1,6,2,RandomColor))); + var g := Group(bb).MoveByX(-5); + g.AnimRotateAt(ortZ,360,P3D(-1,0,0),2).Forever.Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Простая Анимация/GroupAnimationAdd.pas b/Graph3D/Анимация/Простая Анимация/GroupAnimationAdd.pas new file mode 100644 index 0000000..fa946b9 --- /dev/null +++ b/Graph3D/Анимация/Простая Анимация/GroupAnimationAdd.pas @@ -0,0 +1,30 @@ +uses Graph3D; + +begin + View3D.ShowGridLines := False; + + var a := new GroupAnimation; + + var p := P3D(9,-3,0); + var sz := 1.3; + var h := 4; + for var n:=3 to 10 do + begin + var pr := Prism(p,n,sz,4,Colors.Beige); + var prw := PrismWireFrame(p,n,sz+0.01,4); + p := p.MoveX(-2*sz-0.3); + a += pr.AnimRotate(OrtZ,360,10).Forever; + a += prw.AnimRotate(OrtZ,360,10).Forever; + end; + + p := P3D(9,3,0); + for var n:=3 to 10 do + begin + var pr := Pyramid(p,n,sz,4,Colors.Beige); + var prw := PyramidWireFrame(p,n,sz+0.01,4); + p := p.MoveX(-2*sz-0.3); + a += pr.AnimRotate(OrtZ,360,10).Forever; + a += prw.AnimRotate(OrtZ,360,10).Forever; + end; + a.Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Простая Анимация/ProbaGroup2.pas b/Graph3D/Анимация/Простая Анимация/ProbaGroup2.pas new file mode 100644 index 0000000..1e998d0 --- /dev/null +++ b/Graph3D/Анимация/Простая Анимация/ProbaGroup2.pas @@ -0,0 +1,9 @@ +uses Graph3D; + +begin + var b := Box(0,0,0,6,1,2,Colors.Blue); + var s := Sphere(0,0,2,1,Colors.Green); + + var g := Group(b,s); + g.AnimRotateAt(OrtZ,360,P3D(3,0,0),2).Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Простая Анимация/animSequence.pas b/Graph3D/Анимация/Простая Анимация/animSequence.pas new file mode 100644 index 0000000..4f0c35b --- /dev/null +++ b/Graph3D/Анимация/Простая Анимация/animSequence.pas @@ -0,0 +1,10 @@ +uses Graph3D; + +begin + var s := Box(0,0,0,3,1,2,Colors.Blue); + var an := Animate.Sequence( + s.AnimMoveByY(5), + s.AnimMoveByX(5) + ); + an.Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Составные Анимации/AnimJump.pas b/Graph3D/Анимация/Составные Анимации/AnimJump.pas new file mode 100644 index 0000000..361bd23 --- /dev/null +++ b/Graph3D/Анимация/Составные Анимации/AnimJump.pas @@ -0,0 +1,9 @@ +uses Graph3D; + +begin + var jmp := 0.3; + var time := 0.5; + var c := Box(0,0,2,1,2,4,Colors.Green); + var a := c.AnimMoveByZ(-0.4,time).AutoReverse.Forever * c.AnimScaleZ(0.95,time).AutoReverse.Forever * c.AnimMoveByX(1*10,time*10); + a.Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Составные Анимации/PlanetsRotate.pas b/Graph3D/Анимация/Составные Анимации/PlanetsRotate.pas new file mode 100644 index 0000000..fe4cb48 --- /dev/null +++ b/Graph3D/Анимация/Составные Анимации/PlanetsRotate.pas @@ -0,0 +1,20 @@ +uses Graph3D; + +begin + Window.Title := 'Вращение планет'; + View3D.ShowCoordinateSystem := False; + View3D.ShowGridLines := False; + View3D.ShowViewCube := False; + View3D.BackgroundColor := Colors.Black; + + var s := Sphere(2,0,0,0.5,Colors.Red); + var ss := Sphere(0,0,0,1,Colors.Blue); + Sphere(0,0,0,2,DiffuseMaterial(Colors.Yellow)+SpecularMaterial(32)); + var g := Group(s,ss); + g.MoveBy(-7,0,0); + var anim := s.AnimRotateAt(OrtZ,360*100,P3D(-2,0,0),2*100) + * g.AnimRotateAt(OrtZ,360*100,P3D(7,0,0),10*100) + ; + + anim.Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Составные Анимации/Platonic.pas b/Graph3D/Анимация/Составные Анимации/Platonic.pas new file mode 100644 index 0000000..bbd4cd1 --- /dev/null +++ b/Graph3D/Анимация/Составные Анимации/Platonic.pas @@ -0,0 +1,27 @@ +uses Graph3D; + +begin + Window.Title := 'Платоновы тела'; + var РисоватьОписанныеСферы := True; + var p := P3D(8,0,0); + var p1 := p; + var h := -4; + Icosahedron(p,2,Colors.Green); + p.Offset(h,0,0); + Dodecahedron(p,2,Colors.Blue); + p.Offset(h,0,0); + Tetrahedron(p,2,Colors.Red); + p.Offset(h,0,0); + Octahedron(p,2,Colors.Magenta); + p.Offset(h,0,0); + Cube(p,2*2/Sqrt(3),Colors.Brown); + + p := p1; + if РисоватьОписанныеСферы then + loop 5 do + begin + var s := Sphere(p,2.0,DiffuseMaterial(Colors.Gold.ChangeAlpha(64))+SpecularMaterial(64)); + s.BackMaterial := nil; + p.Offset(h,0,0); + end; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Составные Анимации/ThenAnimMove.pas b/Graph3D/Анимация/Составные Анимации/ThenAnimMove.pas new file mode 100644 index 0000000..2c54bb3 --- /dev/null +++ b/Graph3D/Анимация/Составные Анимации/ThenAnimMove.pas @@ -0,0 +1,9 @@ +uses Graph3D; + +begin + var s := Sphere(Origin,1,Colors.Green); + s.AnimMoveByX(5).WhenCompleted(procedure->s.AnimMoveByY(5).Begin).Begin; + var s1 := s.Clone; + s1.Color := Colors.Blue; + s1.AnimMoveByX(-5).WhenCompleted(procedure->s1.AnimMoveByY(-5).Begin).Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Составные Анимации/animSequencePlus.pas b/Graph3D/Анимация/Составные Анимации/animSequencePlus.pas new file mode 100644 index 0000000..2332493 --- /dev/null +++ b/Graph3D/Анимация/Составные Анимации/animSequencePlus.pas @@ -0,0 +1,13 @@ +uses Graph3D; + +begin + Window.Title := 'a+b+c - последовательное выполнение, a*b - параллельное выполнение'; + var s := Box(0,0,0,3,1,2,Colors.Blue); + var p1 := P3D(5,0,0); + var p2 := P3D(5,5,0); + var OrtZ := V3D(0,0,1); + var an := s.AnimMoveTo(p1,1.Sec)*s.AnimScale(1.5,1.Sec) + + s.AnimMoveTo(p2,1.Sec)*s.AnimScale(1,1.Sec) + + s.AnimRotate(OrtZ,90,1.Sec); + an.Begin; +end. \ No newline at end of file diff --git a/Graph3D/Анимация/Составные Анимации/animWhenCompleted.pas b/Graph3D/Анимация/Составные Анимации/animWhenCompleted.pas new file mode 100644 index 0000000..1432de8 --- /dev/null +++ b/Graph3D/Анимация/Составные Анимации/animWhenCompleted.pas @@ -0,0 +1,8 @@ +uses Graph3D; + +begin + var t := Text3D(0,-7,1,'Начало анимации...',2); + var s := Box(0,0,0,3,1,2,Colors.Blue); + var an := s.AnimMoveTo(P3D(5,0,0),2).WhenCompleted(procedure -> t.Text := 'Конец!'); + an.Begin +end. \ No newline at end of file diff --git a/Graph3D/Группировка/Child.pas b/Graph3D/Группировка/Child.pas new file mode 100644 index 0000000..5abf90b --- /dev/null +++ b/Graph3D/Группировка/Child.pas @@ -0,0 +1,7 @@ +uses Graph3D; + +begin + var s := Sphere(0,1,2,2,Colors.Orchid); + s.AddChild(Sphere(0,2,1,0.5,Colors.White)); + s.Rotate(OrtZ,90); +end. \ No newline at end of file diff --git a/Graph3D/Группировка/GroupGroup.pas b/Graph3D/Группировка/GroupGroup.pas new file mode 100644 index 0000000..cce7286 --- /dev/null +++ b/Graph3D/Группировка/GroupGroup.pas @@ -0,0 +1,13 @@ +uses Graph3D; + +begin + var b := Box(0,0,0,3,1,2,Colors.Blue); + var s := Sphere(0,0,2,1,Colors.Green); + + var g := Group(b,s); + g.MoveByY(-4); + var g1 := g.Clone; + g.MoveByY(3); + var gg := Group(g,g1); + gg.MoveByX(3); +end. \ No newline at end of file diff --git a/Graph3D/Группировка/ReGroup2.pas b/Graph3D/Группировка/ReGroup2.pas new file mode 100644 index 0000000..e8dbd3f --- /dev/null +++ b/Graph3D/Группировка/ReGroup2.pas @@ -0,0 +1,16 @@ +uses Graph3D; +// ошибка! +begin + var b := Box(0,0,0,3,1,2,Colors.Blue); + var s := Sphere(0,0,2,1,Colors.Green); + var b1 := Box(0,-3,0,3,1,2,Colors.Blue); + var s1 := Sphere(0,-3,2,1,Colors.Green); + + var g := Group(b,s); + var g1 := Group(b1,s1); + g.AddChild(g1[0]);// он должен отсоединиться от g! + Sleep(1000); + g.MoveByX(3); + Sleep(1000); + g1.MoveByY(4); +end. \ No newline at end of file diff --git a/Graph3D/Клонирование/CloneAnim.pas b/Graph3D/Клонирование/CloneAnim.pas new file mode 100644 index 0000000..d991960 --- /dev/null +++ b/Graph3D/Клонирование/CloneAnim.pas @@ -0,0 +1,9 @@ +// Анимация клона + +uses Graph3D; +begin + var b := Box(0,0,1,1,3,2,RandomColor); + var b1 := b.Clone; + b1.MoveBy(3,0,0); + b1.AnimRotate(OrtZ,90).Begin; +end. \ No newline at end of file diff --git a/Graph3D/Клонирование/CloneWithChildren.pas b/Graph3D/Клонирование/CloneWithChildren.pas new file mode 100644 index 0000000..2aa820d --- /dev/null +++ b/Graph3D/Клонирование/CloneWithChildren.pas @@ -0,0 +1,15 @@ +uses Graph3D; + +begin + var s := Sphere(0,0,0,1,Colors.Red); + var c := Cube(0,0,1.5,1,Colors.Blue); + var p := Pyramid(0,0,0.5,4,0.5,1,Colors.LightGreen); + s.AddChild(c); + c.AddChild(p); + var s1 := s.Clone; + s1.MoveByX(2); + var g := Group(s,s1); + var g1 := g.Clone; + g.MoveByY(-4); + s1.AnimRotateAt(OrtZ,360,P3D(-2,0,0)).Begin; +end. \ No newline at end of file diff --git a/Graph3D/Клонирование/DuplicateByTrajectory.pas b/Graph3D/Клонирование/DuplicateByTrajectory.pas new file mode 100644 index 0000000..648a6b8 --- /dev/null +++ b/Graph3D/Клонирование/DuplicateByTrajectory.pas @@ -0,0 +1,26 @@ +uses Graph3D; + +function ParametricTrajectory(a,b: real; fun: real->Point3D; N: integer) := PartitionPoints(a,b,N).Select(fun); + +function ParametricCirve3D(a,b: real; fun: real->Point3D; N: integer := 200): SegmentsT; +begin + var tr := ParametricTrajectory(a,b,fun,N); + Result := Polyline3D(tr); +end; + +procedure DuplicateByTrajectory(c: Object3D; a,b: real; fun: real->Point3D; N: integer); +begin + c.MoveTo(fun(a)); + foreach var p in PartitionPoints(a,b,N).Skip(1).Select(fun) do + begin + var c1 := c.Clone.MoveTo(p); + c1.Rotate(OrtZ,3); + (c1 as CubeT).Color := RandomColor; + c := c1; + end; +end; + +begin + var c := Cube(0,0,0,0.7,Colors.Green); + DuplicateByTrajectory(c,0,4*Pi,t->P3D(4*cos(t),4*sin(t),0.5*t),40); +end. \ No newline at end of file diff --git a/Graph3D/Клонирование/MovRot.pas b/Graph3D/Клонирование/MovRot.pas new file mode 100644 index 0000000..439c95c --- /dev/null +++ b/Graph3D/Клонирование/MovRot.pas @@ -0,0 +1,9 @@ +uses Graph3D; + +begin + var b := Box(0,0,0,3,1,2,Colors.Blue); + var b1 := b.Clone.RotateAt(OrtZ,90,P3D(1.5,0,0)).MoveByX(-0.5); + b1 := b.Clone.RotateAt(OrtZ,-90,P3D(-1.5,0,0)).MoveByX(0.5); + View3D.BackgroundColor := Colors.Black; + View3D.ShowGridLines := False; +end. \ No newline at end of file diff --git a/Graph3D/Кривые/3DCirve1.pas b/Graph3D/Кривые/3DCirve1.pas new file mode 100644 index 0000000..78a7404 --- /dev/null +++ b/Graph3D/Кривые/3DCirve1.pas @@ -0,0 +1,15 @@ +uses Graph3D; + +function ParametricTrajectory(a,b: real; N: integer; fun: real->Point3D) := PartitionPoints(a,b,N).Select(fun); + +function ParametricCirve3D(a,b: real; fun: real->Point3D; N: integer := 200): SegmentsT; +begin + var tr := ParametricTrajectory(a,b,N,fun); + Result := Polyline3D(tr); +end; + +begin + //View3d.ShowGridLines := False; + ParametricCirve3D(0,20*Pi,t->P3D(0.04*t*cos(t),0.04*t*sin(t),0.1*t),1000); + //var p := ParametricCirve3D(0,20*Pi,t->P3D(3*cos(t),4*sin(1.4*t),4*cos(1.7*t)),1000); +end. \ No newline at end of file diff --git a/Graph3D/Кубик Рубика/Rubic3D.pas b/Graph3D/Кубик Рубика/Rubic3D.pas new file mode 100644 index 0000000..cde4f37 --- /dev/null +++ b/Graph3D/Кубик Рубика/Rubic3D.pas @@ -0,0 +1,250 @@ +uses Graph3D; + +var InnerColor := RGB(70,70,70); +var sec := 0.5; + +var g := new Object3D[3,3,3]; + +procedure CreateCube; +begin + var a := 1.03; + + for var x := 0 to 2 do + for var y := 0 to 2 do + for var z := 0 to 2 do + if (x,y,z) <> (1,1,1) then + begin + var b := Box(0+x*a-a,0+y*a-a,-0.5+z*a-a,1,1,0.01,z=0 ? Colors.White : InnerColor); + var b3 := Box(0+x*a-a,0+y*a-a,0.5+z*a-a,1,1,0.01,z=2 ? Colors.Yellow : InnerColor); + + var b1 := Box(0.5+x*a-a,0+y*a-a,0+z*a-a,0.01,1,1,x=2 ? Colors.Red : InnerColor); + var b4 := Box(-0.5+x*a-a,0+y*a-a,0+z*a-a,0.01,1,1,x=0 ? Colors.Orange : InnerColor); + + var b2 := Box(0+x*a-a,0.5+y*a-a,0+z*a-a,1,0.01,1,y=2 ? Colors.Green : InnerColor); + var b5 := Box(0+x*a-a,-0.5+y*a-a,0+z*a-a,1,0.01,1,y=0 ? Colors.Blue : InnerColor); + + g[x,y,z] := Group(b,b1,b2,b3,b4,b5); + end; +end; + +var IsAnimated := False; +var CountCompleted := 0; + +procedure ShiftLeft(var a,b,c,d: T); +begin + var v := a; + a := b; + b := c; + c := d; + d := v; +end; + +procedure ShiftRight(var a,b,c,d: T); +begin + var v := d; + d := c; + c := b; + b := a; + a := v; +end; + +procedure EndAnim; +begin + CountCompleted += 1; + if CountCompleted = 9 then + begin + IsAnimated := False; + CountCompleted := 0; + end; +end; + +procedure RightRotate(n: integer := 1); +begin + IsAnimated := True; + var y := 2; + if n = 0 then exit; + for var x := 0 to 2 do + for var z := 0 to 2 do + g[x,y,z].AnimRotateAtAbsolute(OrtY,-90*n,Origin,sec*Abs(n),EndAnim).Begin; + + if n>0 then + loop Abs(n) do + begin + ShiftLeft(g[1,y,0],g[0,y,1],g[1,y,2],g[2,y,1]); + ShiftLeft(g[2,y,0],g[0,y,0],g[0,y,2],g[2,y,2]); + end + else + loop Abs(n) do + begin + ShiftRight(g[1,y,0],g[0,y,1],g[1,y,2],g[2,y,1]); + ShiftRight(g[2,y,0],g[0,y,0],g[0,y,2],g[2,y,2]); + end +end; + +procedure LeftRotate(n: integer := 1); +begin + IsAnimated := True; + var y := 0; + if n = 0 then exit; + for var x := 0 to 2 do + for var z := 0 to 2 do + g[x,y,z].AnimRotateAtAbsolute(OrtY,90*n,Origin,sec*Abs(n),EndAnim).Begin; + + if n<0 then + loop Abs(n) do + begin + ShiftLeft(g[1,y,0],g[0,y,1],g[1,y,2],g[2,y,1]); + ShiftLeft(g[2,y,0],g[0,y,0],g[0,y,2],g[2,y,2]); + end + else + loop Abs(n) do + begin + ShiftRight(g[1,y,0],g[0,y,1],g[1,y,2],g[2,y,1]); + ShiftRight(g[2,y,0],g[0,y,0],g[0,y,2],g[2,y,2]); + end +end; + +procedure UpRotate(n: integer := 1); +begin + IsAnimated := True; + var z := 2; + if n = 0 then exit; + for var x := 0 to 2 do + for var y := 0 to 2 do + g[x,y,z].AnimRotateAtAbsolute(OrtZ,-90*n,Origin,sec*Abs(n),EndAnim).Begin; + + if n<0 then + loop Abs(n) do + begin + ShiftLeft(g[1,0,z],g[0,1,z],g[1,2,z],g[2,1,z]); + ShiftLeft(g[2,0,z],g[0,0,z],g[0,2,z],g[2,2,z]); + end + else + loop Abs(n) do + begin + ShiftRight(g[1,0,z],g[0,1,z],g[1,2,z],g[2,1,z]); + ShiftRight(g[2,0,z],g[0,0,z],g[0,2,z],g[2,2,z]); + end +end; + +procedure DownRotate(n: integer := 1); +begin + IsAnimated := True; + var z := 0; + if n = 0 then exit; + for var x := 0 to 2 do + for var y := 0 to 2 do + g[x,y,z].AnimRotateAtAbsolute(OrtZ,90*n,Origin,sec*Abs(n),EndAnim).Begin; + + if n>0 then + loop Abs(n) do + begin + ShiftLeft(g[1,0,z],g[0,1,z],g[1,2,z],g[2,1,z]); + ShiftLeft(g[2,0,z],g[0,0,z],g[0,2,z],g[2,2,z]); + end + else + loop Abs(n) do + begin + ShiftRight(g[1,0,z],g[0,1,z],g[1,2,z],g[2,1,z]); + ShiftRight(g[2,0,z],g[0,0,z],g[0,2,z],g[2,2,z]); + end +end; + +procedure FrontRotate(n: integer := 1); +begin + IsAnimated := True; + var x := 2; + if n = 0 then exit; + for var y := 0 to 2 do + for var z := 0 to 2 do + g[x,y,z].AnimRotateAtAbsolute(OrtX,-90*n,Origin,sec*Abs(n),EndAnim).Begin; + + if n<0 then + loop Abs(n) do + begin + ShiftLeft(g[x,1,0],g[x,0,1],g[x,1,2],g[x,2,1]); + ShiftLeft(g[x,2,0],g[x,0,0],g[x,0,2],g[x,2,2]); + end + else + loop Abs(n) do + begin + ShiftRight(g[x,1,0],g[x,0,1],g[x,1,2],g[x,2,1]); + ShiftRight(g[x,2,0],g[x,0,0],g[x,0,2],g[x,2,2]); + end +end; + +procedure BackRotate(n: integer := 1); +begin + IsAnimated := True; + var x := 0; + if n = 0 then exit; + for var y := 0 to 2 do + for var z := 0 to 2 do + g[x,y,z].AnimRotateAtAbsolute(OrtX,90*n,Origin,sec*Abs(n),EndAnim).Begin; + + if n>0 then + loop Abs(n) do + begin + ShiftLeft(g[x,1,0],g[x,0,1],g[x,1,2],g[x,2,1]); + ShiftLeft(g[x,2,0],g[x,0,0],g[x,0,2],g[x,2,2]); + end + else + loop Abs(n) do + begin + ShiftRight(g[x,1,0],g[x,0,1],g[x,1,2],g[x,2,1]); + ShiftRight(g[x,2,0],g[x,0,0],g[x,0,2],g[x,2,2]); + end +end; + + + +procedure InitScene; +begin + View3D.ShowGridLines := False; + Camera.Position := P3D(10,6,6); + Camera.LookDirection := V3D(-10,-6,-6); + Window.Title := 'Кубик Рубика'; + View3D.Title := 'Вращение граней:'; + View3D.SubTitle := 'F,B - передняя-задняя'#10'U,D - верхняя-нижняя'#10'L,R - левая-правая'; + Lights.AddDirectionalLight(Colors.DarkGray,V3D(-2.0,0,0)); + Lights.AddDirectionalLight(Colors.Gray,V3D(2.0,0,0)); + Lights.AddDirectionalLight(RGB(150,150,150),V3D(0,0,2)); + Lights.AddDirectionalLight(RGB(50,50,50),V3D(0,0,-2)); + Lights.AddDirectionalLight(Colors.Gray,V3D(0,2,0)); +end; + +procedure Mix; +begin + sec := 0.5; + loop 20 do + begin + case Random(6) of + 0: RightRotate; + 1: LeftRotate; + 2: UpRotate; + 3: DownRotate; + 4: FrontRotate; + 5: BackRotate; + end; + //Sleep(Round((sec+0.03)*1000)); + end; + sec := 0.5; +end; + +begin + InitScene; + CreateCube; + OnKeyDown := k -> begin + if IsAnimated then + exit; + case k of + Key.R: RightRotate; + Key.L: LeftRotate; + Key.U: UpRotate; + Key.D: DownRotate; + Key.F: FrontRotate; + Key.B: BackRotate; + Key.M: Mix; + end; + end; +end. \ No newline at end of file diff --git a/Graph3D/Материалы/Cells1.png b/Graph3D/Материалы/Cells1.png new file mode 100644 index 0000000..4dd4226 Binary files /dev/null and b/Graph3D/Материалы/Cells1.png differ diff --git a/Graph3D/Материалы/Cells2.png b/Graph3D/Материалы/Cells2.png new file mode 100644 index 0000000..dae2af8 Binary files /dev/null and b/Graph3D/Материалы/Cells2.png differ diff --git a/Graph3D/Материалы/Dog.jpg b/Graph3D/Материалы/Dog.jpg new file mode 100644 index 0000000..6ea685d Binary files /dev/null and b/Graph3D/Материалы/Dog.jpg differ diff --git a/Graph3D/Материалы/Material1.pas b/Graph3D/Материалы/Material1.pas new file mode 100644 index 0000000..bc71eb1 --- /dev/null +++ b/Graph3D/Материалы/Material1.pas @@ -0,0 +1,9 @@ +uses Graph3D; + +begin + //Sphere(0,0,0,2,Materials.Diffuse(Colors.Green)+Materials.Specular(128)); + var m := DiffuseMaterial(Colors.Green) + SpecularMaterial(128,30) + EmissiveMaterial(RGB(0,64,0)); + Sphere(4,0,0,2,m); + Cube(8,0,0,4,RainbowMaterial); + Cube(0,0,0,4,DiffuseMaterial(Colors.Green) + ImageMaterial('dog.jpg',0.5,0.5)); +end. \ No newline at end of file diff --git a/Graph3D/Материалы/Material2.pas b/Graph3D/Материалы/Material2.pas new file mode 100644 index 0000000..09b72c6 --- /dev/null +++ b/Graph3D/Материалы/Material2.pas @@ -0,0 +1,17 @@ +uses Graph3D; + +begin + for var i:=0 to 6 do + Sphere(6-2*i,-3,0,1, + Materials.Diffuse(Colors.Green) + + Materials.Specular(255-32*i,100)); + for var i:=0 to 6 do + Sphere(6-2*i,0,0,1, + Materials.Diffuse(Colors.Green) + + Materials.Specular(255,100-15*i)); + for var i:=0 to 6 do + Sphere(6-2*i,3,0,1, + Materials.Diffuse(Colors.Green) + + Materials.Specular(128,100) + + Materials.Emissive(GrayColor(15*i))); +end. \ No newline at end of file diff --git a/Graph3D/Материалы/TextureCell.pas b/Graph3D/Материалы/TextureCell.pas new file mode 100644 index 0000000..59b42a7 --- /dev/null +++ b/Graph3D/Материалы/TextureCell.pas @@ -0,0 +1,7 @@ +uses Graph3D; + +begin + var m := ImageMaterial('Cells1.png',0.2,0.2); + var c := Cube(0,0,2,4,m); + c.Rotate(OrtZ,35) +end. \ No newline at end of file diff --git a/Graph3D/Освещение/PointLight.pas b/Graph3D/Освещение/PointLight.pas new file mode 100644 index 0000000..637bd87 --- /dev/null +++ b/Graph3D/Освещение/PointLight.pas @@ -0,0 +1,12 @@ +uses Graph3D; + +begin + //Lights.AddDirectionalLight(GrayColor(100),V3D(-1,-1,-1)); + var p := P3D(-3,3,3); + Sphere(p,0.3,Colors.White); + View3D.ShowGridLines := false; + Cylinder(0,0,0,5,2,True,Colors.Yellow); + Rectangle3D(0,0,-0.01,15,15,OrtZ,OrtX,ImageMaterial('трава.jpg',0.2,0.2)); + Sleep(2000); + Lights.AddPointLight(GrayColor(64),p); +end. \ No newline at end of file diff --git a/Graph3D/Освещение/трава.jpg b/Graph3D/Освещение/трава.jpg new file mode 100644 index 0000000..485e1a5 Binary files /dev/null and b/Graph3D/Освещение/трава.jpg differ diff --git a/Graph3D/Проволочные Модели/WireFramePrism.pas b/Graph3D/Проволочные Модели/WireFramePrism.pas new file mode 100644 index 0000000..7badbd2 --- /dev/null +++ b/Graph3D/Проволочные Модели/WireFramePrism.pas @@ -0,0 +1,18 @@ +uses Graph3D; + +begin + var p := PrismWireFrame(Origin,13,3,5); + var pp := p.Points; + foreach var x in pp do + p.AddChild(Sphere(x,0.1,Colors.Gray)); + var m := 'A'; + foreach var x in pp do + begin + var b := Text3D(x.Move(0.3,0.3,0.4),m,0.5); + p.AddChild(b); + Inc(m); + end; + var p1 := p.Clone; + p1.MoveByX(-5); + p1.AnimRotate(OrtZ,360,10).Forever.Begin; +end. \ No newline at end of file diff --git a/Graph3D/Производительность/Cubes.pas b/Graph3D/Производительность/Cubes.pas new file mode 100644 index 0000000..23db844 --- /dev/null +++ b/Graph3D/Производительность/Cubes.pas @@ -0,0 +1,12 @@ +uses Graph3D; + +begin + View3D.ShowGridLines := False; + View3D.ShowViewCube := False; + View3D.ShowCoordinateSystem := False; + var w := 1; + for var x := -5 to 5 do + for var y := -5 to 5 do + for var z := -4 to 6 do + Cube(x*w,y*w,z*w,w*0.96,RandomColor) +end. \ No newline at end of file diff --git a/Graph3D/Производительность/Spheres.pas b/Graph3D/Производительность/Spheres.pas new file mode 100644 index 0000000..1d12c13 --- /dev/null +++ b/Graph3D/Производительность/Spheres.pas @@ -0,0 +1,23 @@ +uses Graph3D; + +begin + //view3d.ShowCameraInfo := True; + View3D.ShowGridLines := False; + View3D.ShowViewCube := False; + View3D.ShowCoordinateSystem := False; + + var l := new List; + + //Invoke(()->begin + var w := 1; + for var x := -5 to 5 do + for var y := -5 to 5 do + for var z := -5 to 5 do + l.Add(Sphere(x*w,y*w,z*w,w*0.5,RandomColor)); + //end); + + foreach var x in l do + x.AnimMoveBy(Random,Random,Random).AutoReverse.Forever.Begin; + + //Print(Milliseconds); +end. \ No newline at end of file diff --git a/Graph3D/События клавиатуры/Key1.pas b/Graph3D/События клавиатуры/Key1.pas new file mode 100644 index 0000000..43f61b5 --- /dev/null +++ b/Graph3D/События клавиатуры/Key1.pas @@ -0,0 +1,16 @@ +uses Graph3D; + +begin + View3D.ShowViewCube := False; + var s := Box(0,0,0,3,1,2,Colors.Blue); + OnKeyDown := k -> + case k of + Key.Left: s.MoveBy(1,0,0); + Key.Right: s.MoveBy(-1,0,0); + Key.Up: s.MoveBy(0,-1,0); + Key.Down: s.MoveBy(0,1,0); + Key.X: s.Rotate(OrtX,10); + Key.Y: s.Rotate(OrtY,10); + Key.Z: s.Rotate(OrtZ,10); + end; +end. \ No newline at end of file diff --git a/Graph3D/События клавиатуры/KeyFrameBasedTime.pas b/Graph3D/События клавиатуры/KeyFrameBasedTime.pas new file mode 100644 index 0000000..7f18cb5 --- /dev/null +++ b/Graph3D/События клавиатуры/KeyFrameBasedTime.pas @@ -0,0 +1,46 @@ +uses Graph3D; + +begin + Window.Title := 'Перемещение шара - анимация на основе кадра'; + View3D.Title := 'Используйте клавиши:'; + View3D.SubTitle := 'W,A,S,D,Стрелки - перемещение'; + var c := Sphere(0,0,0,1,Colors.SeaGreen); + c.Direction := V3D(-1,0,0); + c.Velocity := 5; + + var kl,kr,ku,kd: boolean; + + BeginFrameBasedAnimationTime(dt -> begin + if kr then + c.Direction := V3D(-1,c.Direction.Y,0) + else if kl then + c.Direction := V3D(1,c.Direction.Y,0) + else c.Direction := V3D(0,c.Direction.Y,0); + if ku then + c.Direction := V3D(c.Direction.X,-1,0) + else if kd then + c.Direction := V3D(c.Direction.X,1,0) + else c.Direction := V3D(c.Direction.X,0,0); + c.MoveTime(dt); + end); + + OnKeyDown := k -> + begin + case k of + Key.w,Key.Up: begin ku := true; kd := false; end; + Key.s,Key.Down: begin kd := true; ku := false; end; + Key.a,Key.Left: begin kl := true; kr := false; end; + Key.d,Key.Right: begin kr := true; kl := false; end; + end; + end; + OnKeyUp := k -> + begin + case k of + Key.w,Key.Up: ku := false; + Key.s,Key.Down: kd := false; + Key.a,Key.Left: kl := false; + Key.d,Key.Right: kr := false; + end; + end; + +end. \ No newline at end of file diff --git a/Graph3D/События мыши/cc3.pas b/Graph3D/События мыши/cc3.pas new file mode 100644 index 0000000..33db1e9 --- /dev/null +++ b/Graph3D/События мыши/cc3.pas @@ -0,0 +1,29 @@ +uses Graph3D; + +begin + View3D.Title := 'Перетягивайте мышью сферу'; + var s := Sphere(0,0,0,1); + var obj: Object3D; + OnMouseDown += procedure (x,y,mb) -> begin + obj := FindNearestObject(x,y); + if obj=s then View3D.Title := ''; + end; + + OnMouseUp += procedure (x,y,mb) -> begin + obj := nil + end; + + OnMouseMove += procedure (x,y,mb) -> begin + if obj = nil then exit; + var pp := PlaneXY.PointOnPlane(x,y); + if pp<>BadPoint then + begin + if pp.X<-5 then pp.X := -5; + if pp.X>5 then pp.X := 5; + if pp.Y<-5 then pp.Y := -5; + if pp.Y>5 then pp.Y := 5; + obj.Position := pp; + View3D.SubTitle := $'X={pp.x.ToString(2)} Y={pp.y.ToString(2)}'; + end; + end; +end. \ No newline at end of file diff --git a/Graph3D/События мыши/cc4.pas b/Graph3D/События мыши/cc4.pas new file mode 100644 index 0000000..e45b35a --- /dev/null +++ b/Graph3D/События мыши/cc4.pas @@ -0,0 +1,28 @@ +uses Graph3D; + +begin + View3D.Title := 'Перетягивайте мышью сферу'; + + var p1 := p3D(2,3,0); + var p := p3D(0,0,5); + var lin := Line(p,p1); + Segment3D(p,p1); + var s := Sphere(p1,0.2); + + var obj: Object3D; + OnMouseDown += procedure (x,y,mb) -> begin + obj := FindNearestObject(x,y); + if obj=s then View3D.Title := ''; + end; + + OnMouseUp += procedure (x,y,mb) -> begin + obj := nil; + end; + + OnMouseMove += procedure (x,y,mb) -> begin + if mb<>1 then exit; + if obj=nil then exit; + + obj.Position := lin.NearestPointOnLine(x,y); + end; +end. \ No newline at end of file diff --git a/Graph3D/События мыши/cc5.pas b/Graph3D/События мыши/cc5.pas new file mode 100644 index 0000000..134d125 --- /dev/null +++ b/Graph3D/События мыши/cc5.pas @@ -0,0 +1,41 @@ +uses Graph3D; + +begin + var d := new Dictionary; + + var pp := Arr(p3D(2,3,0),p3D(-3,0,0),p3D(2,-2,0)); + var p := p3D(0,0,5); + foreach var x in pp do + begin + var lin := Line(x,p); + Segment3D(x,p); + var s := Sphere(x,0.2); + d[s] := lin; // каждому объекту соответствует линия, по которой он может двигаться мышью + end; + + var tr := Polygon3D(Arr(pp)); + + var obj: Object3D; + OnMouseDown += procedure (x,y,mb) -> begin + obj := FindNearestObject(x,y); + if obj=nil then exit; + if not d.ContainsKey(obj) then + obj := nil; + end; + + OnMouseUp += procedure (x,y,mb) -> begin + obj := nil + end; + + OnMouseMove += procedure (x,y,mb) -> begin + if mb<>1 then exit; + if obj=nil then exit; + + obj.Position := d[obj].NearestPointOnLine(x,y); + + // Немного сложно - для изменения координат вершин треугольника + var pp := d.Keys.Select(o->o.Position).ToArray; + tr.Points := Arr(pp[0],pp[1],pp[1],pp[2],pp[2],pp[0]); + end; + +end. \ No newline at end of file diff --git a/Graph3D/События мыши/СлучайныйЦвет.pas b/Graph3D/События мыши/СлучайныйЦвет.pas new file mode 100644 index 0000000..ddce1a5 --- /dev/null +++ b/Graph3D/События мыши/СлучайныйЦвет.pas @@ -0,0 +1,13 @@ +uses Graph3D; + +begin + var s := Sphere(3,0,1,1); + var b := Box(0,2,0.5,3,2,1); + var t := Text3D(-5,0,1,'Graph3D',2); + OnMouseDown += procedure (x,y,mb) -> begin + if mb<>1 then exit; + var v := FindNearestObject(x,y); + if v<>nil then + v.Color := RandomColor; + end; +end. \ No newline at end of file diff --git a/Graph3D/Фигуры/Lego1.pas b/Graph3D/Фигуры/Lego1.pas new file mode 100644 index 0000000..f031115 --- /dev/null +++ b/Graph3D/Фигуры/Lego1.pas @@ -0,0 +1,8 @@ +uses Graph3D; + +begin + var l := Lego(-4,-1,0,8,4,1,Colors.Green); + Lego(-2,0,0.4,4,2,1,Colors.Blue); + Lego(-1,0,0.8,1,1,1,Colors.Red); + Lego(-1,1,0.8,2,1,1,Colors.Yellow); +end. \ No newline at end of file diff --git a/Graph3D/Фигуры/Pyramid.pas b/Graph3D/Фигуры/Pyramid.pas new file mode 100644 index 0000000..d7449c2 --- /dev/null +++ b/Graph3D/Фигуры/Pyramid.pas @@ -0,0 +1,6 @@ +uses Graph3D; + +begin + var p := Pyramid(0,0,0,5,2,2,Colors.Red); + p.AnimRotate(OrtZ,360,5).Begin +end. \ No newline at end of file diff --git a/Graph3D/Фигуры/Замок.pas b/Graph3D/Фигуры/Замок.pas new file mode 100644 index 0000000..634750a --- /dev/null +++ b/Graph3D/Фигуры/Замок.pas @@ -0,0 +1,32 @@ +uses Graph3D; + +function MultipleClones(c: Object3D; N: integer): Group3D; +begin + var g := Group(c); + loop N-1 do + begin + c := c.Clone; + c.MoveByX(-1.5); + if c is ObjectWithMaterial3D then + (c as ObjectWithMaterial3D).Color := RandomColor; + g.AddChild(c); + end; + Result := g; +end; + +begin + var b := Box(0,0,2,14.5,1,4,Colors.Orange); + var c := Cube(6.75,0,4.5,1,RandomColor); + var c1 := Cone(6.75,0,5,1.5,0.4,RandomColor); + var g := MultipleClones(c,10); + var gp := MultipleClones(c1,10); + var gg := Group(g,b,gp); + var g1 := gg.Clone.MoveByY(6); + var g2 := gg.Clone.MoveByY(-6); + gg.Rotate(OrtZ,90); + var g3 := gg.Clone.MoveByX(-6); + gg.MoveByX(6); + var ggg := Group(gg,g1,g2,g3); + ggg.Save('Замок.xaml'); + //ggg.AnimRotate(OrtZ,360,10).Forever.begin; +end. \ No newline at end of file diff --git a/Graph3D/Фигуры/Замок.xaml b/Graph3D/Фигуры/Замок.xaml new file mode 100644 index 0000000..fda6f83 --- /dev/null +++ b/Graph3D/Фигуры/Замок.xaml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Graph3D/Часы.pas b/Graph3D/Часы.pas new file mode 100644 index 0000000..5ca71fa --- /dev/null +++ b/Graph3D/Часы.pas @@ -0,0 +1,23 @@ +uses Graph3D; + +begin + View3D.ShowGridLines := False; + var Циферблат := Cylinder(0,0,-0.4,0.2,6,Colors.DeepPink); + var Сек := Arrow(0,0,0,0,-5.5,0,0.2,Colors.Yellow); + var Мин := Arrow(0,0,0,0,-6.0,0,0.3,Colors.Red); + + var a := 0; + var r := 5.8; + loop 60 do + begin + Sphere(r*cos(a*Pi/180),r*sin(a*Pi/180),-0.2,0.1,Colors.White); + a += 6; + end; + + while True do + begin + Sleep(10); + Сек.Rotate(v3D(0,0,1),-6); + Мин.Rotate(v3D(0,0,1),-6/60); + end; +end. \ No newline at end of file diff --git a/Graphics/ABCObjects/Sprites/SpriteFrames/multi1.bmp b/Graphics/ABCObjects/Sprites/SpriteFrames/multi1.bmp new file mode 100644 index 0000000..72ae1e4 Binary files /dev/null and b/Graphics/ABCObjects/Sprites/SpriteFrames/multi1.bmp differ diff --git a/Graphics/ABCObjects/Sprites/SpriteFrames/multi2.bmp b/Graphics/ABCObjects/Sprites/SpriteFrames/multi2.bmp new file mode 100644 index 0000000..b6e9bae Binary files /dev/null and b/Graphics/ABCObjects/Sprites/SpriteFrames/multi2.bmp differ diff --git a/Graphics/ABCObjects/Sprites/SpriteFrames/multi3.bmp b/Graphics/ABCObjects/Sprites/SpriteFrames/multi3.bmp new file mode 100644 index 0000000..8352885 Binary files /dev/null and b/Graphics/ABCObjects/Sprites/SpriteFrames/multi3.bmp differ diff --git a/Graphics/ABCObjects/Sprites/SpriteFrames/multi4.bmp b/Graphics/ABCObjects/Sprites/SpriteFrames/multi4.bmp new file mode 100644 index 0000000..e097634 Binary files /dev/null and b/Graphics/ABCObjects/Sprites/SpriteFrames/multi4.bmp differ diff --git a/Graphics/ABCObjects/Sprites/SpriteFrames/multi5.bmp b/Graphics/ABCObjects/Sprites/SpriteFrames/multi5.bmp new file mode 100644 index 0000000..727d821 Binary files /dev/null and b/Graphics/ABCObjects/Sprites/SpriteFrames/multi5.bmp differ diff --git a/Graphics/ABCObjects/Sprites/gr_SpriteCreation.pas b/Graphics/ABCObjects/Sprites/gr_SpriteCreation.pas new file mode 100644 index 0000000..efe2a13 --- /dev/null +++ b/Graphics/ABCObjects/Sprites/gr_SpriteCreation.pas @@ -0,0 +1,29 @@ +// Создание спрайта и его состояний +uses GraphABC,ABCSprites,ABCObjects,Events; + +var s: SpriteABC; + +begin + Window.Title := 'Создание спрайта'; + SetWindowSize(400,300); + CenterWindow; + + // Создание спрайта и добавление в него кадров + s := new SpriteABC(150,100,'SpriteFrames\multi1.bmp'); + s.Add('SpriteFrames\multi2.bmp'); + s.Add('SpriteFrames\multi3.bmp'); + s.Add('SpriteFrames\multi2.bmp'); + s.Add('SpriteFrames\multi4.bmp'); + s.Add('SpriteFrames\multi5.bmp'); + + // Добавление состояний к спрайту + s.AddState('fly',4); // Летать - 4 кадра + s.AddState('stand',1); // Стоять - 1 кадр + s.AddState('sit',1); // Сидеть - 1 кадр + + // Задание скорости спрайт-анимации (1..10) + s.Speed := 9; + + // Сохранение спрайта в "длинный" рисунок и создание информационного файла спрайта + s.SaveWithInfo('spr.png'); +end. \ No newline at end of file diff --git a/Graphics/ABCObjects/Sprites/gr_SpriteUsing.pas b/Graphics/ABCObjects/Sprites/gr_SpriteUsing.pas new file mode 100644 index 0000000..df48901 --- /dev/null +++ b/Graphics/ABCObjects/Sprites/gr_SpriteUsing.pas @@ -0,0 +1,27 @@ +// Переключение состояний спрайта щелчком мыши +uses GraphABC,ABCSprites,ABCObjects,Events; + +var + s: SpriteABC; + t: TextABC; + +procedure MyMouseDown(x,y,mb: integer); +begin + if s.PtInside(x,y) then + begin + // Переход к следующему состоянию спрайта + if s.Statenil then + begin + sx := ob.Left - x; + sy := ob.Top - y; + end; +end; + +procedure MyMouseMove(x,y,mb: integer); +begin + if ob<>nil then + ob.Position := new Point(x+sx,y+sy); +end; + +procedure MyMouseUp(x,y,mb: integer); +begin + ob := nil; +end; + + +begin + Window.Title := 'Передвигайте мышью объекты'; + for var i:=1 to 10 do + begin + var p := new PictureABC(Random(Window.Width-100),Random(Window.Height-100),'demo.bmp'); + p.Transparent := True; + end; + OnMouseDown := MyMouseDown; + OnMouseMove := MyMouseMove; + OnMouseUp := MyMouseUp; +end. \ No newline at end of file diff --git a/Graphics/ABCObjects/gr_Intersect.pas b/Graphics/ABCObjects/gr_Intersect.pas new file mode 100644 index 0000000..243b5bb --- /dev/null +++ b/Graphics/ABCObjects/gr_Intersect.pas @@ -0,0 +1,28 @@ +// Иллюстрация метода Intersect для графических объектов +uses ABCObjects,GraphABC; + +var Destroyer: CircleABC; + +procedure CheckPulyaIntersects; +begin + for var i:=Objects.Count-1 downto 0 do + begin + if (Destroyer.Intersect(Objects[i])) and (Objects[i]<>Destroyer) then + Objects[i].Destroy; + end; +end; + +begin + Window.Title := 'Разрушитель: метод Intersect пересечения объектов'; + for var i:=1 to 500 do + new RectangleABC(Random(WindowWidth-200)+100,Random(WindowHeight-100),Random(200),Random(200),clRandom); + Destroyer := new CircleABC(10,WindowHeight div 2,100,clBlack); + Destroyer.FontColor := clYellow; + Destroyer.Text := 'Destroyer'; + + for var i:=1 to 900 do + begin + Destroyer.MoveOn(1,0); + CheckPulyaIntersects; + end; +end. diff --git a/Graphics/ABCObjects/gr_Move_Param.pas b/Graphics/ABCObjects/gr_Move_Param.pas new file mode 100644 index 0000000..8364f08 --- /dev/null +++ b/Graphics/ABCObjects/gr_Move_Param.pas @@ -0,0 +1,70 @@ +// Движение по траектории +uses ABCObjects,GraphABC; + +const +/// Шаг по параметру кривой + step = 0.03; +/// Задержка по времени, мс + delay = 10; + +type + PointR = record + x,y: real; + end; + +function Position(t: real): PointR; // астроида +begin + var si := sin(1.5 * t); + var co := cos(1.5 * t); + Result.x := si*si*si; + Result.y := co*co*co; +end; + +function Position1(t: real): PointR; // фигура Лиссажу +begin + Result.x := cos(4*t); + Result.y := cos(2.97221*t + 2*Pi/3); +end; + +function LogicalToScreen(p: PointR): Point; +begin + var ww := WindowWidth div 2; + var hh := WindowHeight div 2; + Result.x := round((ww - 50) * p.x + ww); + Result.y := round((hh - 50) * p.y + hh); +end; + +procedure InitScreen; +begin + SetBrushColor(clMoneyGreen); + Rectangle(10,10,WindowWidth-10,WindowHeight-10); + var p := LogicalToScreen(Position1(0)); + MoveTo(p.x,p.y); +end; + +begin + Window.IsFixedSize := True; + Window.Title := 'Движение по траектории'; + SetWindowSize(640,480); + CenterWindow; + + InitScreen; + var c := new CircleABC(200,200,25,clGreen); + var d := new StarABC(200,200,40,20,5,clYellow); + + var t: real := 0; + while True do + begin + c.Center := LogicalToScreen(Position1(t)); + d.Center := LogicalToScreen(Position(t)); + if t<20*Pi then + LineTo(c.Center.x,c.Center.y) + else + begin + t := 0; + InitScreen; + end; + t += step; + Sleep(delay); + end; +end. diff --git a/Graphics/ABCObjects/gr_MovingObjects.pas b/Graphics/ABCObjects/gr_MovingObjects.pas new file mode 100644 index 0000000..9f1f683 --- /dev/null +++ b/Graphics/ABCObjects/gr_MovingObjects.pas @@ -0,0 +1,51 @@ +uses ABCObjects,GraphABC,Utils; + +const +/// Количество графических объектов + Count = 300; +/// Флаг ускорения анимации + AnimationIsFast = True; + +/// Возвращает случайный графический объект +function NewRandomABC: ObjectABC; +begin + case Random(3) of +0: Result := new CircleABC(Random(WindowWidth-30)+10,Random(WindowHeight-30)+10,Random(10)+5,clRandom); +1: Result := new RectangleABC(Random(WindowWidth-30)+10,Random(WindowHeight-30)+10,Random(20)+10,Random(20)+10,clRandom); +2: Result := new StarABC(Random(WindowWidth-30)+10,Random(WindowHeight-30)+10,Random(20)+10,Random(10)+5,Random(4)+4,clRandom); + end; +end; + +/// Передвигает графический объект с отражением его от стенок +procedure Move(o: ObjectABC); +begin + o.Move; + if (o.Left<0) or (o.Left+o.Width>WindowWidth) then + o.dx := -o.dx; + if (o.Top<0) or (o.Top+o.Height>WindowHeight) then + o.dy := -o.dy; +end; + +begin + Window.Title := 'Движущиеся объекты'; + if AnimationIsFast then + LockDrawingObjects; + for var i:=1 to Count do + begin + var m: ObjectABC := NewRandomABC; + repeat + m.dx := Random(-3,3); + m.dy := Random(-3,3); + until (m.dx<>0) and (m.dy<>0); + end; + var k := 1; + while True do + begin + for var i:=0 to Objects.Count-1 do + Move(Objects[i]); + if AnimationIsFast then + RedrawObjects; + k += 1; + Window.Title := Format('{0,5:f2}',k/Milliseconds*1000)+' кадров в секунду'; + end; +end. diff --git a/Graphics/ABCObjects/gr_PictureScale.pas b/Graphics/ABCObjects/gr_PictureScale.pas new file mode 100644 index 0000000..03ba24b --- /dev/null +++ b/Graphics/ABCObjects/gr_PictureScale.pas @@ -0,0 +1,38 @@ +// Свойства ScaleX и ScaleY класса PictureABC +uses ABCObjects,GraphABC; + +const delay = 2; + +var p: PictureABC; + +begin + Window.Title := 'Движение и масштабирование рисунка по горизонтали'; + SetWindowSize(640,260); + p := PictureABC.Create(100,100,'demo.bmp'); + while True do + begin + for var x:=100 to 450 do + begin + Sleep(delay); + p.MoveOn(1,0); + end; + for var i:=100 downto -100 do + begin + Sleep(delay); + var w := p.Width; + p.ScaleX := i/100; + p.MoveOn(w - p.Width,0); + end; + for var x:=450 downto 100 do + begin + Sleep(delay); + p.MoveOn(-1,0); + end; + for var i:=-100 to 100 do + begin + Sleep(delay); + p.ScaleX:=i/100; + end; + end; +end. + diff --git a/Graphics/ABCObjects/gr_RealNumber.pas b/Graphics/ABCObjects/gr_RealNumber.pas new file mode 100644 index 0000000..7260260 --- /dev/null +++ b/Graphics/ABCObjects/gr_RealNumber.pas @@ -0,0 +1,21 @@ +uses ABCObjects,GraphABC; + +const +/// отступ по оси x + zx = 100; +/// отступ по оси y + zy = 50; + +begin + Window.IsFixedSize := True; + Window.Title := 'Секундомер'; + var r := new RoundRectABC(zx,zy,Window.Width-2*zx,Window.Height-2*zy,100,clMoneyGreen); + r.BorderWidth := 5; + r.BorderColor := clGreen; + for var i:=1 to 1000 do + begin + r.RealNumber := i/10; + Sleep(100); + end; +end. + diff --git a/Graphics/ABCObjects/gr_StandardColors.pas b/Graphics/ABCObjects/gr_StandardColors.pas new file mode 100644 index 0000000..05a949f --- /dev/null +++ b/Graphics/ABCObjects/gr_StandardColors.pas @@ -0,0 +1,144 @@ +uses + GraphABC, + ABCObjects, + System.Reflection; + +const lim = 127 + 32; + +var + CurrentBackColor := clWhite; + InfoString: RectangleABC; + +procedure ChangeInfoStringText(colorName: string); +begin + var c := Color.FromName(colorName); + InfoString.Text := string.Format('Color.{0}: (R: {1} G: {2} B: {3}) (H: {4:f1} S: {5:f1} B: {6:f1})',colorName,c.R,c.G,c.B,c.GetHue,c.GetSaturation,c.GetBrightness); + InfoString.Color := c; + if c.R*c.R+c.G*c.G+c.B*c.B <= 3*lim*lim then + InfoString.FontColor := clWhite + else InfoString.FontColor := clBlack; + if c.A = 0 then + InfoString.FontColor := clGray; +end; + +procedure CreateStandardColors(backColor: Color); +begin + ClearWindow(backColor); + var t := typeof(Color); + var mi := t.GetProperties(); + var y := 10; + var x := 10; + var h := Window.Width div 5 - 11; + foreach m: PropertyInfo in mi do + begin + if m.GetGetMethod(true).IsStatic then + begin + var c := Color(m.GetValue(nil,nil)); + var r := new RectangleABC(x,y,h,22,c); + r.Text := m.Name; + r.TextScale := 0.9; + r.Bordered := False; + if c.R*c.R+c.G*c.G+c.B*c.B <= 3*lim*lim then + r.FontColor := clWhite + else r.FontColor := clBlack; + if c.A = 0 then + r.FontColor := clGray; + y += 25; + if y > Window.Height-40 then + begin + y := 10; + x += h + 10; + end; + end; + end; +end; + +var + ob: ObjectABC; + dx,dy: integer; + +procedure MouseDown(x,y,mb: integer); +begin + ob := ObjectUnderPoint(x,y); + if ob=InfoString then + ob := nil; + if ob<>nil then + begin + ob.ToFront; + dx := x - ob.Left; + dy := y - ob.Top; + var c := ob.Color; + if (mb=2) then + ob.Scale(2) + else ob.Color := Color.FromArgb(128,c.R,c.G,c.B); + end; +end; + +procedure MouseUp(x,y,mb: integer); +begin + if ob<>nil then + begin + if (mb=2) then + ob.Scale(0.5) + else + begin + var c := ob.Color; + if ob.Text = 'Transparent' then + ob.Color := Color.FromArgb(0,c.R,c.G,c.B) + else ob.Color := Color.FromArgb(255,c.R,c.G,c.B); + end; + ob:= nil; + end; +end; + +procedure MouseMove(x,y,mb: integer); +begin + if (ob<>nil) and (mb=1) then + begin + ob.ToFront; + ob.Left := x - dx; + ob.Top := y - dy; + end; + if ob=nil then + begin + InfoString.Text := ''; + InfoString.Color := CurrentBackColor; + end; + var ob1 := ObjectUnderPoint(x,y); + if ob1=InfoString then + ob1 := nil; + if (ob1<>nil) and (mb=0) then + ChangeInfoStringText(ob1.Text); +end; + +procedure KeyDown(Key: integer); +begin + if Key=vk_Space then + begin + if CurrentBackColor=clWhite then + begin + CurrentBackColor := clBlack; + InfoString.BorderColor := clWhite; + end + else + begin + CurrentBackColor := clWhite; + InfoString.BorderColor := clBlack; + end; + ClearWindow(CurrentBackColor); + RedrawObjects; + end; +end; + +begin + SetWindowSize(1024,768); + Window.IsFixedSize := True; + Window.CenterOnScreen; + Window.Title := 'Стандартные цвета (нажмите Пробел для изменения фонового цвета)'; + CreateStandardColors(CurrentBackColor); + InfoString := new RectangleABC(10,Window.Height-30,Window.Width-20,25); + OnMouseMove := MouseMove; + OnMouseDown := MouseDown; + OnMouseUp := MouseUp; + OnKeyDown := KeyDown; +end. diff --git a/Graphics/ABCObjects/gr_Star_Rotate.pas b/Graphics/ABCObjects/gr_Star_Rotate.pas new file mode 100644 index 0000000..82d5275 --- /dev/null +++ b/Graphics/ABCObjects/gr_Star_Rotate.pas @@ -0,0 +1,18 @@ +// Изменение свойств объекта StarABC +uses ABCObjects,GraphABC; + +var z: StarABC; + +begin + z := new StarABC(WindowWidth div 2,WindowHeight div 2,WindowHeight div 2 - 5,WindowHeight div 4 + 16,6,clRed); + for var i:=1 to 20 do + begin + Sleep(100); + z.Count := z.Count + 1; + end; + for var i:=1 to 180 do + begin + Sleep(10); + z.Angle := z.Angle + 1; + end; +end. diff --git a/Graphics/ABCObjects/gr_Text.pas b/Graphics/ABCObjects/gr_Text.pas new file mode 100644 index 0000000..4cdd07d --- /dev/null +++ b/Graphics/ABCObjects/gr_Text.pas @@ -0,0 +1,17 @@ +// Клонирование графических объектов +uses ABCObjects,GraphABC; + +var bt: TextABC; + +begin + var x := 224; + bt := new TextABC(60,110,110,'Hello!',RGB(x,x,x)); + while x>32 do + begin + Sleep(40); + x -= 32; + bt := bt.Clone; + bt.Color := RGB(x,x,x); + bt.MoveOn(7,7); + end; +end. diff --git a/Graphics/Controls/cc10_ComboBox.pas b/Graphics/Controls/cc10_ComboBox.pas new file mode 100644 index 0000000..9b8da1a --- /dev/null +++ b/Graphics/Controls/cc10_ComboBox.pas @@ -0,0 +1,27 @@ +// Модуль Controls - элемент управления "Список" и использование словаря +uses Controls,GraphWPF; + +begin + Window.Title := 'Столицы стран'; + LeftPanel(150,Colors.Orange); + var l := ComboBox('Список стран'); + l.Tooltip := 'Выбери страну - отобразится столица'; + l.Add('Россия'); + l.Add('США'); + l.Add('Китай'); + l.Add('Германия'); + l.Add('Франция'); + + var d := Dict(('Россия','Москва'), + ('США','Вашингтон'), + ('Китай','Пекин'), + ('Германия','Берлин'), + ('Франция','Париж') + ); + + Font.Size := 70; + l.SelectionChanged := procedure -> begin + Window.Clear; + DrawText(GraphWindow.ClientRect,d[l.SelectedText]); + end; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc11_ComboBox2.pas b/Graphics/Controls/cc11_ComboBox2.pas new file mode 100644 index 0000000..ba766b4 --- /dev/null +++ b/Graphics/Controls/cc11_ComboBox2.pas @@ -0,0 +1,22 @@ +// Модуль Controls - элемент управления "ComboBox" и графики функций +uses GraphWPF,Controls; + +begin + Window.Title := 'Модуль Controls - элемент управления "ComboBox" и графики функций'; + LeftPanel(150, Colors.Orange); + var cb := ComboBox('Графики функций'); + cb.AddRange('x*sin(x)','exp(x)','x*x','sin(x)-cos(2.5*x)'); + + var Redraw: procedure := () -> begin + case cb.SelectedIndex of + 0: DrawGraph(x->x*sin(x)); + 1: DrawGraph(x->exp(x)); + 2: DrawGraph(x->x*x); + 3: DrawGraph(x->sin(x)-cos(2.5*x)); + end; + end; + + cb.SelectionChanged := Redraw; + OnResize := Redraw; + Redraw; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc12_Wrapping.pas b/Graphics/Controls/cc12_Wrapping.pas new file mode 100644 index 0000000..713feb3 --- /dev/null +++ b/Graphics/Controls/cc12_Wrapping.pas @@ -0,0 +1,18 @@ +// Модуль Controls - режим Wrapping для TextBlock +uses GraphWPF,Controls; + +function R := Random(-7,7); + +begin + Window.Title := 'Модуль Controls - режим Wrapping для TextBlock'; + LeftPanel(150,Colors.Orange); + var b := Button('No Wrap'); + b.Tooltip := 'Нажмите для изменения режима переноса слов'; + + var tb1 := TextBlock('Этот текст не помещается на одной строке и в режиме Wrapping автоматически переносится'); + b.Click := procedure → begin + tb1.Wrapping := not tb1.Wrapping; + b.Text := if tb1.Wrapping then 'Wrap' else 'No Wrap'; + end; + var tb := TextBlock('Этот текст усекается,'#10'но можно явно'#10'разделять на строки'); +end. \ No newline at end of file diff --git a/Graphics/Controls/cc13_Заголовки.pas b/Graphics/Controls/cc13_Заголовки.pas new file mode 100644 index 0000000..965b7b0 --- /dev/null +++ b/Graphics/Controls/cc13_Заголовки.pas @@ -0,0 +1,32 @@ +// Модуль Controls - элементы управления с заголовками +uses Controls, GraphWPF; + +begin + Window.Title := 'Модуль Controls - все элементы управления с заголовками'; + LeftPanel(170, Colors.Orange); + + var b := Button('Заголовки включены'); + + var tb := new TextBoxWPF('TextBox'); + tb.Height := 40; + tb.Text := 'Несколько строк текста'; + tb.Wrapping := True; + + var ib := new IntegerBoxWPF('IntegerBox', 0, 10); + var lb := new ListBoxWPF('ListBox',100); + lb.AddRange('1 2 3 4 5'.ToWords); + var cb := new ComboBoxWPF('ComboBox'); + cb.AddRange('1 2 3 4 5'.ToWords); + var sl := new SliderWPF('Slider:'); + + b.Click := procedure -> begin + if b.Text = 'Заголовки включены' then + b.Text := 'Заголовки выключены' + else b.Text := 'Заголовки включены'; + tb.TitleVisible := not tb.TitleVisible; + ib.TitleVisible := not ib.TitleVisible; + lb.TitleVisible := not lb.TitleVisible; + cb.TitleVisible := not cb.TitleVisible; + sl.TitleVisible := not sl.TitleVisible; + end; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc14_Canvas.pas b/Graphics/Controls/cc14_Canvas.pas new file mode 100644 index 0000000..844ac4d --- /dev/null +++ b/Graphics/Controls/cc14_Canvas.pas @@ -0,0 +1,17 @@ +// Модуль Controls - замена графической панели на элемент управления "Канва" +uses Controls,GraphWPF; + +begin + Window.Title := 'Модуль Controls - замена графической панели на элемент управления "Канва"'; + var left := LeftPanel(150,Colors.Orange); + var can := SetMainControl.AsCanvas; + can.Color := Colors.AntiqueWhite; + + Button(100,100,'На Канве можно располагать элементы'); + Button(50,300,'в любом месте,'); + TextBlock(150,500,'указывая их координаты'); + + // Смена активной панели + SetActivePanel(left); + Button('Закрыть').Click := procedure → Window.Close; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc15_ListView.pas b/Graphics/Controls/cc15_ListView.pas new file mode 100644 index 0000000..739359d --- /dev/null +++ b/Graphics/Controls/cc15_ListView.pas @@ -0,0 +1,23 @@ +// Модуль Controls - замена графического окна элементом "ListView" +uses Controls,GraphWPF; + +type My = class +public + auto property Поле1: integer; + auto property Поле2: integer; + constructor (п1,п2: integer) := (Поле1,Поле2) := (п1,п2); +end; + +begin + Window.Title := 'Модуль Controls - замена графического окна элементом "ListView"'; + LeftPanel(150,Colors.Orange); + + var l := SetMainControl.AsListView; + + // Заполнение объектами класса, у которых есть публичные свойства + l.Fill(Arr(new My(2,5),new My(4,6))); + + Button('Очистить список').Click := procedure -> l.Clear; + Button('Заполнить данными').Click := procedure -> l.Fill(|('Иванов',20),('Петров',19)|); + Button('Заполнить заголовки').Click := procedure -> l.SetHeaders('Фамилия','Возраст'); +end. \ No newline at end of file diff --git a/Graphics/Controls/cc16_Countries.pas b/Graphics/Controls/cc16_Countries.pas new file mode 100644 index 0000000..02008d8 --- /dev/null +++ b/Graphics/Controls/cc16_Countries.pas @@ -0,0 +1,19 @@ +// Модуль Controls - визуализация запросов к базе данных +uses GraphWPF,Controls,ABCDatabases; + +begin + Window.Title := 'Модуль Controls - визуализация запросов к базе данных'; + LeftPanel(150,Colors.Orange); + var l := SetMainControl.AsListView; + + var страны := ЗаполнитьМассивСтран; + l.Fill(страны); + + Button('Все').Click := procedure -> l.Fill(страны); + + Button('Азия').Click := procedure -> + l.Fill(страны.Where(страна -> страна.Континент='Азия')); + + Button('Сорт по населению').Click := procedure -> + l.Fill(страны.OrderByDescending(s -> s.Население)); +end. \ No newline at end of file diff --git a/Graphics/Controls/cc16a_CountyCapital.pas b/Graphics/Controls/cc16a_CountyCapital.pas new file mode 100644 index 0000000..370190e --- /dev/null +++ b/Graphics/Controls/cc16a_CountyCapital.pas @@ -0,0 +1,20 @@ +uses GraphWPF, Controls, ABCDatabases; + +begin + Window.Title := 'Столицы стран'; + LeftPanel(220, Colors.LightGoldenrodYellow); + var страны := ЗаполнитьМассивСтран; + + var a := ListBox('Страны',550); + a.AddRange(страны.ConvertAll(страна -> страна.Название)); + + var d := DictStr; + foreach var страна in страны do + d[страна.Название] := страна.Столица; + + Font.Size := 70; + a.SelectionChanged := procedure -> begin + Window.Clear; + DrawText(GraphWindow.ClientRect,d[a.SelectedText]) + end; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc17_CalcIdea.pas b/Graphics/Controls/cc17_CalcIdea.pas new file mode 100644 index 0000000..ac030bd --- /dev/null +++ b/Graphics/Controls/cc17_CalcIdea.pas @@ -0,0 +1,14 @@ +// Модуль Controls - Калькулятор Light +uses Controls,GraphWPF; + +begin + Window.Title := 'Калькулятор Light'; + LeftPanel(150, Colors.Orange); + var tb := SetMainControl.AsTextBox; + tb.FontSize := 30; + var x := IntegerBox('X:',1,9); + var y := IntegerBox('Y:',1,9); + Button('Sum').Click := procedure -> begin + tb.Println($'{x.Value} + {y.Value} = {x.Value + y.Value}'); + end; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc18_SimpleCalc.pas b/Graphics/Controls/cc18_SimpleCalc.pas new file mode 100644 index 0000000..f28cadb --- /dev/null +++ b/Graphics/Controls/cc18_SimpleCalc.pas @@ -0,0 +1,44 @@ +// Модуль Controls - Калькулятор +uses Controls,GraphWPF; + +begin + Window.Title := 'Калькулятор с выводом в TextBox'; + LeftPanel(150, Colors.Orange); + var tb := SetMainControl.AsTextBox; + tb.FontSize := 30; + var x := IntegerBox('X:'); + var y := IntegerBox('Y:'); + x.Value := Random(0,10); + y.Value := Random(0,10); + + var cb := new ComboBoxWPF('Операция'); + cb.AddRange('+','-','*','/'); + + var count := 0; + var sb := StatusBar; + sb.Text := 'Количество вычислений: ' + count; + + var b := Button('+'); + b.Click := procedure -> begin + case cb.SelectedText of + '+': tb.Println($'{x.Value} + {y.Value} = {x.Value + y.Value}'); + '-': tb.Println($'{x.Value} - {y.Value} = {x.Value - y.Value}'); + '*': tb.Println($'{x.Value} * {y.Value} = {x.Value * y.Value}'); + '/': tb.Println($'{x.Value} / {y.Value} = {x.Value / y.Value}'); + end; + x.Value := Random(0,10); + y.Value := Random(0,10); + count += 1; + sb.Text := 'Количество вычислений: ' + count; + end; + + Button('Очистить').Click := () -> begin + count := 0; + sb.Text := 'Количество вычислений: ' + count; + tb.Clear; + end; + + cb.SelectionChanged := procedure -> begin + b.Text := cb.SelectedText + end; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc19_StatusBar.pas b/Graphics/Controls/cc19_StatusBar.pas new file mode 100644 index 0000000..0be2ecb --- /dev/null +++ b/Graphics/Controls/cc19_StatusBar.pas @@ -0,0 +1,17 @@ +// Модуль Controls - StatusBar +uses Controls,GraphWPF; + +begin + Window.Title := 'Модуль Controls - StatusBar'; + var l := LeftPanel(150,Colors.Orange); + l.Tooltip := 'Измените размеры окна'; + var sb := StatusBar(24,55); + sb.AddText('',55); + Button('Очистить поле W').Click := procedure -> sb.ItemText[0] := ''; + Button('Очистить поле H').Click := procedure -> sb.ItemText[1] := ''; + OnResize := () -> begin + sb.ItemText[0] := 'W=' + Window.Width.Round; + sb.ItemText[1] := 'H=' + Window.Height.Round; + end; + OnResize(); +end. \ No newline at end of file diff --git a/Graphics/Controls/cc1_All.pas b/Graphics/Controls/cc1_All.pas new file mode 100644 index 0000000..6c0692d --- /dev/null +++ b/Graphics/Controls/cc1_All.pas @@ -0,0 +1,33 @@ +// Модуль Controls - все элементы управления +uses GraphWPF,Controls; + +begin + Window.Title := 'Модуль Controls - все элементы управления'; + // Обычно элементы управления размещаются на панели - левой или правой + LeftPanel(160,Colors.Orange); + + Button('Кнопка'); + CheckBox('Флажок'); + RadioButton('Переключатель 1'); + RadioButton('Переключатель 2'); + TextBox('Поле ввода текста'); + var ib := IntegerBox('Поле ввода целого',0,10); + ib.Tooltip := 'Покрутите колёсико мыши для изменения значения'; + var l := ListBox('Список стран'); + l.Height := 110; + l.Add('Россия'); + l.Add('США'); + l.Add('Китай'); + l.Add('Германия'); + l.Add('Франция'); + var cb := ComboBox('Выпадающий список'); + cb.AddRange('Россия','США','Китай','Германия','Франция'); + + Slider('Слайдер:',0,10); + TextBlock('Блок текста'); + IntegerBlock('Блок целого:',64); + RealBlock('Блок вещественного:',3.5); + + var s := StatusBar; + s.Text := 'Строка статуса'; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc20_Menu.pas b/Graphics/Controls/cc20_Menu.pas new file mode 100644 index 0000000..576c6d9 --- /dev/null +++ b/Graphics/Controls/cc20_Menu.pas @@ -0,0 +1,17 @@ +// Модуль Controls - меню +uses Controls,GraphWPF; + +begin + LeftPanel(150, Colors.Orange); + var m := new MenuWPF; + var mi1 := m.Add('File'); + mi1.Add('New'); + mi1.Add('Open'); + mi1.Add('Save'); + mi1.AddSeparator; + mi1.Add('Exit').Click := procedure->Window.Close; + //mi1.Add('Exit',procedure->Window.Close); + m.Add('Edit'); + m.Add('Options'); + var mi := m.Add('Help'); +end. \ No newline at end of file diff --git a/Graphics/Controls/cc20_Menu2.pas b/Graphics/Controls/cc20_Menu2.pas new file mode 100644 index 0000000..6d1cd4b --- /dev/null +++ b/Graphics/Controls/cc20_Menu2.pas @@ -0,0 +1,10 @@ +// Модуль Controls - меню 2 +uses Controls,GraphWPF; + +begin + LeftPanel(150, Colors.Orange); + var m := new MenuWPF; + m.AddRange('File','Edit','Options','Help'); + m[0].AddRange('New','Open','Save','-','Exit'); + m[0][3].Click := procedure->Window.Close; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc21_FileDialogs.pas b/Graphics/Controls/cc21_FileDialogs.pas new file mode 100644 index 0000000..ea5f7a9 --- /dev/null +++ b/Graphics/Controls/cc21_FileDialogs.pas @@ -0,0 +1,39 @@ +// Модуль Controls - OpenFileDialog и SaveFileDialog +uses Controls,GraphWPF; + +begin + Window.Title := 'Модуль Controls - OpenFileDialog и SaveFileDialog'; + LeftPanel(150, Colors.Orange); + var tb := SetMainControl.AsTextBox; + tb.FontSize := 16; + tb.ReadOnly := False; + tb.FontName := 'Courier new Cyr'; + + var dopen := new OpenFileDialogWPF('c:\PABCWork.NET','Программы|*.pas'); + var dSave := new SaveFileDialogWPF('c:\PABCWork.NET','Программы|*.pas'); + + var OpenHandler: procedure := procedure -> begin + var res := dopen.ShowDialog; + if res then + tb.Text := ReadAllText(dopen.FileName); + end; + var SaveHandler: procedure := procedure -> begin + var res := dSave.ShowDialog; + if res then + WriteAllText(dSave.FileName,tb.Text); + end; + + var bOpen := Button('Open'); + bOpen.Click := OpenHandler; + + var bSave := Button('Save'); + bSave.Click := SaveHandler; + + var m := Menu; + var m1 := m.Add('File'); + var mm1 := m1.Add('Open'); + mm1.Click := OpenHandler; + m1.Add('Save',SaveHandler); + m1.AddSeparator; + m1.Add('Exit',procedure->Window.Close); +end. \ No newline at end of file diff --git a/Graphics/Controls/cc22_MsgBox.pas b/Graphics/Controls/cc22_MsgBox.pas new file mode 100644 index 0000000..89cce8f --- /dev/null +++ b/Graphics/Controls/cc22_MsgBox.pas @@ -0,0 +1,19 @@ +// Модуль Controls - MessageBox +uses GraphWPF,Controls; + +begin + Window.Title := 'Модуль Controls - MessageBox'; + LeftPanel(150, Colors.Orange); + Button('MsgBoxOK').Click := () -> MessageBox.Show('Сообщение','Заголовок'); + Button('MsgBoxYesNo').Click := () -> begin + if MessageBox.Show('Сообщение','Заголовок',MessageBoxButton.YesNo) = MessageBoxResult.Yes then + Print('Yes') + else Print('No'); + end; + Button('MsgBoxWithQuestion').Click := () -> begin + if MessageBox.Show('Вы уверены?','Заголовок',MessageBoxButton.YesNo,MessageBoxImage.Question) + = MessageBoxResult.Yes then + Print('Уверен') + else Print('Нет'); + end; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc23_Random3DSpheres.pas b/Graphics/Controls/cc23_Random3DSpheres.pas new file mode 100644 index 0000000..6505ad0 --- /dev/null +++ b/Graphics/Controls/cc23_Random3DSpheres.pas @@ -0,0 +1,13 @@ +// Случайные шары +uses Graph3D,Controls; + +function R := Random(-7,7); + +begin + Window.Title := 'Случайные шары'; + LeftPanel(150,Colors.Orange); + var b := new ButtonWPF('Создать шар'); + b.Click := () → begin + Sphere(P3D(R,R,R),1); + end; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc24_RGB.pas b/Graphics/Controls/cc24_RGB.pas new file mode 100644 index 0000000..22d684a --- /dev/null +++ b/Graphics/Controls/cc24_RGB.pas @@ -0,0 +1,24 @@ +// Смешение цветов RGB +uses GraphWPF,Controls; + +begin + Window.Title := 'Цвета'; + Font.Size := 40; + LeftPanel(150); + + var r := Slider('Красный: ',0,255,255,16); + var g := Slider('Зеленый: ',0,255,255,16); + var b := Slider('Синий: ',0,255,255,16); + + Button('Выход').Click := procedure → Window.Close; + + var p: procedure := () → begin + var c := RGB(r.Value,g.Value,b.Value); + Window.Clear(c); + DrawText(GraphWindow.ClientRect,$'R={c.R}, G={c.G}, B={c.B}'); + end; + r.ValueChanged := p; + g.ValueChanged := p; + b.ValueChanged := p; + p; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc25_Gr3DProperties.pas b/Graphics/Controls/cc25_Gr3DProperties.pas new file mode 100644 index 0000000..91ee6a6 --- /dev/null +++ b/Graphics/Controls/cc25_Gr3DProperties.pas @@ -0,0 +1,28 @@ +// Модуль Controls +uses Graph3D, Controls; + +begin + var l := LeftPanel(200, Colors.LightGoldenrodYellow); + + var height := IntegerBox('Высота:', 1, 15); + height.Value := 5; + height.Tooltip := 'Покрутите колёсико мыши'; + var radius := IntegerBox('Радиус:', 1, 6); + radius.Value := 2; + radius.Tooltip := 'Покрутите колёсико мыши'; + var sides := Slider('Количество сторон: ', 3, 20); + sides.Frequency := 1; + sides.Value := 5; + + var p := Pyramid(Origin, sides.Value, height.Value, radius.Value, Colors.Green); + + height.ValueChanged := procedure -> begin + p.Height := height.Value; + end; + radius.ValueChanged := procedure -> begin + p.Radius := radius.Value; + end; + sides.ValueChanged := procedure -> begin + p.Sides := sides.Value; + end; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc2_All2.pas b/Graphics/Controls/cc2_All2.pas new file mode 100644 index 0000000..5b9a62f --- /dev/null +++ b/Graphics/Controls/cc2_All2.pas @@ -0,0 +1,57 @@ +// Модуль Controls - элементы управления на основной панели +uses GraphWPF,Controls; + +begin + Window.Title := 'Модуль Controls - элементы управления на основной панели'; + + var x := 10; + var w := 140; + Button(x,10,'Кнопка',w); + CheckBox(x,43,'Флажок'); + RadioButton(x,70,'Переключатель 1'); + RadioButton(x,97,'Переключатель 2'); + TextBox(x,120,'Поле ввода текста',w); + var ib0 := IntegerBox(x,172,'Поле ввода целого',0,10,w); + ib0.Tooltip := 'Покрутите колёсико мыши для изменения значения'; + var l0 := ListBox(x,221,'Список стран',w); + l0.Height := 110; + l0.Add('Россия'); + l0.Add('США'); + l0.Add('Китай'); + l0.Add('Германия'); + l0.Add('Франция'); + var cb0 := ComboBox(x,362,'Выпадающий список',w); + cb0.AddRange('Россия','США','Китай','Германия','Франция'); + + Slider(x,414,'Слайдер:',0,10,w); + TextBlock(x,469,'Блок текста',w); + IntegerBlock(x,497,'Блок целого:',w,64); + RealBlock(x,526,'Блок вещественного:',w,3.5); + + LeftPanel(160,Colors.Orange); + + Button('Кнопка'); + CheckBox('Флажок'); + RadioButton('Переключатель 1'); + RadioButton('Переключатель 2'); + TextBox('Поле ввода текста'); + var ib := IntegerBox('Поле ввода целого',0,10); + ib.Tooltip := 'Покрутите колёсико мыши для изменения значения'; + var l := ListBox('Список стран'); + l.Height := 110; + l.Add('Россия'); + l.Add('США'); + l.Add('Китай'); + l.Add('Германия'); + l.Add('Франция'); + var cb := ComboBox('Выпадающий список'); + cb.AddRange('Россия','США','Китай','Германия','Франция'); + + Slider('Слайдер:',0,10); + TextBlock('Блок текста'); + IntegerBlock('Блок целого:',64); + RealBlock('Блок вещественного:',3.5); + + var s := StatusBar; + s.Text := 'Строка статуса'; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc3_All3.pas b/Graphics/Controls/cc3_All3.pas new file mode 100644 index 0000000..603bc0c --- /dev/null +++ b/Graphics/Controls/cc3_All3.pas @@ -0,0 +1,33 @@ +// Модуль Controls - создание элементов вызовом конструктора +uses GraphWPF,Controls; + +begin + Window.Title := 'Модуль Controls - создание элементов вызовом конструктора + правая панель'; + // Размещение элементов на правой ранели + new RightPanelWPF(160,Colors.Orange); + + new ButtonWPF('Кнопка'); + new CheckBoxWPF('Флажок'); + new RadioButtonWPF('Переключатель 1'); + new RadioButtonWPF('Переключатель 2'); + new TextBoxWPF('Поле ввода текста'); + var ib := new IntegerBoxWPF('Поле ввода целого',0,10); + ib.Tooltip := 'Покрутите колёсико мыши для изменения значения'; + var l := new ListBoxWPF('Список стран'); + l.Height := 110; + l.Add('Россия'); + l.Add('США'); + l.Add('Китай'); + l.Add('Германия'); + l.Add('Франция'); + var cb := new ComboBoxWPF('Выпадающий список'); + cb.AddRange('Россия','США','Китай','Германия','Франция'); + + new SliderWPF('Слайдер:',0,10); + new TextBlockWPF('Блок текста'); + new IntegerBlockWPF('Блок целого:',64); + new RealBlockWPF('Блок вещественного:',3.5); + + var s := new StatusBarWPF; + s.Text := 'Строка статуса'; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc4_ButtonClick.pas b/Graphics/Controls/cc4_ButtonClick.pas new file mode 100644 index 0000000..463d394 --- /dev/null +++ b/Graphics/Controls/cc4_ButtonClick.pas @@ -0,0 +1,19 @@ +// Модуль Controls - кнопки и их обработчики +uses GraphWPF,Controls; + +begin + Window.Title := 'Модуль Controls - кнопки и их обработчики'; + var p := LeftPanel; + p.Color := Colors.Orange; + + Button('Случайный цвет').Click := () -> begin + Window.Clear(RandomColor); + end; + + var b2 := Button('Плюс'); + b2.Click := procedure -> + if b2.Text = 'Плюс' then b2.Text := 'Минус' else b2.Text := 'Плюс'; + + var b1 := Button('Закрыть окно'); + b1.Click := procedure -> Window.Close; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc5_CheckBoxes.pas b/Graphics/Controls/cc5_CheckBoxes.pas new file mode 100644 index 0000000..f909cb7 --- /dev/null +++ b/Graphics/Controls/cc5_CheckBoxes.pas @@ -0,0 +1,20 @@ +// Модуль Controls - флажки +uses GraphWPF,Controls; + +begin + Window.Title := 'Модуль Controls - флажки'; + + var p := LeftPanel(170,Colors.Orange); + + var b1 := Button('Переключить флажок 1'); + var b2 := Button('Переключить флажок 2'); + var b3 := Button('Переключить флажок 3'); + + var cb1 := new CheckBoxWPF('Флажок 1'); + var cb2 := new CheckBoxWPF('Флажок 2'); + var cb3 := new CheckBoxWPF('Флажок 3'); + + b1.Click := procedure -> cb1.Checked := not cb1.Checked; + b2.Click := procedure -> cb2.Checked := not cb2.Checked; + b3.Click := procedure -> cb3.Checked := not cb3.Checked; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc6_CheckBoxes2.pas b/Graphics/Controls/cc6_CheckBoxes2.pas new file mode 100644 index 0000000..7af4f75 --- /dev/null +++ b/Graphics/Controls/cc6_CheckBoxes2.pas @@ -0,0 +1,33 @@ +// Модуль Controls - флажки +uses WPFObjects,Controls; + +begin + Window.Title := 'Модуль Controls - флажки'; + + LeftPanel(170); + + var tb := TextBlock('Параметры круга:'); + tb.Margin := 12; + + var cb1 := new CheckBoxWPF('Заливка'); + var cb2 := new CheckBoxWPF('Жирная граница'); + var cb3 := new CheckBoxWPF('С текстом'); + + var c := new CircleWPF(GraphWindow.Center,60,Colors.White,1); + + cb1.Click := procedure -> begin + if cb1.Checked then + c.Color := Colors.Green + else c.Color := Colors.White + end; + cb2.Click := procedure -> begin + if cb2.Checked then + c.BorderWidth := 4 + else c.BorderWidth := 1 + end; + cb3.Click := procedure -> begin + if cb3.Checked then + c.Text := 'Текст' + else c.Text := '' + end; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc7_RadioButtons.pas b/Graphics/Controls/cc7_RadioButtons.pas new file mode 100644 index 0000000..b01f073 --- /dev/null +++ b/Graphics/Controls/cc7_RadioButtons.pas @@ -0,0 +1,26 @@ +// Модуль Controls - переключатели +uses WPFObjects,Controls; + +begin + Window.Title := 'Модуль Controls - переключатели'; + LeftPanel(150,Colors.Beige); + + var tb := TextBlock('Цвет круга:'); + //tb.Margin := 12; + + var rb1 := new RadioButtonWPF('Красный'); + var rb2 := new RadioButtonWPF('Зелёный'); + var rb3 := new RadioButtonWPF('Синий'); + + var c := new CircleWPF(GraphWindow.Center,60,Colors.White,1); + + rb1.Click := procedure -> begin + c.Color := Colors.Red; + end; + rb2.Click := procedure -> begin + c.Color := Colors.Green; + end; + rb3.Click := procedure -> begin + c.Color := Colors.Blue; + end; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc8_MoveObject.pas b/Graphics/Controls/cc8_MoveObject.pas new file mode 100644 index 0000000..90bbda7 --- /dev/null +++ b/Graphics/Controls/cc8_MoveObject.pas @@ -0,0 +1,28 @@ +// Модуль Controls - кнопки управления перемещением + клавиатура +uses WPFObjects,Controls; + +begin + Window.Title := 'Модуль Controls - кнопки управления перемещением + клавиатура'; + + LeftPanel; + + var c := new CircleWPF(GraphWindow.Center,30,Colors.Blue); + + OnKeyDown := k -> begin + case k of + Key.Left: c.MoveBy(-2,0); + Key.Right: c.MoveBy(2,0); + Key.Up: c.MoveBy(0,-2); + Key.Down: c.MoveBy(0,2); + end; + end; + + var l := Button('Left'); + var r := Button('Right'); + var u := Button('Up'); + var d := Button('Down'); + l.Click := ()->c.MoveBy(-2,0); + r.Click := ()->c.MoveBy(2,0); + u.Click := ()->c.MoveBy(0,-2); + d.Click := ()->c.MoveBy(0,2); +end. \ No newline at end of file diff --git a/Graphics/Controls/cc8a_MoveObject.pas b/Graphics/Controls/cc8a_MoveObject.pas new file mode 100644 index 0000000..29d2f18 --- /dev/null +++ b/Graphics/Controls/cc8a_MoveObject.pas @@ -0,0 +1,27 @@ +// Модуль Controls - IntegerBlock, IntegerBox и перемещение объекта +uses WPFObjects,Controls; + +begin + Window.Title := 'Модуль Controls - IntegerBlock, IntegerBox и перемещение объекта'; + + LeftPanel; + + var c := new CircleWPF(300,300,30,Colors.Blue); + + var X := IntegerBox('X:',0,600); + X.Value := 300; + var Y := IntegerBox('Y:',0,600); + Y.Value := 300; + + var XX := IntegerBlock('X:',300); + var YY := IntegerBlock('Y:',300); + + X.ValueChanged := procedure → begin + c.Center := Pnt(X.Value,Y.Value); + XX.Value := X.Value; + end; + Y.ValueChanged := procedure → begin + c.Center := Pnt(X.Value,Y.Value); + YY.Value := Y.Value; + end; +end. \ No newline at end of file diff --git a/Graphics/Controls/cc9_ListBox.pas b/Graphics/Controls/cc9_ListBox.pas new file mode 100644 index 0000000..6b91faf --- /dev/null +++ b/Graphics/Controls/cc9_ListBox.pas @@ -0,0 +1,28 @@ +// Модуль Controls - элемент управления "Список" и использование словаря +uses Controls,GraphWPF; + +begin + Window.Title := 'Столицы стран'; + LeftPanel(150,Colors.Orange); + var l := ListBox('Список стран'); + //l.Tooltip := 'Выбери страну - отобразится столица'; + l.Height := 110; + l.Add('Россия'); + l.Add('США'); + l.Add('Китай'); + l.Add('Германия'); + l.Add('Франция'); + + var d := Dict(('Россия','Москва'), + ('США','Вашингтон'), + ('Китай','Пекин'), + ('Германия','Берлин'), + ('Франция','Париж') + ); + + Font.Size := 70; + l.SelectionChanged := procedure -> begin + Window.Clear; + DrawText(GraphWindow.ClientRect,'Столица:'+#10+d[l.SelectedText]); + end; +end. \ No newline at end of file diff --git a/Graphics/GraphABC/DigitalClock.pas b/Graphics/GraphABC/DigitalClock.pas new file mode 100644 index 0000000..5fcaca2 --- /dev/null +++ b/Graphics/GraphABC/DigitalClock.pas @@ -0,0 +1,14 @@ +uses GraphABC,System; + +begin + Font.Size := 80; + var x0 := (Window.Width - TextWidth('00:00:00')) div 2; + var y0 := (Window.Height - TextHeight('00:00:00')) div 2; + while True do + begin + var t := DateTime.Now; + var s := string.Format('{0:d2}:{1:d2}:{2:d2}',t.Hour,t.Minute,t.Second); + TextOut(x0,y0,s); + Sleep(1000); + end; +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Flame.pas b/Graphics/GraphABC/Flame.pas new file mode 100644 index 0000000..eaaaea7 --- /dev/null +++ b/Graphics/GraphABC/Flame.pas @@ -0,0 +1,67 @@ +uses GraphABC; + +type TByteArray = array of byte; +const frames = 25; + size = 250; + dxy = size div 2; + dm = 2*PI/1024; + flameh = 4; + Light: byte = 255; + +procedure FillPallete(ColorsTable: array of Color); +begin + for var i:=0 to 255 do + if(i<128) then + ColorsTable[i] := RGB(i,0,i div 2) + else + ColorsTable[i] := RedColor(i); +end; + +begin + //Создаюм буфер экрана + var ScreenBuffer := new TByteArray[size+1]; + for var i:=0 to size do + ScreenBuffer[i] := new byte[size+1]; + //Создаем палитру + var ColorsTable := new Color[256]; + FillPallete(ColorsTable); + //Настраиваем окно + SetWindowSize(size,size); + SetBrushColor(clBlack); + FillRectangle(0,0,WindowWidth,WindowHeight); + SetSmoothingOff; + LockDrawing; + //Поехали + var x, y, s, tt, xx, yy: Integer; + var dt := System.DateTime.Now; + var ds := WindowWidth div 4; + repeat + tt := tt + 1; + xx := dxy + Round(ds*Sin(tt*dm)); + yy := dxy + Round(ds*Cos(tt*dm)); + ScreenBuffer[xx,yy] := Light; + SetPixel(xx,yy,ColorsTable[Light]); + for var i:=0 to 5 do begin + x := Random(size-1) + 1; + y := Random(size-1) + 1; + s := ScreenBuffer[Y,X]; + if s>=flameh then + s := s - flameh; + if s=0 then + continue; + ScreenBuffer[y-1,x+1] := s; + ScreenBuffer[y-1,x ] := s; + ScreenBuffer[y-1,x-1] := s; + ScreenBuffer[y+1,x ] := s; + var c := ColorsTable[s]; + SetPixel(y-1,x+1,c); + SetPixel(y-1,x, c); + SetPixel(y-1,x-1,c); + SetPixel(y+1,x, c); + end; + if((system.datetime.Now-dt).TotalMilliseconds>1000/frames) then begin + dt := System.Datetime.Now; + Redraw; + end; + until False; +end. diff --git a/Graphics/GraphABC/Fractals/Dragon.pas b/Graphics/GraphABC/Fractals/Dragon.pas new file mode 100644 index 0000000..27570e5 --- /dev/null +++ b/Graphics/GraphABC/Fractals/Dragon.pas @@ -0,0 +1,70 @@ +// Пример из пакета KuMir/PMir +program Dragon; + +uses GraphABC,Utils; + +var + x := 200; + y := 150; + dx := 0; + dy := -4; + turn: array [1..1000] of Boolean; + +begin + SetWindowSize(790,500); + Window.Title := 'Кривая Дракона'; + var f := True; + for var a := 1 to 64 do + begin + turn[2*a-1] := f; + f := not f; + turn[2*a] := turn[a]; + end; + var b := 0; + var d := 1; + f := false; + MoveTo(x,y); + + for var a:=1 to 128 do + begin + var t: integer; + LockDrawing; + for var i:=1 to 127*4 do + begin + b += d; + x += dx; + y += dy; + LineTo(x,y); + if f and not turn[b] or not f and turn[b] then + begin + t := dy; + dy := -dx; + end + else + begin + t := -dy; + dy := dx; + end; + dx := t; + end; + b += d; + x += dx; + y += dy; + LineTo(x,y); + d := -d; + f := not f; + if turn[a] then + begin + t := dy; + dy := -dx; + end + else + begin + t := -dy; + dy := dx; + end; + dx := t; + UnLockDrawing; + end; + write('Время работы = ',Milliseconds/1000,' с'); +end. diff --git a/Graphics/GraphABC/Fractals/Mandelbrot.pas b/Graphics/GraphABC/Fractals/Mandelbrot.pas new file mode 100644 index 0000000..ea950e7 --- /dev/null +++ b/Graphics/GraphABC/Fractals/Mandelbrot.pas @@ -0,0 +1,40 @@ +// Демонстрация фрактальной графики. Множество Мандельброта +// Для каждой точки комплексной плоскости z=(x,y) выполняем итерационный процесс z=z*2+c, c=(cx,cy) +// Считаем количество итераций i до тех пор пока не выполнится условие |z|>max +// После этого рисуем точку z=(x,y) с насыщенностью красного цвета, пропорциональной i +uses GraphABC; + +const + max = 10; + coef1 = 0.5; + coef2 = 0.88; + scalex = 0.0035; + scaley = 0.0035; + dx = 430; + dy = 300; + +begin + Window.Title := 'Фракталы: множество Мандельброта'; + SetWindowSize(600,600); + CenterWindow; + for var ix:=0 to Window.Width-1 do + for var iy:=0 to Window.Height-1 do + begin + var cx := scalex * (ix - dx); + var cy := scaley * (iy - dy); + var c := Cplx(cx,cy); + var z := Cplx(0,0); + + var i := 1; + while i<255 do + begin + z := z*z+c; + if z.Magnitude>max then break; + i += 1; + end; + if i>=255 then SetPixel(ix,iy,clRed) + else SetPixel(ix,iy,RGB(255,255-i,255-i)); + end; + writeln('Время расчета = ',Milliseconds/1000,' с'); +end. + diff --git a/Graphics/GraphABC/Fractals/Paporotnik/Main.pas b/Graphics/GraphABC/Fractals/Paporotnik/Main.pas new file mode 100644 index 0000000..3946450 --- /dev/null +++ b/Graphics/GraphABC/Fractals/Paporotnik/Main.pas @@ -0,0 +1,22 @@ +//(c) DarkStar 2008 +uses GraphABC, Paporotnik, PaporotnikData; + +const + Iterations = 300000; + Height = 600; + Fast = false; + Width = Height div 2; + WindowWidth= Width * 3; + Brightness = 170; + +var + Paprotnik := new PaporotnikFractal(PaprotnikData); + SimplePaprotnik := new PaporotnikFractal(SimplePaprotnikData); + Elka := new PaporotnikFractal(ElkaData); + +begin + InitWindow(200, 50, WindowWidth , Height, clBlack); + Paprotnik.Draw(0, 0, Iterations, Height, Brightness, fast); + SimplePaprotnik.Draw(Width, 0, Iterations, Height, Brightness, fast); + Elka.Draw(Width*2, 0, Iterations, Height, Brightness, fast); +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Fractals/Paporotnik/Paporotnik.pas b/Graphics/GraphABC/Fractals/Paporotnik/Paporotnik.pas new file mode 100644 index 0000000..3d689e7 --- /dev/null +++ b/Graphics/GraphABC/Fractals/Paporotnik/Paporotnik.pas @@ -0,0 +1,51 @@ +///Модуль для рисования фракталов семейства "Лист папоротника" +unit Paporotnik; + +uses GraphABC; + +type + + ///Настройки фрактала + PaporotnikFractalInitalData = record + data: array of array of real; + P0,P1,P2,P3:real; + end; + + ///Фрактал "Лист папоротника" + PaporotnikFractal = class + private + data: array of array of real; + P0,P1,P2,P3:real; + public + constructor(initdata: PaporotnikFractalInitalData); + begin + data := initdata.data; + P0 := initdata.P0; + P1 := initdata.P1; + P2 := initdata.P2; + P3 := initdata.P3; + end; + procedure Draw(x0,y0,Iterations,Height,Brightness: integer; fast: boolean); + begin + var plotx, ploty, x, y : real; + var Size := Height/11; + var Width := Height div 2; + var dx := Width div 2; + var dc := Iterations div Brightness; + if fast then + LockDrawing; + for var i:=1 to Iterations do begin + var P := Random(100); + var rnd := Pmax и |y|>max +// После этого рисуем точку x,y с насыщенностью красного цвета, пропорциональной i +uses GraphABC,Utils; + +const + max = 10; + cx = 0.251; + cy = 0.95; + coef1 = 0.5; + coef2 = 0.88; + + scalex = 0.001; + scaley = 0.001; + dx = 200; + dy = 130; + +begin + Window.Title := 'Фракталы: папоротник'; + SetWindowSize(800,600); + CenterWindow; + for var ix:=0 to Window.Width-1 do + for var iy:=0 to Window.Height-1 do + begin + var x := scalex*(ix-dx); + var y := scaley*(iy-dy); + var i := 1; + while i<255 do + begin + var x1 := coef1*x*x-coef2*y*y+cx; + var y1 := x*y+cy; + x := x1; + y := y1; + if (abs(x)>max) and (abs(y)>max) then break; + i += 1; + end; + if i>=255 then SetPixel(ix,iy,clRed) + else SetPixel(ix,iy,RGB(255,255-i,255-i)); + end; + writeln('Время расчета = ',Milliseconds/1000,' с'); +end. diff --git a/Graphics/GraphABC/Graphics/DrawFunc.pas b/Graphics/GraphABC/Graphics/DrawFunc.pas new file mode 100644 index 0000000..f71ee1b --- /dev/null +++ b/Graphics/GraphABC/Graphics/DrawFunc.pas @@ -0,0 +1,9 @@ +uses GraphABC; + +begin + Brush.Color := ARGB(0,0,0,0); // + Draw(x->x*sin(x),-20,20); + Draw(sin); + Draw(cos); + Draw(exp); +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Graphics/DrawFunc2.pas b/Graphics/GraphABC/Graphics/DrawFunc2.pas new file mode 100644 index 0000000..5012ab2 --- /dev/null +++ b/Graphics/GraphABC/Graphics/DrawFunc2.pas @@ -0,0 +1,27 @@ +uses GraphABC; + +function System.Drawing.Rectangle.Scale(m: real): System.Drawing.Rectangle; +begin + Result := Self; + Result.Width := Trunc(Result.Width * m); + Result.Height := Trunc(Result.Height * m) +end; + +function System.Drawing.Rectangle.Move(dx,dy: integer): System.Drawing.Rectangle; +begin + Result := Self; + Result.X := Result.X + dx; + Result.Y := Result.Y + dy; +end; + +begin + var r := ClientRectangle; + r := r.Scale(0.5); + var r1 := r.Move(r.Width,0); + var r2 := r.Move(0,r.Height); + var r3 := r.Move(r.Width,r.Height); + Draw(x->x*sin(x),-20,20,r); + Draw(sin,r1); + Draw(cos,r2); + Draw(exp,20,10,r3); +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Hypno.pas b/Graphics/GraphABC/Hypno.pas new file mode 100644 index 0000000..f9d4ab0 --- /dev/null +++ b/Graphics/GraphABC/Hypno.pas @@ -0,0 +1,11 @@ +// Иллюстрация прозрачности +uses GraphABC; + +begin + for var Transparency:=0 to 255 do + begin + Brush.Color := ARGB(Transparency,Random(256),Random(256),Random(256)); + FillCircle(Random(Window.Width),Random(Window.Height),Random(20,60)); + sleep(100); + end; +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Mosaic.pas b/Graphics/GraphABC/Mosaic.pas new file mode 100644 index 0000000..4aee71d --- /dev/null +++ b/Graphics/GraphABC/Mosaic.pas @@ -0,0 +1,51 @@ +// Мозаика. Квадратики случайным образом меняются местами +uses GraphABC; + +const + w = 25; + w1 = 1; + m = 50; + n = 70; + x0 = 0; + y0 = 0; + delay = 10; + +var a: array [0..n,0..m] of Color; + +begin + Window.Title := 'Мозаика'; + Window.SetSize(800,600); + + // Заполнение массива случайными цветами + for var i:=0 to n-1 do + for var j:=0 to m-1 do + begin + a[i,j] := clRandom; + Brush.Color := a[i,j]; + FillRect(x0+i*w,y0+j*w,x0+(i+1)*w-w1,y0+(j+1)*w-w1); + end; + + var k := 0; + while true do + begin + k += 1; + if k mod 1000 = 0 then + begin + k := 0; + Sleep(delay); + end; + + var i := Random(1,n-2); + var j := Random(1,m-2); + var di := Random(-1,1); + var dj := Random(-1,1); + var i1 := i+di; + var j1 := j+dj; + Swap(a[i,j],a[i1,j1]); + + Brush.Color := a[i,j]; + FillRect(x0+i*w,y0+j*w,x0+(i+1)*w-w1,y0+(j+1)*w-w1); + Brush.Color := a[i1,j1]; + FillRect(x0+i1*w,y0+j1*w,x0+(i1+1)*w-w1,y0+(j1+1)*w-w1); + end; +end. diff --git a/Graphics/GraphABC/MouseDownEvent.pas b/Graphics/GraphABC/MouseDownEvent.pas new file mode 100644 index 0000000..5dceee1 --- /dev/null +++ b/Graphics/GraphABC/MouseDownEvent.pas @@ -0,0 +1,5 @@ +uses GraphABC; + +begin + OnMouseDown := (x,y,mb) -> Circle(x,y,5); +end. \ No newline at end of file diff --git a/Graphics/GraphABC/MouseDraw.pas b/Graphics/GraphABC/MouseDraw.pas new file mode 100644 index 0000000..85ccdfb --- /dev/null +++ b/Graphics/GraphABC/MouseDraw.pas @@ -0,0 +1,7 @@ +uses GraphABC; + +begin + Window.Title := ' '; + OnMouseDown := (x,y,mb) -> MoveTo(x,y); + OnMouseMove := (x,y,mb) -> if mb=1 then LineTo(x,y); +end. \ No newline at end of file diff --git a/Graphics/GraphABC/SetPixel.pas b/Graphics/GraphABC/SetPixel.pas new file mode 100644 index 0000000..498bb4a --- /dev/null +++ b/Graphics/GraphABC/SetPixel.pas @@ -0,0 +1,7 @@ +uses GraphABC; + +begin + for var x:=0 to Window.Width-1 do + for var y:=0 to Window.Height-1 do + SetPixel(x,y,RGB(2*x-y,x-3*y,x+y)); +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Stamps/Stamp1.pas b/Graphics/GraphABC/Stamps/Stamp1.pas new file mode 100644 index 0000000..be42fe3 --- /dev/null +++ b/Graphics/GraphABC/Stamps/Stamp1.pas @@ -0,0 +1,24 @@ +// Штампы - это классы графических фигур, хранящие их параметры +// В любой момент можно нарисовать графическую фигуру, вызвав метод Stamp. + +// Класс штампа прямоугольника +uses GraphABC; + +type + RectangleStamp = auto class + x,y,w,h: integer; + procedure Stamp; + begin + Rectangle(x,y,x+w,y+h); + end; + end; + +begin + var r := new RectangleStamp(30,30,50,50); + r.Stamp; + for var i:=1 to 10 do + begin + r.x := r.x + r.w +5; + r.Stamp; + end; +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Stamps/Stamp2.pas b/Graphics/GraphABC/Stamps/Stamp2.pas new file mode 100644 index 0000000..9b9427d --- /dev/null +++ b/Graphics/GraphABC/Stamps/Stamp2.pas @@ -0,0 +1,37 @@ +// Класс штампа ряда прямоугольников +uses GraphABC; + +type + RectangleStamp = auto class + x,y,w,h: integer; + procedure Stamp; + begin + Rectangle(x,y,x+w,y+h); + end; + end; + + RowRectanglesStamp = auto class + x,y,w,h,n: integer; + procedure Stamp; + begin + var r := new RectangleStamp(x,y,w,h); + r.Stamp; + for var i:=1 to n-1 do + begin + r.x += r.w + 5; + r.Stamp; + end; + end; + end; + +const n=8; + +begin + var r := new RowRectanglesStamp(30,30,50,50,n); + r.Stamp; + for var i:=1 to n-1 do + begin + r.y += r.h + 5; + r.Stamp; + end; +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Stamps/Stamp3.pas b/Graphics/GraphABC/Stamps/Stamp3.pas new file mode 100644 index 0000000..e985dad --- /dev/null +++ b/Graphics/GraphABC/Stamps/Stamp3.pas @@ -0,0 +1,28 @@ +// Класс штампа прямоугольника с методами увеличения-уменьшения +uses GraphABC; + +type + RectangleStamp = auto class + x,y,w,h: integer; + procedure Stamp := Rectangle(x,y,x+w,y+h); + procedure Increase(dw,dh: integer); + begin + w += dw; h += dh; + end; + procedure Decrease(dw,dh: integer) := Increase(-dw,-dh); + procedure MoveOn(dx,dy: integer); + begin + x += dx; y += dy; + end; + end; + +begin + var r := new RectangleStamp(100,100,300,300); + r.Stamp; + while r.w>2 do + begin + r.Decrease(8,8); + r.MoveOn(4,4); + r.Stamp; + end; +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Stamps/Stamp4.pas b/Graphics/GraphABC/Stamps/Stamp4.pas new file mode 100644 index 0000000..0775030 --- /dev/null +++ b/Graphics/GraphABC/Stamps/Stamp4.pas @@ -0,0 +1,39 @@ +// Класс штампа прямоугольника с методами увеличения-уменьшения от центра +uses GraphABC; + +type + RectangleStamp = class + x,y,w,h: integer; + constructor (xx,yy,ww,hh: integer); + begin + x := xx; y := yy; + w := ww; h := hh; + end; + procedure Stamp; + begin + Rectangle(x,y,x+w,y+h); + end; + procedure IncreaseFromCenter(dw: integer); + begin + w += dw*2; h += dw*2; + x -= dw; y -= dw; + end; + procedure DecreaseFromCenter(dw: integer); + begin + IncreaseFromCenter(-dw); + end; + procedure MoveOn(dx,dy: integer); + begin + x += dx; y += dy; + end; + end; + +begin + var r := new RectangleStamp(100,100,300,300); + r.Stamp; + while r.w>2 do + begin + r.DecreaseFromCenter(4); + r.Stamp; + end; +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Stamps/Stamp5.pas b/Graphics/GraphABC/Stamps/Stamp5.pas new file mode 100644 index 0000000..abc6ca3 --- /dev/null +++ b/Graphics/GraphABC/Stamps/Stamp5.pas @@ -0,0 +1,36 @@ +// Класс штампа треугольника +uses GraphABC; + +type + TriangleStamp = auto class + x,y,w,orient: integer; + procedure Stamp; + begin + MoveTo(x,y); + var dx := w; + var dy := w; + case orient of + 2: dx := -dx; + 3: dy := -dy; + 4: begin dx := -dx; dy := -dy; end; + end; + LineTo(x+dx,y); + LineTo(x,y+dy); + LineTo(x,y); + end; + procedure MoveOn(dx,dy: integer); + begin + x += dx; y += dy; + end; + end; + +begin + var r := new TriangleStamp(200,200,100,1); + r.Stamp; + r.orient := 2; + r.Stamp; + r.orient := 3; + r.Stamp; + r.orient := 4; + r.Stamp; +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Stamps/StampCompound.pas b/Graphics/GraphABC/Stamps/StampCompound.pas new file mode 100644 index 0000000..f8f44be --- /dev/null +++ b/Graphics/GraphABC/Stamps/StampCompound.pas @@ -0,0 +1,77 @@ +// Класс штампа составного объекта +uses GraphABC; + +type + TextStamp = class + x,y,pt: integer; + Text: string; + constructor (xx,yy,ppt: integer; t: string); + begin + x := xx; y := yy; + pt := ppt; + text := t; + end; + procedure Stamp; + begin + Font.Size := pt; + Brush.Color := clWhite; + TextOut(x,y,text); + end; + procedure MoveOn(dx,dy: integer); + begin + x += dx; y += dy; + end; + end; + + RectangleStamp = class + x,y,w,h: integer; + constructor (xx,yy,ww,hh: integer); + begin + x := xx; y := yy; + w := ww; h := hh; + end; + procedure Stamp; + begin + Brush.Color := clRandom; + Rectangle(x,y,x+w,y+h); + end; + procedure MoveOn(dx,dy: integer); + begin + x += dx; y += dy; + end; + end; + + RectWithTextStamp = class + x,y,w,h: integer; + Text: string; + constructor (xx,yy,ww,hh: integer; t: string); + begin + x := xx; y := yy; + w := ww; h := hh; + text := t; + end; + procedure Draw; + begin + var r := new RectangleStamp(x,y,w,-h); + var t := new TextStamp(x,y+3,10,Text); + r.Stamp; + t.Stamp; + end; + procedure MoveOn(dx,dy: integer); + begin + x += dx; y += dy; + end; + end; + +begin + var a: array of integer := (100,70,50,120,90,200,111,150,230,11,44); + var rt := new RectWithTextStamp(100,300,30,a[0],IntToStr(a[0])); + rt.Draw; + for var i:=1 to a.Length-1 do + begin + rt.MoveOn(40,0); + rt.h := a[i]; + rt.Text := IntToStr(a[i]); + rt.Draw; + end; +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Stamps/StampCross.pas b/Graphics/GraphABC/Stamps/StampCross.pas new file mode 100644 index 0000000..43dbada --- /dev/null +++ b/Graphics/GraphABC/Stamps/StampCross.pas @@ -0,0 +1,51 @@ +// Класс штампа креста +uses GraphABC; + +type + CrossStamp = class + x,y,w: integer; + constructor (xx,yy,ww: integer); + begin + x := xx; y := yy; + w := ww; + end; + procedure Stamp; + begin + MoveTo(x,y); + LineTo(x+w,y); + LineTo(x+w,y+w); + LineTo(x+2*w,y+w); + LineTo(x+2*w,y); + LineTo(x+3*w,y); + LineTo(x+3*w,y-w); + LineTo(x+2*w,y-w); + LineTo(x+2*w,y-2*w); + LineTo(x+w,y-2*w); + LineTo(x+w,y-w); + LineTo(x,y-w); + LineTo(x,y); + end; + procedure MoveOn(dx,dy: integer); + begin + x += dx; y += dy; + end; + procedure MoveOnRel(a,b: integer); + begin + MoveOn(a*w,b*w); + end; + function Clone := new CrossStamp(x,y,w); + end; + +begin + var r := new CrossStamp(100,150,20); + for var k:=1 to 2 do + begin + var r1 := r.Clone; + for var i:=1 to 8 do + begin + r1.Stamp; + r1.MoveOnRel(2,1); + end; + r.MoveOnRel(-1,2); + end; +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Stamps/StampFunc.pas b/Graphics/GraphABC/Stamps/StampFunc.pas new file mode 100644 index 0000000..9357dc6 --- /dev/null +++ b/Graphics/GraphABC/Stamps/StampFunc.pas @@ -0,0 +1,79 @@ +// +uses GraphABC; + +type + FuncType = function (r: real): real; + FuncStamp = class + xs0,ys0,ws,hs: integer; + xf0,yf0,wf,hf: real; + f: FuncType; + constructor (xs0p,ys0p,xs1p,ys1p: integer; xf0p,yf0p,xf1p,yf1p: real; ff: FuncType); + begin + SetScreenWindow(xs0p,ys0p,xs1p,ys1p); + SetFuncWindow(xf0p,yf0p,xf1p,yf1p); + f := ff; + end; + function WorldToScreenX(xf: real): integer; + begin + var a := ws/wf; + var b := xs0-a*xf0; + Result := Round(a * xf + b); + end; + function WorldToScreenY(yf: real): integer; + begin + var c := hs/hf; + var d := ys0-c*yf0; + Result := hs + 2*ys0 - Round(c * yf + d); + end; + procedure Stamp; + const n = 100; + begin + Pen.Color := Color.Gray; + Rectangle(xs0,ys0,xs0+ws,ys0+hs); + Pen.Color := Color.Black; + var x := xf0; + var y := f(x); + var h := wf/n; + var xs := WorldToScreenX(x); + var ys := WorldToScreenY(y); + MoveTo(xs,ys); + for var i:=1 to n do + begin + x += h; + y := f(x); + xs := WorldToScreenX(x); + ys := WorldToScreenY(y); + LineTo(xs,ys); + end; + end; + procedure SetScreenWindow(xs0p,ys0p,xs1p,ys1p: integer); + begin + xs0 := xs0p; ys0 := ys0p; + ws := xs1p-xs0p; hs := ys1p-ys0p; + end; + procedure SetFuncWindow(xf0p,yf0p,xf1p,yf1p: real); + begin + xf0 := xf0p; yf0 := yf0p; + wf := xf1p-xf0p; hf := yf1p-yf0p; + end; + procedure MoveOn(dx,dy: integer); + begin + xs0 += dx; ys0 += dy; + end; + end; + +begin + var fs := new FuncStamp(10,10,310,230,0,-2*Pi,2*Pi,2*Pi,x->x*sin(5*x)); + fs.Stamp; + fs.MoveOn(320,0); + fs.SetFuncWindow(-Pi,-1,Pi,1); + fs.f := sin; + fs.Stamp; + fs.MoveOn(-320,240); + fs.f := cos; + fs.Stamp; + fs.MoveOn(320,0); + fs.SetFuncWindow(-2*Pi,-2,2*Pi,2); + fs.f := x->sin(3*x)+sin(4*x); + fs.Stamp; +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Stamps/StampPoly.pas b/Graphics/GraphABC/Stamps/StampPoly.pas new file mode 100644 index 0000000..ced69f1 --- /dev/null +++ b/Graphics/GraphABC/Stamps/StampPoly.pas @@ -0,0 +1,49 @@ +// Класс штампа правильного многоугольника +uses GraphABC; + +type + RegularPolygonStamp = class + x,y,r: real; + n: integer; + constructor (xx,yy,rr: real; nn: integer); + begin + x := xx; y := yy; + r := rr; n := nn; + end; + procedure Stamp; + begin + var t := 0.0; + var xr := r*cos(t); + var yr := r*sin(t); + MoveTo(Round(x + xr),Round(y + yr)); + for var i:=1 to n do + begin + t += 2*Pi/n; + xr := Round(r*cos(t)); + yr := Round(r*sin(t)); + LineTo(Round(x + xr),Round(y + yr)); + end; + end; + procedure MoveOn(dx,dy: real); + begin + x += dx; y += dy; + end; + function Clone: RegularPolygonStamp; + begin + Result := new RegularPolygonStamp(x,y,r,n); + end; + end; + +begin + var r := new RegularPolygonStamp(Window.Center.X,Window.Center.Y,50,6); + r.Stamp; + var t := 2*Pi/12; + var rr := r.r*sqrt(3)+10; + for var i:=1 to 6 do + begin + var r1 := r.Clone; + r1.MoveOn(rr*cos(t),rr*sin(t)); + r1.Stamp; + t += 2*Pi/6; + end; +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Stamps/StampText.pas b/Graphics/GraphABC/Stamps/StampText.pas new file mode 100644 index 0000000..71b1742 --- /dev/null +++ b/Graphics/GraphABC/Stamps/StampText.pas @@ -0,0 +1,25 @@ +// Класс штампа текста +uses GraphABC; + +type + TextStamp = auto class + x,y,pt: integer; + Text: string; + procedure Stamp; + begin + Font.Size := pt; + TextOut(x,y,text); + end; + procedure MoveOn(dx,dy: integer); + begin + x += dx; y += dy; + end; + end; + +begin + var txt := new TextStamp(200,200,14,'Привет!'); + txt.Stamp; + txt.MoveOn(0,40); + txt.Text := 'До свидания!'; + txt.Stamp; +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Star.pas b/Graphics/GraphABC/Star.pas new file mode 100644 index 0000000..76054f2 --- /dev/null +++ b/Graphics/GraphABC/Star.pas @@ -0,0 +1,17 @@ +uses GraphABC; + +const + n = 17; // количество точек + n1 = 7; // через сколько точек соединять + +begin + var a := -Pi/2; + var Center := Window.Center; + var Radius := Window.Height/2.2; + MoveTo(Round(Center.X+Radius*cos(a)),Round(Center.Y+Radius*sin(a))); + for var i:=1 to n do + begin + a += n1*2*Pi/n; + LineTo(Round(Center.X+Radius*cos(a)),Round(Center.Y+Radius*sin(a))); + end; +end. \ No newline at end of file diff --git a/Graphics/GraphABC/Tentacles.pas b/Graphics/GraphABC/Tentacles.pas new file mode 100644 index 0000000..1de368e --- /dev/null +++ b/Graphics/GraphABC/Tentacles.pas @@ -0,0 +1,82 @@ +//Программа "Щупальца". Порт с midletPascal :) + +uses + GraphABC; + +const + S = 14; // Кол-во щупалец + N = 18; // Кол-во звеньев в каждом из них + W = 2; //Ширина щупалец + +var + i, j: Integer; + x, y: Real; + tx, ty: Real; + k, d: Real; + + // Углы поворота звеньев относительно друг-друга + a: array [1..N] of Real; + + // Длина одного звена + len: Real; + +begin + Pen.Width := W; + SetWindowSize(320, 320); + SetWindowTitle('Щупальца'); + + if Window.Width > Window.Height then + len := Window.Height / 1.8 / N + else + len := Window.Width / 1.8 / N; + k := random(360) * pi / 180; + d := pi * 2 / S; + + var k1 := 1; + + // Главный цикл + repeat + + if Window.Width > Window.Height then + len := Window.Height / 1.8 / N + else + len := Window.Width / 1.8 / N; + + LockDrawing(); //Блокируем рисование(для оптимизации) + ClearWindow(ClBlack); // Стираем всё + + // Расчёт коэфицента поворота + if random(50) = 0 then + k := random(360) * pi / 180; + + // Поворот всех щупалец + a[1] := a[1] + sin(k) / 15; + + // Интерполяция углов между щупальцами + for i := 2 to N do + a[i] := a[i] + (a[i - 1] - a[i]) * 0.1; + for j := 0 to S - 1 do + begin + x := 0.5 * Window.Width; + y := 0.5 * Window.Height; + for i := 2 to N do + begin + SetPenColor(Color.FromArgb(255, trunc(255 - 255 * i / N), 255)); + + // Немного школьной тригонометрии :) + tx := x + cos(j * d + a[i]) * len; + ty := y + sin(j * d + a[i]) * len; + Line(trunc(x), trunc(y), trunc(tx), trunc(ty)); + x := tx; + y := ty; + end; + end; + Redraw(); //Перерисуем изображение + + k1 += 1; + SetWindowTitle('Щупальца( Средн. FPS ' + Format('{0,5:f2}',k1/Milliseconds*1000)+')'); + + sleep(5); + until false; + +end. \ No newline at end of file diff --git a/Graphics/GraphABC/ThroughTheUniverse.pas b/Graphics/GraphABC/ThroughTheUniverse.pas new file mode 100644 index 0000000..a6840cd --- /dev/null +++ b/Graphics/GraphABC/ThroughTheUniverse.pas @@ -0,0 +1,85 @@ +//Программа "Скозь вселенную". Порт с midletPascal + +uses GraphABC; + + type + // Описываем тип-элемент Звезда + TStar = record + X, Y, Z : real; // Положение в пространстве + end; + + const + MAX_STARS = 1000; // Кол-во звёздочек + SPEED = 200; // Скорость, в единицах/сек + + var + i : Integer; + // Наши звёздочки :) + Stars : array [1..MAX_STARS] of TStar; + // Ширина и высота дисплея + scr_W : Integer; + scr_H : Integer; + // Время + time, dt : Integer; + + // Рисует текущую звёздочку (i), цвета (c) + procedure SetPix(c: Integer); + var + sx, sy : Integer; + begin + // Данные действия, проецируют 3D точку на 2D полоскость дисплея + try + sx := trunc(scr_W / 2 + Stars[i].X * 200 / (Stars[i].Z + 200)); + sy := trunc(scr_H / 2 - Stars[i].Y * 200 / (Stars[i].Z + 200)); + except + end; + + try + SetPixel(sx, sy, Color.FromArgb(c, c, c)); + except + end; + end; + + begin + MaximizeWindow(); + scr_W := Window.Width; + scr_H := Window.Height; + + //случайным образом раскидаем звёздочки + randomize; + for i := 1 to MAX_STARS do + begin + Stars[i].X := random(scr_W * 4) - scr_W * 2; + Stars[i].Y := random(scr_H * 4) - scr_H * 2; + Stars[i].Z := random(1900); + end; + + // Очистка содержимого дисплея (чёрный цвет) + ClearWindow(Color.Black); + + time := Milliseconds; + // Главный цикл отрисовки + repeat + scr_W := Window.Width; + scr_H := Window.Height; + dt := Milliseconds - time; // Сколько мс прошло, с прошлой отрисовки + time := Milliseconds; // Засекаем время + for i := 1 to MAX_STARS do + begin + // Затираем звёздочку с предыдущего кадра + SetPix(0); + // Изменяем её позицию в зависимости прошедшего с последней отрисовки времени + Stars[i].Z := Stars[i].Z - SPEED * dt/1000; + // Если звезда "улетела" за позицию камеры - генерируем её вдали + if Stars[i].Z <= -200 then + begin + Stars[i].X := random(scr_W * 4) - scr_W * 2; + Stars[i].Y := random(scr_H * 4) - scr_H * 2; + Stars[i].Z := 1900; // Откидываем звезду далеко вперёд :) + end; + // Рисуем звёздочку в новом положении (цвет зависит от Z координаты) + SetPix(trunc(255 - 255 * (Stars[i].Z + 200) / 2100)); + end; + sleep(10); + until false; + end. \ No newline at end of file diff --git a/Graphics/GraphABC/graph3d.pas b/Graphics/GraphABC/graph3d.pas new file mode 100644 index 0000000..ea0587a --- /dev/null +++ b/Graphics/GraphABC/graph3d.pas @@ -0,0 +1,64 @@ +// Пример из пакета KuMir/PMir +// Публикуется практически без изменений +// Дорог как память :) +Uses GraphABC; + +var Xmin,Xmax,Xstep: real; + Ymin,Ymax,Ystep,asp: real; + dx: integer; + +function f(x,y:real): integer; +var r: real; +begin + r := x*x+y*y+1; + f := round(5*asp*(cos(r)/r+0.1)) +end; + +procedure gr(N : integer); +var X,Y: real; + i,j,k,Z0,dy: integer; + pred: array [1..100] of integer; + jj,maxX,maxY: integer; +begin + Xmin := -4; + Xmax := 4; + Ymin := -3; + Ymax := 3; + maxX := 600; + maxY := 400; + Xstep := dx*(Xmax-Xmin)/maxX; + X := Xmin; + Ystep := (Ymax-Ymin)/N; + Y := Ymin; + dy := maxY div N div 2; + asp := maxY/8; + for i := 1 to N do + begin + pred[i] := maxY-i*dy-f(X,Y); + Y := Y + Ystep + end; + for jj := 1 to maxX div dx do + begin + j := jj*dx; + X := X + Xstep; + Y := Ymin; Z0 := maxY; + for i := 1 to N do + begin + k := maxY-i*dy-f(X,Y); + if k real); + var + xl0,wl,yl0,hl: real; + xs0,ws,ys0,hs: integer; + + function LtoSx(xl: real) := round(ws/wl*(xl-xl0)+xs0); + function LtoSy(yl: real) := round(hs/hl*(yl-yl0)+ys0); + function StoLx(xs: integer) := wl/ws*(xs-xs0)+xl0; + +begin // drawGraph + xs0 := 0; + ys0 := WindowHeight-1; + ws := WindowWidth; + hs := WindowHeight-1; + + xl0 := x1; + wl := x2-x1; + + var yi: array of real; + SetLength(yi,ws+1); + + var min := real.MaxValue; + var max := real.MinValue; + for var xi:=0 to ws do + begin + yi[xi] := f(StoLx(xi+xs0)); + if yi[xi]max then + max := yi[xi]; + end; + + yl0 := min; + hl := -(max-min); + + // Нарисовать оси системы координат + Line(0,LtoSy(0),ws,LtoSy(0)); + Line(LtoSx(0),0,LtoSx(0),hs); + + Pen.Color := clBlue; + MoveTo(xs0,LtoSy(yi[0])); + for var xi:=xs0+1 to xs0+ws do + LineTo(xi,LtoSy(yi[xi-xs0])); +end; + +procedure Resize; +begin + ClearWindow; + drawGraph(0,60,f); + Redraw; +end; + +begin + LockDrawing; + SetWindowCaption('График функции: масштабирование'); + drawGraph(0,60,f); + Redraw; + OnResize := Resize; +end. diff --git a/Graphics/GraphABC/rain.pas b/Graphics/GraphABC/rain.pas new file mode 100644 index 0000000..17f971f --- /dev/null +++ b/Graphics/GraphABC/rain.pas @@ -0,0 +1,27 @@ +// Имитация кругов на воде от капель дождя +uses GraphABC; + +const speed = 2; + +procedure Kaplia(x0,y0: integer); +begin + var r := 1; + for var i:=0 to 63 do + begin + Pen.Color := RGB(i*4,i*4,i*4); + Circle(x0,y0,r); + if i mod speed = 0 then Sleep(10); + Pen.Color := clWhite; + Circle(x0,y0,r); + r += 2; + end; +end; + +const z=50; + +begin + Window.Title := 'Капли дождя'; + SetWindowSize(800,600); + while True do + Kaplia(Random(z,WindowWidth-z),Random(z,WindowHeight-z)); +end. diff --git a/Graphics/GraphWPF/4.pdf b/Graphics/GraphWPF/4.pdf new file mode 100644 index 0000000..3570a97 Binary files /dev/null and b/Graphics/GraphWPF/4.pdf differ diff --git a/Graphics/GraphWPF/ArcSector.pas b/Graphics/GraphWPF/ArcSector.pas new file mode 100644 index 0000000..b67e15e --- /dev/null +++ b/Graphics/GraphWPF/ArcSector.pas @@ -0,0 +1,15 @@ +uses GraphWPF; + +begin + Window.Title := 'Дуги и секторы'; + var (x,y) := (200,Window.Height/2); + Circle(x,y,5); + for var i:=1 to 18*2 do + Arc(x,y,5*i,0,10*i); + (x,y) := (600,Window.Height/2); + for var i:=1 to 12 do + begin + Brush.Color := RandomColor; + Sector(x,y,180,30*(i-1),30*i); + end; +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/Clock.pas b/Graphics/GraphWPF/Clock.pas new file mode 100644 index 0000000..ceddd11 --- /dev/null +++ b/Graphics/GraphWPF/Clock.pas @@ -0,0 +1,10 @@ +uses GraphWPF; + +begin + Window.Title := 'Цифровые часы'; + Font.Size := 180; + BeginFrameBasedAnimation( + ()->DrawText(Window.ClientRect,DateTime.Now.ToLongTimeString.Replace(' AM',''),Colors.Red), + 1 + ); +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/CurjaMurja.pas b/Graphics/GraphWPF/CurjaMurja.pas new file mode 100644 index 0000000..91574aa --- /dev/null +++ b/Graphics/GraphWPF/CurjaMurja.pas @@ -0,0 +1,36 @@ +uses GraphWPF; + +begin + Window.Title := 'Всякая Курья Мурья'; + Pen.Width := 0.5; + Brush.Color := RGB(128,200,100); + Ellipse(100,100,30,20); + Brush.Color := RandomColor; + Circle(170,100,20); + Brush.Color := RandomColor; + Rectangle(220,80,70,50); + Line(220,80,220+70,80+50); + //DrawImage(200,140,'cofe.jpg'); + Brush.Color := RGB(200,200,255); + Polygon(Arr(Pnt(20,20),Pnt(20,120),Pnt(120,20))); + Brush.Color := Colors.Black; + for var i:=0 to 400 do + Rectangle(1+2*i,2,0,0); + Font.Size := 30; + Font.Color := Colors.Red; + TextOut(0,0,'Hello'); + Font.Size := 40; + Font.Color := Colors.Blue; + Font.Name := 'Times New Roman'; + Font.Style := FontStyle.BoldItalic; + TextOut(200,0,'Привет'); + Sleep(1000); + Window.Save('1.png'); + Window.Title := 'Сохранили'; + Sleep(1000); + Window.Clear; + Window.Title := 'Очистили'; + Sleep(1000); + Window.Load('1.png'); + Window.Title := 'Загрузили'; +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/DrawCircleByMouse.pas b/Graphics/GraphWPF/DrawCircleByMouse.pas new file mode 100644 index 0000000..75b1057 --- /dev/null +++ b/Graphics/GraphWPF/DrawCircleByMouse.pas @@ -0,0 +1,16 @@ +uses GraphWPF; + +begin + var x1,y1: real; + var c: Color; + OnMouseDown := procedure(x,y,mb) -> begin + (x1,y1) := (x,y); + c := RandomColor; + end; + OnMouseMove := procedure(x,y,mb) -> if mb=1 then + begin + var r := Sqrt(Sqr(x1-x)+Sqr(y1-y)); + Window.Clear; + Circle(x1,y1,r,c); + end; +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/DrawGraphic.pas b/Graphics/GraphWPF/DrawGraphic.pas new file mode 100644 index 0000000..aada7bd --- /dev/null +++ b/Graphics/GraphWPF/DrawGraphic.pas @@ -0,0 +1,11 @@ +uses GraphWPF; + +begin + Window.Title := 'Графики функций'; + var ww := Window.Width / 2; + var hh := Window.Height / 2; + DrawGraph(x -> sin(4 * x) + cos(3 * x), -5, 5, 0, 0, ww, hh, 'sin(4 * x) + cos(3 * x)'); + DrawGraph(x -> x * x, -5, 5, ww - 1, 0, ww, hh, 'x * x'); + DrawGraph(x -> exp(x), -3, 3, 0, 10, 0, hh-1, ww, hh, 'exp(x)'); + DrawGraph(x -> x*cos(2*x-1), -15, 15, ww - 1, hh-1, ww, hh, 'x * cos(2*x-1)'); +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/DrawPixels.pas b/Graphics/GraphWPF/DrawPixels.pas new file mode 100644 index 0000000..ae64a98 --- /dev/null +++ b/Graphics/GraphWPF/DrawPixels.pas @@ -0,0 +1,9 @@ +uses GraphWPF; + +begin + Window.SetSize(640, 480); + var m := MatrGen(640,480,(x,y)->RGB(2 * x - y, x - 3 * y, x + y)); + MillisecondsDelta.Println; + DrawPixels(0,0,m); + MillisecondsDelta.Println; +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/EllRectInWindow.pas b/Graphics/GraphWPF/EllRectInWindow.pas new file mode 100644 index 0000000..12386e2 --- /dev/null +++ b/Graphics/GraphWPF/EllRectInWindow.pas @@ -0,0 +1,7 @@ +uses GraphWPF; + +begin + Pen.Width := 1; + Rectangle(0,0,Window.Width-1,Window.Height-1); + Ellipse((Window.Width-1)/2,(Window.Height-1)/2,(Window.Width-1)/2,(Window.Height-1)/2); +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/Ellipses.pas b/Graphics/GraphWPF/Ellipses.pas new file mode 100644 index 0000000..0c721b4 --- /dev/null +++ b/Graphics/GraphWPF/Ellipses.pas @@ -0,0 +1,14 @@ +uses GraphWPF; + +begin + Window.Title := 'Рисование эллипсов'; + Pen.Width := 1; + var n := 20000; + for var i:=1 to n do + begin + if i mod 10000 = 0 then + Println(i,MillisecondsDelta); + Brush.Color := RandomColor; + Ellipse(Random(800),Random(600),Random(20),Random(20)); + end; +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/IsFixedSize.pas b/Graphics/GraphWPF/IsFixedSize.pas new file mode 100644 index 0000000..71350ba --- /dev/null +++ b/Graphics/GraphWPF/IsFixedSize.pas @@ -0,0 +1,8 @@ +uses GraphWPF; + +begin + Window.IsFixedSize := True; + Print(Window.IsFixedSize); + Window.IsFixedSize := False; + Print(Window.IsFixedSize); +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/MandelbrotWPF.pas b/Graphics/GraphWPF/MandelbrotWPF.pas new file mode 100644 index 0000000..66fc936 --- /dev/null +++ b/Graphics/GraphWPF/MandelbrotWPF.pas @@ -0,0 +1,44 @@ +// Демонстрация фрактальной графики. Множество Мандельброта +// Для каждой точки комплексной плоскости z=(x,y) выполняем итерационный процесс z=z*2+c, c=(cx,cy) +// Считаем количество итераций i до тех пор пока не выполнится условие |z|>max +// После этого рисуем точку z=(x,y) с насыщенностью красного цвета, пропорциональной i +uses GraphWPF; + +const + max = 10; + coef1 = 0.5; + coef2 = 0.88; + scalex = 0.0035; + scaley = 0.0035; + dx = 430; + dy = 300; + +begin + Window.Title := 'Фракталы: множество Мандельброта'; + Window.SetSize(600,600); + Window.CenterOnScreen; + var m := Window.Width.Round; + var n := Window.Height.Round; + var a := new Color[m,n]; + for var ix:=0 to m-1 do + for var iy:=0 to n-1 do + begin + var cx := scalex * (ix - dx); + var cy := scaley * (iy - dy); + var c := Cplx(cx,cy); + var z := Cplx(0,0); + + var i := 1; + while i<255 do + begin + z := z*z+c; + if z.Magnitude>max then break; + i += 1; + end; + if i>=255 then a[ix,iy] := Colors.Red + else a[ix,iy] := RGB(255,255-i,255-i); + end; + DrawPixels(0,0,a); + Writeln('Время расчета = ',Milliseconds/1000,' с'); +end. + diff --git a/Graphics/GraphWPF/OnDrawFrame1.pas b/Graphics/GraphWPF/OnDrawFrame1.pas new file mode 100644 index 0000000..c3df477 --- /dev/null +++ b/Graphics/GraphWPF/OnDrawFrame1.pas @@ -0,0 +1,11 @@ +uses GraphWPF; + +begin + var x0 := 100.0; + var v := 100; + OnDrawFrame := dt -> + begin + x0 += v * dt; + Circle(x0,100,30,Colors.Yellow); + end; +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/SetPixel.pas b/Graphics/GraphWPF/SetPixel.pas new file mode 100644 index 0000000..dc84cf1 --- /dev/null +++ b/Graphics/GraphWPF/SetPixel.pas @@ -0,0 +1,9 @@ +uses GraphWPF; + +begin + Window.SetSize(640, 480); + for var x := 0 to Window.Width.Round do + for var y := 0 to Window.Height.Round do + SetPixel(x, y, RGB(2 * x - y, x - 3 * y, x + y)); + Milliseconds.Println; +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/SetPixels.pas b/Graphics/GraphWPF/SetPixels.pas new file mode 100644 index 0000000..008fc2f --- /dev/null +++ b/Graphics/GraphWPF/SetPixels.pas @@ -0,0 +1,7 @@ +uses GraphWPF; + +begin + Window.SetSize(640, 480); + SetPixels(0,0,640,480,(x, y)->RGB(2 * x - y, x - 3 * y, x + y)); + Milliseconds.Println; +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/TextOutFontWith.pas b/Graphics/GraphWPF/TextOutFontWith.pas new file mode 100644 index 0000000..a12ee06 --- /dev/null +++ b/Graphics/GraphWPF/TextOutFontWith.pas @@ -0,0 +1,9 @@ +uses GraphWPF; + +begin + Window.Title := 'Использование FontOptions'; + TextOut(10,10,'Обычный'); + TextOut(10,40,'Жирный',Font.WithStyle(FontStyle.Bold)); + TextOut(10,70,'20 пунктов',Font.WithSize(20)); + TextOut(10,110,'Наклонный синий',Font.WithColor(Colors.Blue).WithStyle((FontStyle.Italic))); +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/anim1.pas b/Graphics/GraphWPF/anim1.pas new file mode 100644 index 0000000..0160433 --- /dev/null +++ b/Graphics/GraphWPF/anim1.pas @@ -0,0 +1,16 @@ +uses GraphWPF; + +begin + Window.Title := 'Простая анимация'; + var x := 30; + Brush.Color := Colors.Beige; + Circle(x,50,20); + loop 600 do + begin + Sleep(10); + Window.Clear; + x += 1; + Circle(x,50,20); + Window.Title := '' + (Milliseconds div 100)/10; + end; +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/anim2.pas b/Graphics/GraphWPF/anim2.pas new file mode 100644 index 0000000..d9a0a6d --- /dev/null +++ b/Graphics/GraphWPF/anim2.pas @@ -0,0 +1,25 @@ +uses GraphWPF; + +begin + Window.Title := 'Отражение шарика. Вещественное направление движения'; + Brush.Color := Colors.Beige; + var x := 400.0; + var y := 300.0; + var dx := 2.1; + var dy := -1.2; + Circle(x,y,20); + while True do + begin + Sleep(10); + Window.Clear; + x += dx; + y += dy; + if not x.Between(0,Window.Width) then + dx := -dx; + if not y.Between(0,Window.Height) then + dy := -dy; + Circle(x,y,20); + if Milliseconds>2000 then + Window.Title := 'Секунды: ' + (Milliseconds div 100)/10; + end; +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/anim4.pas b/Graphics/GraphWPF/anim4.pas new file mode 100644 index 0000000..4d2d5a6 --- /dev/null +++ b/Graphics/GraphWPF/anim4.pas @@ -0,0 +1,45 @@ +uses GraphWPF; + +function RandomReal(a,b: real): real := Random*(b-a)+a; + +type + BallInfo = auto class + x,y,r,dx,dy: real; + c: Color; + procedure Move := (x,y) := (x+dx,y+dy); + procedure Draw := FillCircle(x,y,r,c); + procedure CheckDirection; + begin + if not x.Between(r,Window.Width-r) then + dx := -dx; + if not y.Between(r,Window.Height-r) then + dy := -dy; + end; + procedure Step; + begin + Move; + CheckDirection; + Draw; + end; + class function CreateRandomBallArray(n: integer): array of BallInfo; + begin + var rr := 20; + Result := ArrGen(n,i->new BallInfo(RandomReal(rr,Window.Width-rr), + RandomReal(rr,Window.Height-rr),RandomReal(5,15), + RandomReal(-3,3),RandomReal(-3,3),RandomColor)); + end; + end; + +begin + Window.Title := 'Отражение шариков. Анимация на основе кадра'; + + var n := 1000; + var a := BallInfo.CreateRandomBallArray(n); + + BeginFrameBasedAnimation(()-> + foreach var ball in a do + ball.Step + ); + + //BeginFrameBasedAnimation(()->a.ForEach(ball->ball.Step)); +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/anim5.pas b/Graphics/GraphWPF/anim5.pas new file mode 100644 index 0000000..9dd84de --- /dev/null +++ b/Graphics/GraphWPF/anim5.pas @@ -0,0 +1,44 @@ +uses GraphWPF; + +const vmax = 50; + +function RandomReal(a,b: real): real := Random*(b-a)+a; + +type + BallInfo = auto class + x,y,r,vx,vy: real; + c: Color; + procedure Move(dt: real) := (x,y) := (x+vx*dt,y+vy*dt); + procedure Draw := FillCircle(x,y,r,c); + procedure CheckDirection; + begin + if not x.Between(r,Window.Width-r) then + vx := -vx; + if not y.Between(r,Window.Height-r) then + vy := -vy; + end; + procedure Step(dt: real); + begin + Move(dt); + CheckDirection; + Draw; + end; + class function CreateRandomBallArray(n: integer): array of BallInfo; + begin + var rr := 25; + Result := ArrGen(n,i->new BallInfo(RandomReal(rr,Window.Width-rr), + RandomReal(rr,Window.Height-rr),RandomReal(5,15), + RandomReal(-vmax,vmax),RandomReal(-vmax,vmax),RandomColor)); + end; + end; + +begin + Window.Title := 'Отражение шариков. Анимация на основе кадра'; + + var n := 1000; + var a := BallInfo.CreateRandomBallArray(n); + + OnDrawFrame := dt -> + foreach var ball in a do + ball.Step(dt); +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/mouse1.pas b/Graphics/GraphWPF/mouse1.pas new file mode 100644 index 0000000..8349d01 --- /dev/null +++ b/Graphics/GraphWPF/mouse1.pas @@ -0,0 +1,6 @@ +uses GraphWPF; + +begin + OnMouseDown := (x,y,mb) -> if mb=1 then Circle(x,y,5); + OnKeyDown := k -> Print(k); +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/mouse2.pas b/Graphics/GraphWPF/mouse2.pas new file mode 100644 index 0000000..af3d6a8 --- /dev/null +++ b/Graphics/GraphWPF/mouse2.pas @@ -0,0 +1,10 @@ +uses GraphWPF; + +begin + Window.Title := 'Рисование мышью'; + Pen.Color := Colors.Blue; + Pen.Width := 3; + OnMouseDown := (x,y,mb) -> MoveTo(x,y); + OnMouseMove := (x,y,mb) -> if mb=1 then LineTo(x,y); + OnKeyDown := k -> if k = Key.Space then Window.Save('a.png'); +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/ВсеТочкиМногоугольника.pas b/Graphics/GraphWPF/ВсеТочкиМногоугольника.pas new file mode 100644 index 0000000..426ac86 --- /dev/null +++ b/Graphics/GraphWPF/ВсеТочкиМногоугольника.pas @@ -0,0 +1,12 @@ +uses GraphWPF; + +procedure ВсеТочкиМногоугольника(x0,y0,r: real; n: integer); +begin + var q := PartitionPoints(0,2*Pi,n).Select(a->Pnt(x0 + r * Cos(a), y0 - r * Sin(a))); + q.Cartesian(q).ForEach(p->Line(p[0].x,p[0].y,p[1].x,p[1].y,RandomColor)); +end; + +begin + Pen.Width := 0.5; + ВсеТочкиМногоугольника(400,300,290,30) +end. diff --git a/Graphics/GraphWPF/ВыравниваниеТекста1.pas b/Graphics/GraphWPF/ВыравниваниеТекста1.pas new file mode 100644 index 0000000..de8e67e --- /dev/null +++ b/Graphics/GraphWPF/ВыравниваниеТекста1.pas @@ -0,0 +1,30 @@ +uses GraphWPF; + +begin + Window.Title := 'Выравнивание шрифта'; + Font.Size := 20; + var (x,y) := (200,200); + var (w,h) := (400,200); + DrawRectangle(x,y,w,h); + DrawText(x,y,w,h,'LeftTop',Alignment.LeftTop); + DrawText(x,y,w,h,'LeftCenter',Alignment.LeftCenter); + DrawText(x,y,w,h,'LeftBottom',Alignment.LeftBottom); + DrawText(x,y,w,h,'CenterTop',Alignment.CenterTop); + DrawText(x,y,w,h,'Center'); + DrawText(x,y,w,h,'CenterBottom',Alignment.CenterBottom); + DrawText(x,y,w,h,'RightTop',Alignment.RightTop); + DrawText(x,y,w,h,'RightCenter',Alignment.RightCenter); + DrawText(x,y,w,h,'RightBottom',Alignment.RightBottom); + // Выравнивание относительно точки + TextOut(150,100,'PointRightBottom',Alignment.RightBottom); + TextOut(150,100,'PointRightTop',Alignment.RightTop); + TextOut(150,100,'PointLeftTop',Alignment.LeftTop); + TextOut(150,100,'PointLeftBottom',Alignment.LeftBottom); + FillCircle(150,100,5,Colors.Red); + TextOut(600,100,'PointCenterTop',Alignment.CenterTop); + TextOut(600,100,'PointCenterBottom',Alignment.CenterBottom); + FillCircle(600,100,5,Colors.Red); + TextOut(400,500,'PointLeftCenter',Alignment.LeftCenter); + TextOut(400,500,'PointRightCenter',Alignment.RightCenter); + FillCircle(400,500,5,Colors.Red); +end. diff --git a/Graphics/GraphWPF/ВыравниваниеТекста2.pas b/Graphics/GraphWPF/ВыравниваниеТекста2.pas new file mode 100644 index 0000000..f8e6229 --- /dev/null +++ b/Graphics/GraphWPF/ВыравниваниеТекста2.pas @@ -0,0 +1,34 @@ +uses GraphWPF; + +begin + Window.Title := 'Выравнивание шрифта'; + Font.Size := 20; + + var sc := 40; + SetMathematicCoords; + + var (x,y) := (-5,-2); + var (w,h) := (10,4); + DrawRectangle(x,y,w,h); + DrawText(x,y,w,h,'LeftTop',Alignment.LeftTop); + DrawText(x,y,w,h,'LeftCenter',Alignment.LeftCenter); + DrawText(x,y,w,h,'LeftBottom',Alignment.LeftBottom); + DrawText(x,y,w,h,'CenterTop',Alignment.CenterTop); + DrawText(x,y,w,h,'Center'); + DrawText(x,y,w,h,'CenterBottom',Alignment.CenterBottom); + DrawText(x,y,w,h,'RightTop',Alignment.RightTop); + DrawText(x,y,w,h,'RightCenter',Alignment.RightCenter); + DrawText(x,y,w,h,'RightBottom',Alignment.RightBottom); + // Выравнивание относительно точки + TextOut(-5,5,'PointRightBottom',Alignment.RightBottom); + TextOut(-5,5,'PointRightTop',Alignment.RightTop); + TextOut(-5,5,'PointLeftTop',Alignment.LeftTop); + TextOut(-5,5,'PointLeftBottom',Alignment.LeftBottom); + FillCircle(-5,5,0.1,Colors.Red); + TextOut(5,5,'PointCenterTop',Alignment.CenterTop); + TextOut(5,5,'PointCenterBottom',Alignment.CenterBottom); + FillCircle(5,5,0.1,Colors.Red); + TextOut(5,-5,'PointLeftCenter',Alignment.LeftCenter); + TextOut(5,-5,'PointRightCenter',Alignment.RightCenter); + FillCircle(5,-5,0.1,Colors.Red); +end. diff --git a/Graphics/GraphWPF/Многоугольник.pas b/Graphics/GraphWPF/Многоугольник.pas new file mode 100644 index 0000000..2d6e3c8 --- /dev/null +++ b/Graphics/GraphWPF/Многоугольник.pas @@ -0,0 +1,20 @@ +uses GraphWPF; + +procedure Многоугольник(x0,y0,r: real; n: integer); +begin + var a := Pi / 2; + MoveTo(x0 + r * Cos(a), y0 - r * Sin(a)); + loop n do + begin + a += 2 * Pi / n; + //FillCircle(x0 + r * Cos(a), y0 - r * Sin(a),3,Colors.Black); + LineTo(x0 + r * Cos(a), y0 - r * Sin(a)); + end; +end; + +begin + var (x0,y0) := (400.0,300.0); + var r := 30.0; + for var n := 3 to 11 do + Многоугольник(x0,y0,r+(n-3)*30,n) +end. diff --git a/Graphics/GraphWPF/Многоугольник1.pas b/Graphics/GraphWPF/Многоугольник1.pas new file mode 100644 index 0000000..b065061 --- /dev/null +++ b/Graphics/GraphWPF/Многоугольник1.pas @@ -0,0 +1,9 @@ +uses GraphWPF; + +begin + var (n,r) := (9,250); + var a := ArrGen(n, i -> Window.Center + r * Vect(Cos(i*2*Pi/n),Sin(i*2*Pi/n))); + foreach var p in a.Combinations(2) do + Line(p[0], p[1]); + //a.Combinations(2).ForEach(p -> Line(p[0], p[1])); +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/Светофор.pas b/Graphics/GraphWPF/Светофор.pas new file mode 100644 index 0000000..26176c9 --- /dev/null +++ b/Graphics/GraphWPF/Светофор.pas @@ -0,0 +1,19 @@ +uses GraphWPF; + +procedure Светофор(x,y,r: real); +begin + Rectangle(x,y,4*r,10*r,Colors.LightGray); + x += 2*r; + y += 2*r; + var dy := 3*r; + + Circle(x,y,r,Colors.Red); + Circle(x,y + dy,r,Colors.Yellow); + Circle(x,y + 2*dy,r,Colors.Green); +end; + +begin + Pen.Width := 2; + Window.Title := 'Светофор'; + Светофор(150,40,50); +end. \ No newline at end of file diff --git a/Graphics/GraphWPF/Система координат.pas b/Graphics/GraphWPF/Система координат.pas new file mode 100644 index 0000000..343c23e --- /dev/null +++ b/Graphics/GraphWPF/Система координат.pas @@ -0,0 +1,18 @@ +uses GraphWPF; + +begin + Window.Title := 'Система координат'; + Font.Size := 20; + + // SetMathematicCoords; // так тоже можно + // SetMathematicCoords(-10,10); // так тоже можно + SetMathematicCoords(-10,10,-9.2); + DrawGrid; + + Print('Видимые координаты:',XMin,XMax,YMin,YMax); + + Polygon(Arr((-3,2),(2,1),(-2,-4)),ARGB(100,255,228,196)); + TextOut(-3,2,'A(-3,2)',Alignment.RightBottom); + TextOut(2,1,'B(2,1)',Alignment.LeftBottom); + TextOut(-2,-4,'C(-2,-4)',Alignment.CenterTop); +end. diff --git a/Graphics/GraphWPF/ТаблицаУмножения.pas b/Graphics/GraphWPF/ТаблицаУмножения.pas new file mode 100644 index 0000000..5565ca7 --- /dev/null +++ b/Graphics/GraphWPF/ТаблицаУмножения.pas @@ -0,0 +1,16 @@ +uses GraphWPF; + +begin + Window.Title := 'Таблица умножения'; + Font.Size := 16; + var n := 9; + var w := 40; + var (x0,y0) := (50,50); + for var i:=0 to n-1 do + for var j:=0 to n-1 do + begin + var (xx,yy) := (x0+i*w,y0+j*w); + Rectangle(xx,yy,w,w); + DrawText(xx,yy,w,w,(i+1)*(j+1)); + end; +end. diff --git a/Graphics/WPFObjects/MovingFrameBasedTime.pas b/Graphics/WPFObjects/MovingFrameBasedTime.pas new file mode 100644 index 0000000..a411db2 --- /dev/null +++ b/Graphics/WPFObjects/MovingFrameBasedTime.pas @@ -0,0 +1,22 @@ +uses WPFObjects; + +begin + var c := new CircleWPF(Window.Center, 20, Colors.Green); + + OnDrawFrame := dt → begin + c.MoveTime(dt); + end; + + OnKeyDown := k → begin + case k of + Key.Left: c.Direction := (-5, 0); + Key.Right: c.Direction := (5, 0); + Key.Up: c.Direction := (0, -5); + Key.Down: c.Direction := (0, 5); + end; + end; + + OnKeyUp := k → begin + c.Direction := (0, 0); + end; +end. \ No newline at end of file diff --git a/Graphics/WPFObjects/Shooter.pas b/Graphics/WPFObjects/Shooter.pas new file mode 100644 index 0000000..288c1f8 --- /dev/null +++ b/Graphics/WPFObjects/Shooter.pas @@ -0,0 +1,105 @@ +uses WPFObjects,Timers; + +type + BulletWPF = class(CircleWPF) end; + MonsterWPF = class(SquareWPF) end; + PlayerWPF = class(EllipseWPF) end; + +begin + var Player := new PlayerWPF(GraphWindow.Center, 30, 50, RandomColor); + Player.Velocity := 100; + Player.Number := 0; + + loop 5 do + begin + var m := new MonsterWPF(750,Random(10,550),30,RandomColor); + m.Velocity := 50; + end; + + OnMouseMove := (x,y,mb) -> Player.RotateToPoint(x,y); + + OnMouseDown := (x,y,mb) -> begin + var cc := new BulletWPF(Player.CenterTop,5,Colors.Red); + cc.Direction := (x-Player.Center.X,y-Player.Center.Y); + cc.Velocity := 300; + end; + + var kl,kr,ku,kd: boolean; + + OnDrawFrame := dt -> begin + Window.Title := 'Количество объектов: '+Objects.Count; + // Перемещение игрока + if kr then + Player.Dx := 1 + else if kl then + Player.Dx := -1 + else Player.Dx := 0; + if ku then + Player.Dy := -1 + else if kd then + Player.Dy := 1 + else Player.Dy := 0; + + for var i:=Objects.Count-1 downto 0 do // все перемещаются в своём направлении со своей скоростью + begin + var o := Objects[i]; + if o is MonsterWPF then + o.Direction := (Player.Center.X - o.Center.X,Player.Center.Y-o.Center.Y); + o.MoveTime(dt); + end; + + if Player.IntersectionList.Any(o -> o is MonsterWPF) then + begin + // Конец игры + + end; + end; + + CreateTimerAndStart(100,procedure -> // Таймер убивания монстров и умирания объектов за пределами экрана + begin + for var i:=Objects.Count-1 downto 0 do + begin + var o := Objects[i]; + if (o.Center.X < 0) or (o.Center.X > Window.Width) or + (o.Center.Y < 0) or (o.Center.Y > Window.Height) then + if not (o is PlayerWPF) then + o.Destroy; + if o is BulletWPF then + foreach var x in o.IntersectionList do + if x is MonsterWPF then + begin + x.Destroy; + o.Destroy; + Player.Number += 1; + break; + end; + end; + end); + + CreateTimerAndStart(1000,procedure -> // Таймер рождения монстров + begin + var x := Random(2)=0 ? 750 : 50; + var m := new MonsterWPF(x,Random(10,550),30,RandomColor); + m.Velocity := 50; + end); + + + OnKeyDown := k -> + begin + case k of + Key.w,Key.Up: begin ku := true; kd := false; end; + Key.s,Key.Down: begin kd := true; ku := false; end; + Key.a,Key.Left: begin kl := true; kr := false; end; + Key.d,Key.Right: begin kr := true; kl := false end; + end; + end; + OnKeyUp := k -> + begin + case k of + Key.w,Key.Up: ku := false; + Key.s,Key.Down: kd := false; + Key.a,Key.Left: kl := false; + Key.d,Key.Right: kr := false; + end; + end; +end. \ No newline at end of file diff --git a/Graphics/WPFObjects/ShooterWithInterface.pas b/Graphics/WPFObjects/ShooterWithInterface.pas new file mode 100644 index 0000000..79d52bf --- /dev/null +++ b/Graphics/WPFObjects/ShooterWithInterface.pas @@ -0,0 +1,197 @@ +uses WPFObjects, Timers, Controls; + +type + BulletWPF = class(CircleWPF) end; + MonsterWPF = class(SquareWPF) end; + PlayerWPF = class(EllipseWPF) end; + TGameState = (Paused, Started, EndOfGame); + +var + // Состояние игры + GameState: TGameState := Paused; + // Глобальные интерфейсные объекты + sb: StatusBarWPF; + bstart, bstop, bnewgame: ButtonWPF; + // Глобальные игровые объекты + Player: PlayerWPF; + // Клавиатура + kl, kr, ku, kd: boolean; + + +procedure InitGame; +begin + Player := new PlayerWPF(GraphWindow.Center, 30, 50, RandomColor); + Player.Velocity := 100; + Player.Number := 0; + + loop 10 do + begin + var m := new MonsterWPF(750, Random(10, 550), 30, RandomColor); + m.Velocity := 50; + end; +end; + +procedure NewGame; +begin + sb.Text := ''; + Objects.Clear; + InitGame; +end; + +// Конец игры - игрок погиб +procedure GameOver; +begin + sb.Text := 'Игрок погиб'; + GameState := EndOfGame; + bstart.Enabled := False; + bstop.Enabled := False; + bnewgame.Enabled := True; + Player.Color := Colors.Black; +end; + +// Конец игры - победа! +procedure GameOverWin; +begin + sb.Text := 'Победа!'; + GameState := EndOfGame; + bstart.Enabled := False; + bstop.Enabled := False; + bnewgame.Enabled := True; + Player.Color := Colors.Yellow; +end; + +procedure InitInterface; +begin + Window.SetSize(1000, 600); + LeftPanel(200, Colors.Orange); + bstart := Button('Start'); + bstop := Button('Stop'); + bnewgame := Button('Новая игра'); + bstop.Enabled := False; + bstart.Enabled := False; + bstart.Click := procedure → begin + GameState := Started; + bstart.Enabled := False; + bstop.Enabled := True; + end; + bstop.Click := procedure → begin + GameState := Paused; + bstart.Enabled := True; + bstop.Enabled := False; + end; + bNewGame.Click := procedure → begin + GameState := Started; + bnewgame.Enabled := False; + bstart.Enabled := False; + bstop.Enabled := True; + NewGame; + end; + sb := StatusBar; +end; + +// Обработчик таймера убивания монстров и умирания объектов за пределами экрана +procedure KillMonstersHandler; +begin + if GameState <> Started then + exit; + // Удалить пули, вылетевшие за экран + Objects.DestroyAll(o → o.OutOfGraphWindow and not (o is PlayerWPF)); + // Удалить монстра, убитого пулей, вместе с пулей + foreach var o in Objects do + begin + if o is BulletWPF then + foreach var x in o.IntersectionList do + if x is MonsterWPF then + begin + x.Destroy; + o.Destroy; + Player.Number += 1; + break; + end; + end; +end; + +// Обработчик перерисовки экрана +procedure DrawFrame(dt: real); +begin + if GameState <> Started then exit; + Window.Title := 'Количество объектов: ' + Objects.Count; + +// Перемещение игрока + if kr then + Player.Dx := 1 + else if kl then + Player.Dx := -1 + else Player.Dx := 0; + if ku then + Player.Dy := -1 + else if kd then + Player.Dy := 1 + else Player.Dy := 0; + +// Перемещение остальных объектов + foreach var o in Objects do // все перемещаются в своём направлении со своей скоростью + begin + if o is MonsterWPF then + o.Direction := (Player.Center.X - o.Center.X, Player.Center.Y - o.Center.Y); + o.MoveTime(dt); + end; + +// Проверка гибели игрока + if Player.IntersectionList.Any(o → o is MonsterWPF) then + GameOver; + +// Проверка выигрыша игрока + if Player.Number >= 10 then + GameOverWin; +end; + +/// Обработчик таймера рождения монстров +procedure CreateMonstersHandler; +begin + if GameState <> Started then exit; + var x := if Random(2) = 0 then 750 else 50; + var m := new MonsterWPF(x, Random(10, 550), 30, RandomColor); + m.Velocity := 50; +end; + +begin + InitInterface; + + CreateTimerAndStart(100, KillMonstersHandler); + CreateTimerAndStart(1000, CreateMonstersHandler); + +// Обработчик перерисовки кадров + OnDrawFrame := DrawFrame; + +// Обработчики мыши и клавиатуры + OnMouseMove := (x, y, mb) → begin + if GameState <> Started then exit; + Player.RotateToPoint(x, y); + end; + + OnMouseDown := (x, y, mb) → begin + if GameState <> Started then exit; + var cc := new BulletWPF(Player.CenterTop, 5, Colors.Red); + cc.Direction := (x - Player.Center.X, y - Player.Center.Y); + cc.Velocity := 300; + end; + + OnKeyDown := k → begin + case k of + Key.w, Key.Up: begin ku := true; kd := false; end; + Key.s, Key.Down: begin kd := true; ku := false; end; + Key.a, Key.Left: begin kl := true; kr := false; end; + Key.d, Key.Right: begin kr := true; kl := false end; + end; + end; + + OnKeyUp := k → begin + case k of + Key.w, Key.Up: ku := false; + Key.s, Key.Down: kd := false; + Key.a, Key.Left: kl := false; + Key.d, Key.Right: kr := false; + end; + end; +end. \ No newline at end of file diff --git a/Graphics/WPFObjects/StartStopMoveRotation.pas b/Graphics/WPFObjects/StartStopMoveRotation.pas new file mode 100644 index 0000000..0b0a911 --- /dev/null +++ b/Graphics/WPFObjects/StartStopMoveRotation.pas @@ -0,0 +1,32 @@ +// Модуль Controls - StatusBar +uses Controls,WPFObjects; + +// Управление свойствами объекта, связанными с перемещением и поворотом. +// В OnDrawFrame объект сам себя перерисовывает +begin + Window.Title := 'Модуль Controls - StatusBar'; + var l := LeftPanel(180,Colors.Orange); + + var c := new RectangleWPF(50,200,80,50,Colors.Green); + c.Direction := (1,0); + c.Velocity := 0; + c.Tag := 0; // скорость поворота + + OnDrawFrame := dt -> begin + c.MoveTime(dt); + c.RotateAngle += integer(c.Tag) * dt; + end; + + Button('Начать перемещение').Click := procedure -> begin + c.Velocity := 30; + end; + Button('Закончить перемещение').Click := procedure -> begin + c.Velocity := 0; + end; + Button('Начать поворот').Click := procedure -> begin + c.Tag := 30; + end; + Button('Закончить поворот').Click := procedure -> begin + c.Tag := 0; + end; +end. \ No newline at end of file diff --git a/Graphics/WPFObjects/gr_All_Brown_WPF.pas b/Graphics/WPFObjects/gr_All_Brown_WPF.pas new file mode 100644 index 0000000..48b31e2 --- /dev/null +++ b/Graphics/WPFObjects/gr_All_Brown_WPF.pas @@ -0,0 +1,39 @@ +// Изменение свойств графических объектов +// Броуновское движение графических объектов +uses WPFObjects; + +procedure MoveAll(a,b: integer); +begin + for var j:=0 to Objects.Count-1 do + Objects[j].moveBy(a,b); +end; + +begin + Window.Title := 'Броуновское движение объектов'; + var sq := new SquareWPF(30,5,90,Colors.SkyBlue,1); + var r := new RectangleWPF(10,10,100,180,RGB(255,100,100),1); + var rr := new RoundRectWPF(200,180,180,50,20,RandomColor,1); + var rsq:= new RoundSquareWPF(20,180,80,10,RandomColor,1); + var c := new CircleWPF(160,55,70,Colors.Green); + var z := new StarWPF(200,150,70,135,5,EmptyColor,1); + var el := new EllipseWPF(5,55,65,50,RandomColor,2,RandomColor); + var t := new TextWPF(100,170,40,'Hello, WPFObjects!'); // + t.BackgroundColor := Colors.Yellow; + t.FontName := 'Times New Roman'; + //var br := new BoardWPF(200,20,7,5,20,20); + //br.Filled := False; + z.Height := 220; + z.Radius := 160; + sq.Width := 120; + //t.FontSize := 40; + c.Height := 50; + c.Scale(2); + MoveAll(160,110); + + while True do + begin + for var j:=0 to Objects.Count-1 do + Objects[j].MoveBy(Random(-1,1),Random(-1,1)); + Sleep(10); + end; +end. diff --git a/Graphics/WPFObjects/gr_IntersectWPF.pas b/Graphics/WPFObjects/gr_IntersectWPF.pas new file mode 100644 index 0000000..5b45068 --- /dev/null +++ b/Graphics/WPFObjects/gr_IntersectWPF.pas @@ -0,0 +1,24 @@ +uses WPFObjects; + +var Destroyer: CircleWPF; + +procedure CheckPulyaIntersects; +begin + Destroyer.IntersectionList.ForEach(procedure(o)->o.Destroy); +end; + +begin + Window.SetSize(640,480); + Window.Title := 'Разрушитель: метод Intersect пересечения объектов'; + loop 500 do + new RectangleWPF(Random(Window.Width.Round-200)+100,Random(Window.Height.Round-100),Random(200),Random(200),clRandom); + Destroyer := new CircleWPF(10,Window.Height / 2,100,Colors.Black); + Destroyer.SetText('Destroyer',30,'Arial',Colors.Yellow); + + loop 900 do + begin + Destroyer.MoveBy(1,0); + CheckPulyaIntersects; + Sleep(1); + end; +end. diff --git a/Graphics/WPFObjects/gr_Move_Param_WPF.pas b/Graphics/WPFObjects/gr_Move_Param_WPF.pas new file mode 100644 index 0000000..bae294e --- /dev/null +++ b/Graphics/WPFObjects/gr_Move_Param_WPF.pas @@ -0,0 +1,70 @@ +// Движение по траектории +uses WPFObjects,GraphWPF; + +const +/// Шаг по параметру кривой + step = 0.02; +/// Задержка по времени, мс + delay = 5; + +type + PointR = record + x,y: real; + end; + +function Position(t: real): PointR; // астроида +begin + var si := sin(1.7 * t); + var co := cos(1.5 * t); + Result.x := si*si*si; + Result.y := co*co*co; +end; + +function Position1(t: real): PointR; // фигура Лиссажу +begin + Result.x := cos(4*t); + Result.y := cos(2.97221*t + 2*Pi/3); +end; + +function LogicalToScreen(p: PointR): GPoint; +begin + var ww := Window.Width / 2; + var hh := Window.Height / 2; + Result.x := Round((ww - 50) * p.x + ww); + Result.y := Round((hh - 50) * p.y + hh); +end; + +procedure InitScreen; +begin + Brush.Color := Colors.LightGreen; + Rectangle(10,10,Window.Width-20,Window.Height-20); + var p := LogicalToScreen(Position1(0)); + MoveTo(p.x,p.y); +end; + +begin + //Window.IsFixedSize := True; + Window.Title := 'Движение по траектории'; + Window.SetSize(640,480); + Window.CenterOnScreen; + + InitScreen; + var c := new CircleWPF(200,200,25,Colors.Green); + var d := new StarWPF(200,200,40,20,5,Colors.Yellow); + + var t: real := 0; + while True do + begin + c.Center := LogicalToScreen(Position1(t)); + d.Center := LogicalToScreen(Position(t)); + if t<20*Pi then + LineTo(c.Center.x,c.Center.y) + else + begin + t := 0; + InitScreen; + end; + t += step; + Sleep(delay); + end; +end. diff --git a/Graphics/WPFObjects/gr_MovingObjectsWPF.pas b/Graphics/WPFObjects/gr_MovingObjectsWPF.pas new file mode 100644 index 0000000..90ea8a7 --- /dev/null +++ b/Graphics/WPFObjects/gr_MovingObjectsWPF.pas @@ -0,0 +1,58 @@ +uses WPFObjects; + +const +/// Количество графических объектов + Count = 1000; + +/// Возвращает случайный графический объект + +var w := 50; + +function NewRandomABC: ObjectWPF; +begin + case Random(3) of +0: Result := new CircleWPF(Random(Window.Width.Round-w)+w/2,Random(Window.Height.Round-w)+w/2,Random(w/2),RandomColor); +1: Result := new RectangleWPF(Random(Window.Width.Round-w)+w/2,Random(Window.Height.Round-w)+w/2,Random(w),Random(w),RandomColor); +2: Result := new StarWPF(Random(Window.Width.Round-w)+w/2,Random(Window.Height.Round-w)+w/2,Random(w/2),Random(w/2),Random(4)+4,RandomColor); + end; +end; + +/// Передвигает графический объект с отражением его от стенок +procedure Move(o: ObjectWPF); +begin + o.Move; + if (o.Left<0) or (o.Left+o.Width>Window.Width) then + o.dx := -o.dx; + if (o.Top<0) or (o.Top+o.Height>Window.Height) then + o.dy := -o.dy; +end; + +procedure CreateAll; +begin + loop Count do + begin + var m: ObjectWPF := NewRandomABC; + repeat + m.dx := Random(-3,3); + m.dy := Random(-3,3); + until (m.dx<>0) and (m.dy<>0); + end; +end; + +procedure MoveAll; +begin + for var i:=0 to Objects.Count-1 do + Move(Objects[i]); +end; + +begin + Window.Title := 'Движущиеся объекты'; + Redraw(CreateAll); + var k := 1; + while True do + begin + Redraw(MoveAll); + k += 1; + Window.Title := Format('{0,5:f2}',k/Milliseconds*1000)+' кадров в секунду'; + end; +end. diff --git a/Graphics/WPFObjects/gr_ObjectsAsSeq.pas b/Graphics/WPFObjects/gr_ObjectsAsSeq.pas new file mode 100644 index 0000000..0874368 --- /dev/null +++ b/Graphics/WPFObjects/gr_ObjectsAsSeq.pas @@ -0,0 +1,25 @@ +uses WPFObjects; + +function GenRandomWPF: ObjectWPF; +begin + var x := Random(Window.Width); + var y := Random(Window.Height); + case Random(3) of + 0: Result := new CircleWPF(x,y,Random(15,20),RandomColor); + 1: Result := new EllipseWPF(x,y,Random(15,60),Random(15,60),RandomColor); + 2: Result := new RegularPolygonWPF(x,y,Random(15,30),Random(3,8),RandomColor); + end; +end; + +begin + loop 100 do + GenRandomWPF; + + Sleep(1000); + foreach var o in Objects.Seq do + match o with + CircleWPF(c): c.Radius += 10; + EllipseWPF(e): e.AnimMoveBy(Random(-50,50),Random(-50,50),1); + RegularPolygonWPF(r) when r.Count<6: r.SetBorder; + end +end. \ No newline at end of file diff --git a/Graphics/WPFObjects/gr_RealNumber_WPF.pas b/Graphics/WPFObjects/gr_RealNumber_WPF.pas new file mode 100644 index 0000000..7f0f507 --- /dev/null +++ b/Graphics/WPFObjects/gr_RealNumber_WPF.pas @@ -0,0 +1,20 @@ +uses WPFObjects, GraphWPF; + +const + /// отступ по оси x + zx = 100; + /// отступ по оси y + zy = 50; + +begin + //Window.IsFixedSize := True; + Window.Title := 'Секундомер'; + var r := new RoundRectWPF(zx, zy, Window.Width - 2 * zx, Window.Height - 2 * zy, 100, Colors.LightGreen, 5, Colors.Green); + r.FontSize := 200; + for var i := 1 to 1000 do + begin + r.RealNumber := i/10; + Sleep(100); + end; +end. + diff --git a/Graphics/WPFObjects/gr_StandardColors_WPF.pas b/Graphics/WPFObjects/gr_StandardColors_WPF.pas new file mode 100644 index 0000000..65e4f4d --- /dev/null +++ b/Graphics/WPFObjects/gr_StandardColors_WPF.pas @@ -0,0 +1,144 @@ +uses + GraphWPF, + WPFObjects, + System.Reflection; + +const lim = 127 + 32; + +var + CurrentBackColor := Colors.White; + InfoString: RectangleWPF; + +procedure ChangeInfoStringText(colorName: string); +begin + var c := Colors.LightGray;//Color.FromName(colorName); + InfoString.Text := $'Colors.{colorName}: (R: {c.R} G: {c.G} B: {c.B})'; + InfoString.Color := c; + if c.R*c.R+c.G*c.G+c.B*c.B <= 3*lim*lim then + InfoString.FontColor := Colors.White + else InfoString.FontColor := Colors.Black; + if c.A = 0 then + InfoString.FontColor := Colors.Gray; +end; + +procedure CreateStandardColors(backColor: Color); +begin + Window.Clear(backColor); + var t := typeof(Colors); + var mi := t.GetProperties(); + var y := 10.0; + var x := 10.0; + var h := Window.Width / 5 - 11; + foreach m: PropertyInfo in mi do + begin + if m.GetGetMethod(true).IsStatic then + begin + var c := Color(m.GetValue(nil,nil)); + var r := new RectangleWPF(x,y,h,22,c); + r.Text := m.Name; + r.FontSize := 16;//.TextScale := 0.9; + //r.Bordered := False; + if c.R*c.R+c.G*c.G+c.B*c.B <= 3*lim*lim then + r.FontColor := Colors.White + else r.FontColor := Colors.Black; + if c.A = 0 then + r.FontColor := Colors.Gray; + y += 25; + if y > Window.Height-40 then + begin + y := 10; + x += h + 10; + end; + end; + end; +end; + +var + ob: ObjectWPF; + dx,dy: real; + +procedure MouseDown(x,y: real; mb: integer); +begin + ob := ObjectUnderPoint(x,y); + if ob=InfoString then + ob := nil; + if ob<>nil then + begin + ob.ToFront; + dx := x - ob.Left; + dy := y - ob.Top; + var c := ob.Color; + if (mb=2) then + ob.ScaleFactor := 2 + else ob.Color := Color.FromArgb(128,c.R,c.G,c.B); + end; +end; + +procedure MouseUp(x,y: real; mb: integer); +begin + if ob<>nil then + begin + if (mb=2) then + ob.Scale(0.5) + else + begin + var c := ob.Color; + if ob.Text = 'Transparent' then + ob.Color := Color.FromArgb(0,c.R,c.G,c.B) + else ob.Color := Color.FromArgb(255,c.R,c.G,c.B); + end; + ob:= nil; + end; +end; + +procedure MouseMove(x,y: real; mb: integer); +begin + if (ob<>nil) and (mb=1) then + begin + ob.ToFront; + ob.Left := x - dx; + ob.Top := y - dy; + end; + if ob=nil then + begin + InfoString.Text := ''; + InfoString.Color := CurrentBackColor; + end; + var ob1 := ObjectUnderPoint(x,y); + if ob1=InfoString then + ob1 := nil; + if (ob1<>nil) and (mb=0) then + ChangeInfoStringText(ob1.Text); +end; + +procedure KeyDown(k: Key); +begin + if k=Key.Space then + begin + if CurrentBackColor=Colors.White then + begin + CurrentBackColor := Colors.Black; + InfoString.BorderColor := Colors.White; + end + else + begin + CurrentBackColor := Colors.White; + InfoString.BorderColor := Colors.Black; + end; + Window.Clear(CurrentBackColor); + //RedrawObjects; + end; +end; + +begin + Window.SetSize(1024,768); + //Window.IsFixedSize := True; + Window.CenterOnScreen; + Window.Title := 'Стандартные цвета (нажмите Пробел для изменения фонового цвета)'; + CreateStandardColors(CurrentBackColor); + InfoString := new RectangleWPF(10,Window.Height-30,Window.Width-20,25,Colors.LightGray); + OnMouseMove := MouseMove; + OnMouseDown := MouseDown; + OnMouseUp := MouseUp; + OnKeyDown := KeyDown; +end. diff --git a/Graphics/WPFObjects/gr_Star_Rotate1_WPF.pas b/Graphics/WPFObjects/gr_Star_Rotate1_WPF.pas new file mode 100644 index 0000000..6fcb8e8 --- /dev/null +++ b/Graphics/WPFObjects/gr_Star_Rotate1_WPF.pas @@ -0,0 +1,12 @@ +// Изменение свойств объекта StarWPF +uses WPFObjects; + +begin + var z := new StarWPF(Window.Width / 2, Window.Height / 2, Window.Height / 2 - 5, Window.Height / 4 + 16, 6, Colors.Red); + loop 20 do + begin + Sleep(100); + z.Count += 1; + end; + z.AnimRotate(200,2); +end. diff --git a/Graphics/WPFObjects/gr_Star_Rotate_WPF.pas b/Graphics/WPFObjects/gr_Star_Rotate_WPF.pas new file mode 100644 index 0000000..a871cf6 --- /dev/null +++ b/Graphics/WPFObjects/gr_Star_Rotate_WPF.pas @@ -0,0 +1,16 @@ +// Изменение свойств объекта StarWPF +uses WPFObjects, GraphWPF; + +begin + var z := new StarWPF(Window.Width / 2, Window.Height / 2, Window.Height / 2 - 5, Window.Height / 4 + 16, 6, Colors.Red); + loop 20 do + begin + Sleep(100); + z.Count += 1; + end; + loop 200 do + begin + Sleep(10); + z.Rotate(1); + end; +end. diff --git a/LINQ/Consonants.pas b/LINQ/Consonants.pas new file mode 100644 index 0000000..c73dfef --- /dev/null +++ b/LINQ/Consonants.pas @@ -0,0 +1,7 @@ +// Вывод английских согласных +var vowel: string := 'aeiouy'; + +begin + var all := Range('a','z').JoinIntoString(''); + all.Except(vowel).Println; +end. \ No newline at end of file diff --git a/LINQ/Delimiters.pas b/LINQ/Delimiters.pas new file mode 100644 index 0000000..60a7298 --- /dev/null +++ b/LINQ/Delimiters.pas @@ -0,0 +1,4 @@ +begin + Range(#0,#127).Where(c->char.IsLetterOrDigit(c)).Println; + Range(#0,#127).Where(c->char.IsPunctuation(c)).Println; +end. \ No newline at end of file diff --git a/LINQ/First3Min.pas b/LINQ/First3Min.pas new file mode 100644 index 0000000..58cb148 --- /dev/null +++ b/LINQ/First3Min.pas @@ -0,0 +1,4 @@ +// Первые 3 минимума +begin + ArrRandom(20).Println.Sorted.Distinct.Take(3).Println; +end. \ No newline at end of file diff --git a/LINQ/FunTable.pas b/LINQ/FunTable.pas new file mode 100644 index 0000000..38aa5f5 --- /dev/null +++ b/LINQ/FunTable.pas @@ -0,0 +1,6 @@ +// Вывод таблицы значений функции sin + +begin + PartitionPoints(0,Pi,20).Select(x->Format('({0:f4}, {1:f7})',x,sin(x))).Println(NewLine); +end. + diff --git a/LINQ/Linq1.pas b/LINQ/Linq1.pas new file mode 100644 index 0000000..46e2a8b --- /dev/null +++ b/LINQ/Linq1.pas @@ -0,0 +1,6 @@ +begin + Range(1,20).Select(x->x*x).Println; + PartitionPoints(0.0,1.0,10).Println; + Range('a','z').Println; +end. + diff --git a/LINQ/Linq2.pas b/LINQ/Linq2.pas new file mode 100644 index 0000000..1a5df0a --- /dev/null +++ b/LINQ/Linq2.pas @@ -0,0 +1,13 @@ +function IsPrime(x: integer): boolean; +begin + var sqx := Round(Sqrt(x)); + var i := 2; + while (i <= sqx) and (x mod i <> 0) do + i += 1; + Result := i > sqx; +end; + +begin + Range(2,1000).Where(IsPrime).Print; +end. + diff --git a/LINQ/Linq3.pas b/LINQ/Linq3.pas new file mode 100644 index 0000000..3b3cda4 --- /dev/null +++ b/LINQ/Linq3.pas @@ -0,0 +1,18 @@ +function IsPrime(x: integer): boolean; +begin + var sqx := Round(Sqrt(x)); + var i := 2; + while (i <= sqx) and (x mod i <> 0) do + i += 1; + Result := i > sqx; +end; + +var n := 3000000; + +begin + writeln(Range(2,n).Where(IsPrime).Count); + writeln(Milliseconds); + writeln(Range(2,n).AsParallel.Where(IsPrime).Count); + writeln(MillisecondsDelta); +end. + diff --git a/LINQ/MonteCarlo.pas b/LINQ/MonteCarlo.pas new file mode 100644 index 0000000..67f11a4 --- /dev/null +++ b/LINQ/MonteCarlo.pas @@ -0,0 +1,7 @@ +// Вычисление числа Pi методом Монте-Карло + +begin + var n := 10000000; + var pp := Range(1,n).Select(x->Rec(Random(),Random())).Where(p->sqr(p.Item1)+sqr(p.Item2)<1).Count/n*4; + Print(pp); +end. \ No newline at end of file diff --git a/LINQ/Palindroms.pas b/LINQ/Palindroms.pas new file mode 100644 index 0000000..03f4a42 --- /dev/null +++ b/LINQ/Palindroms.pas @@ -0,0 +1,6 @@ +// Вывести все палиндромы в строке, упорядоченные по длине + +begin + var s := ' hello aha paap zz '; + s.ToWords.Where(w -> w.Inverse = w).OrderBy(s->s.Length).Println(','); +end. \ No newline at end of file diff --git a/LINQ/QuickSortLinq.pas b/LINQ/QuickSortLinq.pas new file mode 100644 index 0000000..c1f7cf9 --- /dev/null +++ b/LINQ/QuickSortLinq.pas @@ -0,0 +1,19 @@ +function QuickSort(a: sequence of integer): sequence of integer; +begin + if a.Count = 0 then + Result := a + else + begin + var head := a.First(); + var tail := a.Skip(1); + Result := QuickSort(tail.Where(x->x<=head)) + + head + + QuickSort(tail.Where(x->x>head)); + end; +end; + +begin + var a := ArrRandom(20); + a.Println; + QuickSort(a).Println; +end. \ No newline at end of file diff --git a/LINQ/Seq.pas b/LINQ/Seq.pas new file mode 100644 index 0000000..c7eb39c --- /dev/null +++ b/LINQ/Seq.pas @@ -0,0 +1,3 @@ +begin + Seq(1,5,3,2,4).Print; +end. \ No newline at end of file diff --git a/LINQ/SumInv.pas b/LINQ/SumInv.pas new file mode 100644 index 0000000..c17199d --- /dev/null +++ b/LINQ/SumInv.pas @@ -0,0 +1,13 @@ +// Сравнение производительности обычного алгоритма накопления суммы +// и метода, использующего лямбда-выражение +begin + var n := 100000000; + var q := Range(1,n).Select(x->1/x).Sum(); + Println(q,MillisecondsDelta); + + var s := 0.0; + for var i:=1 to n do + s += 1.0/i; + + Println(s,MillisecondsDelta); +end. \ No newline at end of file diff --git a/LINQ/TextFileCount.pas b/LINQ/TextFileCount.pas new file mode 100644 index 0000000..0f9d80b --- /dev/null +++ b/LINQ/TextFileCount.pas @@ -0,0 +1,7 @@ +begin + var d := new Dictionary; + foreach var s in ReadLines('TextFileCount.pas') do + foreach var word in s.ToWords(' ',':',')','(',';','''',',','.','=','<','>','[',']','+','-') do + d[word] := d.Get(word) + 1; + d.Print(NewLine); +end. \ No newline at end of file diff --git a/LINQ/TextFileCount1.pas b/LINQ/TextFileCount1.pas new file mode 100644 index 0000000..087d9a2 --- /dev/null +++ b/LINQ/TextFileCount1.pas @@ -0,0 +1,8 @@ +begin + var d := Dict('begin' => 0); + var delims := Seq(' ',')','(',';','''',',','.','[',']',#10,#13); + var words := ReadAllText('TextFileCount1.pas').ToWords(delims); + foreach var word in words do + d[word] := d.Get(word) + 1; + d.Print(NewLine); +end. \ No newline at end of file diff --git a/LINQ/Zip.pas b/LINQ/Zip.pas new file mode 100644 index 0000000..add9cd1 --- /dev/null +++ b/LINQ/Zip.pas @@ -0,0 +1,5 @@ +begin + var a := Seq(1,5,3,2,4); + var b := Seq(2,3,4,1,6); + a.Zip(b,(x,y)->x*y).Print; +end. \ No newline at end of file diff --git a/LINQ/Zip2.pas b/LINQ/Zip2.pas new file mode 100644 index 0000000..54eb378 --- /dev/null +++ b/LINQ/Zip2.pas @@ -0,0 +1,4 @@ +begin + var a := Seq(1,5,3,2,4); + a.Zip(a.Skip(1),(x,y)->y-x).Print; +end. \ No newline at end of file diff --git a/LanguageFeatures/AutoClassPoint.pas b/LanguageFeatures/AutoClassPoint.pas new file mode 100644 index 0000000..4f31fce --- /dev/null +++ b/LanguageFeatures/AutoClassPoint.pas @@ -0,0 +1,13 @@ +type + Point = auto class + x,y: integer; + procedure MoveBy(dx,dy: integer) := (x,y) := (x+dx,y+dy); + function Distance(p: Point) := sqrt(sqr(x-p.x)+sqr(y-p.y)); + class function operator implicit(t: (integer,integer)): Point := new Point(t[0],t[1]); + end; + +begin + var p: Point; + p := (2,3); + Println(p); +end. \ No newline at end of file diff --git a/LanguageFeatures/Boxing.pas b/LanguageFeatures/Boxing.pas new file mode 100644 index 0000000..8f7eec8 --- /dev/null +++ b/LanguageFeatures/Boxing.pas @@ -0,0 +1,22 @@ +// Упаковка-распаковка размерных типов +var + i: integer := 2; + r: real := 3.14; + o: object; + +begin + o := i; // Упаковка: объект размерного типа integer упаковывается в объект ссылочного типа, + // котрый и присваивается переменной o + // Преобразование типов при упаковке - неявное + writeln(integer(o)); // Распаковка: из упакованного объекта извлекается значение + // Преобразование типов при распаковке - явное + o := r; + writeln(real(o)); + + try // При неверном преобразовании типов генерируется исключение InvalidCastException + writeln(shortint(o)); + except + on e: Exception do + writeln(e.GetType); + end; +end. \ No newline at end of file diff --git a/LanguageFeatures/ClassConstructor.pas b/LanguageFeatures/ClassConstructor.pas new file mode 100644 index 0000000..c9f9d8d --- /dev/null +++ b/LanguageFeatures/ClassConstructor.pas @@ -0,0 +1,36 @@ +// Иллюстрация использования статических (классовых) конструкторов +type + Person = class + private + class arr: array of Person; // Классовое поле. Связано не с переменной класса, а с классом. + name: string; + age: integer; + public + class constructor; // Конструктор класса. Вызывается до создания первого объекта класса и до вызова любого классового метода + begin + writeln(' Вызван классовый конструктор'); + SetLength(arr,3); + arr[0] := new Person('Иванов',20); + arr[1] := new Person('Петрова',19); + arr[2] := new Person('Попов',35); + end; + constructor (n: string; a: integer); + begin + name := n; + age := a; + end; + function ToString: string; override; + begin + Result := Format('Имя: {0} Возраст: {1}',name,age); + end; + class function RandomPerson: Person; // Классовый метод. Может обращаться только к классовым полям + begin + Result := arr[Random(3)]; + end; + end; + +begin + writeln('Случайные персоны'); + for var i:=1 to 5 do + writeln(Person.RandomPerson); // Вызов классового метода +end. \ No newline at end of file diff --git a/LanguageFeatures/DiapasonOperation/diapAll.pas b/LanguageFeatures/DiapasonOperation/diapAll.pas new file mode 100644 index 0000000..be88686 --- /dev/null +++ b/LanguageFeatures/DiapasonOperation/diapAll.pas @@ -0,0 +1,12 @@ +begin + var diap := 'a'..'z'; + Println(diap); + var g := 3 in 1..5; + Println(g); + foreach var x in 1..10 do + Print(x); + var a := Arr(1..5); + var h := HSet(1..5); + Println(a,h); + (1..9).Select(x->x*x).Println; +end. \ No newline at end of file diff --git a/LanguageFeatures/DllTest/MyDll.dll b/LanguageFeatures/DllTest/MyDll.dll new file mode 100644 index 0000000..9a9c8f8 Binary files /dev/null and b/LanguageFeatures/DllTest/MyDll.dll differ diff --git a/LanguageFeatures/DllTest/MyDll.pas b/LanguageFeatures/DllTest/MyDll.pas new file mode 100644 index 0000000..8d59741 --- /dev/null +++ b/LanguageFeatures/DllTest/MyDll.pas @@ -0,0 +1,16 @@ +// Dll-библиотека +library MyDll; + +const n = 10; + +function add(a,b: integer): integer; +begin + Result := a + b; +end; + +procedure PrintPascalABCNET; +begin + writeln('PascalABC.NET'); +end; + +end. \ No newline at end of file diff --git a/LanguageFeatures/DllTest/main.pas b/LanguageFeatures/DllTest/main.pas new file mode 100644 index 0000000..cb46eca --- /dev/null +++ b/LanguageFeatures/DllTest/main.pas @@ -0,0 +1,10 @@ +// Это - главная программа +// Именами из dll-библиотеки, написанной на PascalABC.NET, можно пользоваться, +// не подключая пространства имен +{$reference 'mydll.dll'} + +begin + PrintPascalABCNET; + writeln(n); + writeln(add(2,3)); +end. \ No newline at end of file diff --git a/LanguageFeatures/ExtensionMethods/SwapHalfArrays.pas b/LanguageFeatures/ExtensionMethods/SwapHalfArrays.pas new file mode 100644 index 0000000..f7d855b --- /dev/null +++ b/LanguageFeatures/ExtensionMethods/SwapHalfArrays.pas @@ -0,0 +1,6 @@ +// +var a := Arr(1,3,5,7); + +begin + a.Skip(2).Concat(a.Take(2)).Print; +end. \ No newline at end of file diff --git a/LanguageFeatures/ForeachExamples.pas b/LanguageFeatures/ForeachExamples.pas new file mode 100644 index 0000000..bf7a160 --- /dev/null +++ b/LanguageFeatures/ForeachExamples.pas @@ -0,0 +1,43 @@ +// Пример иллюстрирует всевозможные типы контейнеров, +// по которым можно перемещаться с помощью оператора foreach + +const n = 10; + +var + a: array [1..n] of integer; + b: array of integer; + s: set of integer; + l: List; + +begin + for var i:=1 to n do + a[i] := Random(100); + // Цикл foreach по статическому массиву + foreach var x in a do + Print(x); + writeln; + + SetLength(b,n); + for var i:=0 to n-1 do + b[i] := Random(100); + + // Цикл foreach по динамическому массиву + foreach var x in b do + Print(x); + writeln; + + s := [2..5,10..14]; + // Цикл foreach по множеству + foreach var x in s do + Print(x); + writeln; + + l := new List; + l.AddRange(b); + l.Reverse; + // Цикл foreach по списку + foreach var x in l do + Print(x); + writeln; + +end. \ No newline at end of file diff --git a/LanguageFeatures/ForeachForSet.pas b/LanguageFeatures/ForeachForSet.pas new file mode 100644 index 0000000..08b831e --- /dev/null +++ b/LanguageFeatures/ForeachForSet.pas @@ -0,0 +1,5 @@ +// Цикл по множеству. Порядок - не по алфавиту, поскольку множества реализованы на базе хеш-таблиц +begin + foreach var c in ['a'..'z'] do + Write(c); +end. \ No newline at end of file diff --git a/LanguageFeatures/ForeachIEnumerable.pas b/LanguageFeatures/ForeachIEnumerable.pas new file mode 100644 index 0000000..77d0b75 --- /dev/null +++ b/LanguageFeatures/ForeachIEnumerable.pas @@ -0,0 +1,46 @@ +// Пример иллюстрирует реализацию классом интерфейса IEnumerable +// для использования его в операторе foreach +type + // Генератор чисел Фибоначчи + FibGen = class(IEnumerable, IEnumerator) + private + a,b,n,i: integer; + public + constructor Create(n: integer); + begin + i := -1; + a := 0; + b := 1; + Self.n := n; + end; + function Get_Current: integer; + begin + if i=0 then + Result := 1 + else Result := b; + end; + function System.Collections.IEnumerator.Get_Current: object := Get_Current; + function GetEnumerator: IEnumerator := Self; + function System.Collections.IEnumerable.GetEnumerator: System.Collections.IEnumerator := Self; + function MoveNext: boolean; + begin + i += 1; + Result := i = class + private + a: array of T; + last: integer; + public + constructor Create(sz: integer); + begin + SetLength(a,sz); + last := 0; + end; + constructor Create; + begin + Create(100); + end; + procedure push(i: T); + begin + a[last] := i; + Inc(last); + end; + function pop: T; + begin + Dec(last); + pop := a[last]; + end; + function top: T; + begin + top := a[last-1]; + end; + function empty: boolean; + begin + Result := (last=0); + end; + function ToString: string; override; + begin + Result := ''; + for var i:=0 to last-1 do + Result += a[i]+' '; + end; + end; + +var s: Stack; + +begin + s := new Stack; + s.push(7); + s.push(2); + s.push(5); + s.push(4); + writeln(s); + while not s.empty do + write(s.pop,' '); +end. + + diff --git a/LanguageFeatures/Generics/GenericProcFun/FindT.pas b/LanguageFeatures/Generics/GenericProcFun/FindT.pas new file mode 100644 index 0000000..c275256 --- /dev/null +++ b/LanguageFeatures/Generics/GenericProcFun/FindT.pas @@ -0,0 +1,21 @@ +// Обобщенные функции +// Выведение типа T по типам параметров + +function IndexOf(a: array of T; val: T): integer; +begin + Result := -1; + for var i:=0 to a.Length-1 do + if a[i]=val then + begin + Result := i; + exit; + end; +end; + +var a := Arr('Ваня', 'Коля', 'Саша', 'Сережа'); + +begin + var s := 'Сережа'; + writelnFormat('Индекс элемент со значением ''{0}'' равен {1}',s,IndexOf(a,s)); +end. + diff --git a/LanguageFeatures/Generics/GenericProcFun/SwapT.pas b/LanguageFeatures/Generics/GenericProcFun/SwapT.pas new file mode 100644 index 0000000..f8b0bca --- /dev/null +++ b/LanguageFeatures/Generics/GenericProcFun/SwapT.pas @@ -0,0 +1,17 @@ +// Обобщенные функции +// Выведение типа T по типам параметров + +procedure Swap(var a,b: T); +begin + var v := a; + a := b; + b := v; +end; + +begin + var a := 2; + var b := 3; + writelnFormat('До Swap a={0}, b={1}',a,b); + Swap(a,b); + writelnFormat('После Swap a={0}, b={1}',a,b); +end. \ No newline at end of file diff --git a/LanguageFeatures/IfThenElseExpr.pas b/LanguageFeatures/IfThenElseExpr.pas new file mode 100644 index 0000000..8b64f17 --- /dev/null +++ b/LanguageFeatures/IfThenElseExpr.pas @@ -0,0 +1,6 @@ +begin + var (a,b) := (2,3); + var min: integer; + min := if a0 then + if y>0 then + 1 + else 4 + else + if y>0 then + 2 + else 3; + + Print(q) +end. \ No newline at end of file diff --git a/LanguageFeatures/IndexProperties.pas b/LanguageFeatures/IndexProperties.pas new file mode 100644 index 0000000..649f9c6 --- /dev/null +++ b/LanguageFeatures/IndexProperties.pas @@ -0,0 +1,74 @@ +// Индексные свойства. Массив цветных квадратов +uses GraphABC; + +const + sz = 50; + dim = 10; + delay = 500; + +type + /// + VisualArray = class + private + a: array of Color; + procedure SetItem(i: integer; x: Color); // Процедура, устанавливающая цвет i-того квадрата + begin + if (i<0) or (i>=a.Length) then + raise new System.ArgumentException('Выход за границы изменения индекса: '+IntToStr(i)); + a[i] := x; + Draw(i); + end; + function GetItem(i: integer): Color; // Функция, возвращающая цвет i-того квадрата + begin + if (i<0) or (i>=a.Length) then + raise new System.ArgumentException('Выход за границы изменения индекса: '+IntToStr(i)); + Result := a[i]; + end; + public + constructor (n: integer); + begin + a := ArrFill(n,Color.White); + Draw; + end; + /// Рисует i-тый квадрат + procedure Draw(i: integer); + begin + Brush.Color := a[i]; + Rectangle(sz+sz*i,sz,sz+sz*(i+1)+1,sz+sz); + end; + /// Рисует массив цветных квадратов + procedure Draw; + begin + for var i:=0 to a.Length-1 do + Draw(i); + end; + /// Индексное свойство по умолчанию + property Item[i: integer]: Color read GetItem write SetItem; default; + end; + +var arr: VisualArray; + +begin + Window.Title := 'Иллюстрация индексных свойств'; + arr := new VisualArray(dim); + Window.SetSize(sz*(dim+2),3*sz); + arr[0] := clGreen; // arr.Items[0] = arr[0] поскольку свойство Items является свойством по умолчанию + Sleep(delay); + arr[1] := clBlack; + Sleep(delay); + arr[2] := clYellow; + Sleep(delay); + arr[3] := clGray; + Sleep(delay); + arr[4] := clRed; + Sleep(delay); + arr[5] := clMagenta; + Sleep(delay); + arr[6] := clBrown; + Sleep(delay); + arr[7] := clMoneyGreen; + Sleep(delay); + arr[8] := clOlive; + Sleep(delay); + arr[9] := clLinen; +end. \ No newline at end of file diff --git a/LanguageFeatures/Lambdas/IntIntInt.pas b/LanguageFeatures/Lambdas/IntIntInt.pas new file mode 100644 index 0000000..a70918f --- /dev/null +++ b/LanguageFeatures/Lambdas/IntIntInt.pas @@ -0,0 +1,6 @@ +type int = integer; + +begin + var f: int -> int -> int := i -> j -> i*j; + MatrGen(10,10,(i,j)->f(i)(j)).Println; +end. \ No newline at end of file diff --git a/LanguageFeatures/ParamsConcat.pas b/LanguageFeatures/ParamsConcat.pas new file mode 100644 index 0000000..b36c1ed --- /dev/null +++ b/LanguageFeatures/ParamsConcat.pas @@ -0,0 +1,13 @@ +// Создание функции Concat с переменным числом параметров + +function Concat(params strs: array of string): string; +begin + var sb := new StringBuilder; + foreach var x in strs do + sb.Append(x); + Result := sb.ToString; +end; + +begin + Writeln(Concat('Pascal','ABC','.NET')); +end. \ No newline at end of file diff --git a/LanguageFeatures/ParamsWriteln.pas b/LanguageFeatures/ParamsWriteln.pas new file mode 100644 index 0000000..ee15d78 --- /dev/null +++ b/LanguageFeatures/ParamsWriteln.pas @@ -0,0 +1,17 @@ +// Создание процедуры MyWriteln с переменным числом параметров + +procedure MyWriteln(params args: array of object); +begin + foreach var x in args do + Write(x); + WriteLn; +end; + +var + a: integer := 777; + b: boolean := True; + r: real := 3.1415; + +begin + MyWriteln(a,' ',b,' ',r); +end. \ No newline at end of file diff --git a/LanguageFeatures/Pattern Matching/ArithmEval.pas b/LanguageFeatures/Pattern Matching/ArithmEval.pas new file mode 100644 index 0000000..f6d3cf9 --- /dev/null +++ b/LanguageFeatures/Pattern Matching/ArithmEval.pas @@ -0,0 +1,38 @@ +type + Expr = interface + end; + Cons = auto class(Expr) + r: real; + end; + Add = auto class(Expr) + left,right: Expr; + end; + Mult = auto class(Expr) + left,right: Expr; + end; + Neg = auto class(Expr) + ex: Expr; + end; + +// Создающие функции +function ConsC(r: real) := new Cons(r); +function AddC(l,r: Expr) := new Add(l,r); +function MultC(l,r: Expr) := new Mult(l,r); +function NegC(ex: Expr) := new Neg(ex); + +// Вычисляющая функция +function Eval(e: Expr): real; +begin + match e with + Cons(c): Result := c; + Neg(n): Result := -Eval(n); + Add(l,r): Result := Eval(l) + Eval(r); + Mult(l,r): Result := Eval(l) * Eval(r); + end; +end; + +begin + // -2 + 3 * 4 + var r := AddC(NegC(ConsC(2)),MultC(ConsC(3),ConsC(4))); + Eval(r).Print; +end. \ No newline at end of file diff --git a/LanguageFeatures/Pattern Matching/ArithmSimplify.pas b/LanguageFeatures/Pattern Matching/ArithmSimplify.pas new file mode 100644 index 0000000..3e19408 --- /dev/null +++ b/LanguageFeatures/Pattern Matching/ArithmSimplify.pas @@ -0,0 +1,76 @@ +type + Expr = interface + end; + V = auto class(Expr) + name: string; + end; + Cons = auto class(Expr) + r: real; + end; + Add = auto class(Expr) + left,right: Expr; + end; + Mult = auto class(Expr) + left,right: Expr; + end; + Neg = auto class(Expr) + ex: Expr; + end; + +function NegC(ex: Expr) := new Neg(ex); +function ConsC(r: real) := new Cons(r); +function AddC(ex1,ex2: Expr) := new Add(ex1,ex2); +function MultC(ex1,ex2: Expr) := new Mult(ex1,ex2); +function VC(name: string) := new V(name); + +function Simplify(e: Expr): Expr; forward; + +function Simplify1(e: Expr): Expr; +begin + match e with + Mult(Cons(c),Cons(c1)): Result := ConsC(c*c1); + Mult(Cons(1.0),ex): Result := Simplify(ex); + Mult(Cons(0.0),ex): Result := ConsC(0); + Add(Cons(0.0),ex): Result := Simplify(ex); + Add(ex,Cons(0.0)): Result := Simplify(ex); + Add(Cons(c),Cons(c1)): Result := ConsC(c+c1); + Add(Cons(c),ex): Result := AddC(ex,ConsC(c)); // константы - в хвосте! + Mult(Cons(c),ex): Result := MultC(ex,ConsC(c)); + Add(Add(ex,Cons(c)),Cons(c1)): Result := AddC(ex,ConsC(c+c1)); // ассоциативность + Mult(Mult(ex,Cons(c)),Cons(c1)): Result := MultC(ex,ConsC(c*c1)); // ассоциативность + Neg(Cons(c)): Result := ConsC(-c); + else Result := e; + end; +end; + +function Simplify(e: Expr): Expr; +begin + match e with + Mult(e1,e2): Result := Simplify1(MultC(Simplify(e1),Simplify(e2))); + Add(e1,e2): Result := Simplify1(AddC(Simplify(e1),Simplify(e2))); + Neg(e1): Result := Simplify1(NegC(Simplify(e1))); + else Result := e; + end; +end; + +function Str(e: Expr): string; +begin + match e with + Mult(l,r): Result := Str(l) + ' * ' + Str(r); + Add(l,r): Result := Str(l) + ' + ' + Str(r); + Neg(n): Result := '-' + Str(n); + Cons(c): Result := c.ToString; + V(x): Result := x; + end; +end; + + +begin + // 0 + 1*x + 1 + 0*(2 + a) + 2 + var r: Expr := AddC(ConsC(1),AddC(MultC(ConsC(1),VC('x')),ConsC(1))); + r := AddC(r,MultC(ConsC(0),AddC(ConsC(2),VC('a')))); + r := AddC(r,ConsC(2)); + Str(r).Println; + r := Simplify(r); + Str(r).Println; +end. \ No newline at end of file diff --git a/LanguageFeatures/Pattern Matching/MatchDelegate.pas b/LanguageFeatures/Pattern Matching/MatchDelegate.pas new file mode 100644 index 0000000..72da623 --- /dev/null +++ b/LanguageFeatures/Pattern Matching/MatchDelegate.pas @@ -0,0 +1,12 @@ +begin + var s: real->real := x -> x * x; + var add: (real,real)->real := (x, y)-> x + y; + + // Делегат может хранить процедурную переменную любого типа! + var d: System.Delegate := s; + d := add; + match d with + Func(var i): Print(i(2)); + Func2(var i): Print(i(2,3)); + end; +end. \ No newline at end of file diff --git a/LanguageFeatures/Pattern Matching/MatchWithTupleWhen.pas b/LanguageFeatures/Pattern Matching/MatchWithTupleWhen.pas new file mode 100644 index 0000000..7c09986 --- /dev/null +++ b/LanguageFeatures/Pattern Matching/MatchWithTupleWhen.pas @@ -0,0 +1,8 @@ +begin + var (a,b) := (3,2); + match (a,b) with + (var x,var y) when x < y: Print('a < b'); + (var x,var y) when x = y: Print('a = b'); + (var x,var y) when x > y: Print('a > b'); + end; +end. \ No newline at end of file diff --git a/LanguageFeatures/Pattern Matching/Squares.pas b/LanguageFeatures/Pattern Matching/Squares.pas new file mode 100644 index 0000000..c06e173 --- /dev/null +++ b/LanguageFeatures/Pattern Matching/Squares.pas @@ -0,0 +1,22 @@ +type + Line = class + end; + Rectangle = auto class + X,Y,Width,Height: real; + end; + Circle = auto class + X,Y,Radius: real; + end; + +begin + var l := new List; + l.Add(new Line); + l.Add(new Circle(10,10,5)); + l.Add(new Rectangle(10,10,20,10)); + foreach var x in l do + match x with + Line(var ll): Println('Line S =',0); + Circle(var c): Println('Circle S =',c.Radius*c.Radius*Pi); + Rectangle(var r): Println('Rectangle S =',r.Width*r.Height); + end; +end. \ No newline at end of file diff --git a/LanguageFeatures/Pattern Matching/UserDefinedDeconstruct.pas b/LanguageFeatures/Pattern Matching/UserDefinedDeconstruct.pas new file mode 100644 index 0000000..044339b --- /dev/null +++ b/LanguageFeatures/Pattern Matching/UserDefinedDeconstruct.pas @@ -0,0 +1,27 @@ +type + Person = class + name: string; + age: integer; + + constructor(name: string; age: integer); + begin + self.name := name; + self.age := age; + end; + + procedure Deconstruct(var name: string; var age: integer); + begin + name := self.name; + age := self.age; + end; + end; + +begin + var p := new Person('Петр', 25); + if p is Person(var name, var age) then + Println(name, age); + + match p with + Person(name,age): Println(name,age); + end; +end. \ No newline at end of file diff --git a/LanguageFeatures/Pattern Matching/UserDefinedDeconstructAsExtension.pas b/LanguageFeatures/Pattern Matching/UserDefinedDeconstructAsExtension.pas new file mode 100644 index 0000000..89b4878 --- /dev/null +++ b/LanguageFeatures/Pattern Matching/UserDefinedDeconstructAsExtension.pas @@ -0,0 +1,20 @@ +// Деконструктор как метод расширения + +procedure Deconstruct(Self: integer; var a: integer; var b: integer); extensionmethod; +begin + a := Self div 10; + b := Self mod 10; +end; + + +begin + var i := 25; + if i is integer(var a, var b) then + Println(a,b); + + i := 9; + match i with + integer(a,b) when i>=10: Println(a,b); + integer(a): Println(a); // деконструктор по умолчанию + end; +end. \ No newline at end of file diff --git a/LanguageFeatures/ProcParam.pas b/LanguageFeatures/ProcParam.pas new file mode 100644 index 0000000..3555e1b --- /dev/null +++ b/LanguageFeatures/ProcParam.pas @@ -0,0 +1,20 @@ +// Иллюстрация процедурных переменных как параметров подпрограмм +// Для процедурного типа в PascalABC.NET реализована структурная эквивалентность типов +// Процедурный тип реализован через делегаты .NET +procedure for_each(a: array of real; p: procedure(var r: real)); +begin + for var i := 0 to a.Length-1 do + p(a[i]); +end; + +procedure mult2(var r: real) := r := 2*r; + +procedure print(var r: real) := write(r,' '); + +var a: array of real := (1,2,3,6,7); + +begin + for_each(a,print); writeln; + for_each(a,mult2); + for_each(a,print); +end. \ No newline at end of file diff --git a/LanguageFeatures/ProcVars.pas b/LanguageFeatures/ProcVars.pas new file mode 100644 index 0000000..6a4e88d --- /dev/null +++ b/LanguageFeatures/ProcVars.pas @@ -0,0 +1,36 @@ +// Все возможные способы инициализации поцедурной переменной +// Процедурный тип реализован через делегаты .NET, для него доступны операции +=, -= + +procedure pp; +begin + writeln('Вызов обычной процедуры'); +end; + +type + A = class + private + x: integer; + public + constructor Create(xx: integer); + begin + x := xx; + end; + procedure pp; + begin + writeln('Вызов метода класса, значение поля равно ',x); + end; + class procedure ppstatic; + begin + writeln('Вызов классового метода класса'); + end; + end; + +var p: procedure; + +begin + p := pp; + var a1: A := new A(5); + p += a1.pp; + p += A.ppstatic; + p; +end. \ No newline at end of file diff --git a/LanguageFeatures/QuestionColonTypes.pas b/LanguageFeatures/QuestionColonTypes.pas new file mode 100644 index 0000000..0ea5c29 --- /dev/null +++ b/LanguageFeatures/QuestionColonTypes.pas @@ -0,0 +1,176 @@ +begin + var i0: shortint; + var i1: byte; + var i2: smallint; + var i3: word; + var i4: integer; + var i5: longword; + var i6: int64; + var i7: uint64; + var i8: BigInteger; + var i9: single; + var ia: real; + var ib: decimal; + + var n := 12; + + var b := new string[12,12]; + + b[0,0] := (True ? i0 : i0).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[0,1] := (True ? i0 : i1).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[0,2] := (True ? i0 : i2).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[0,3] := (True ? i0 : i3).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[0,4] := (True ? i0 : i4).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[0,5] := (True ? i0 : i5).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[0,6] := (True ? i0 : i6).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[0,7] := (True ? i0 : i7).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[0,8] := (True ? i0 : i8).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[0,9] := (True ? i0 : i9).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[0,10] := (True ? i0 : ia).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[0,11] := (True ? i0 : ib).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + + b[1,0] := (True ? i1 : i0).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[1,1] := (True ? i1 : i1).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[1,2] := (True ? i1 : i2).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[1,3] := (True ? i1 : i3).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[1,4] := (True ? i1 : i4).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[1,5] := (True ? i1 : i5).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[1,6] := (True ? i1 : i6).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[1,7] := (True ? i1 : i7).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[1,8] := (True ? i1 : i8).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[1,9] := (True ? i1 : i9).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[1,10] := (True ? i1 : ia).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[1,11] := (True ? i1 : ib).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + + b[2,0] := (True ? i2 : i0).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[2,1] := (True ? i2 : i1).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[2,2] := (True ? i2 : i2).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[2,3] := (True ? i2 : i3).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[2,4] := (True ? i2 : i4).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[2,5] := (True ? i2 : i5).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[2,6] := (True ? i2 : i6).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[2,7] := (True ? i2 : i7).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[2,8] := (True ? i2 : i8).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[2,9] := (True ? i2 : i9).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[2,10] := (True ? i2 : ia).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[2,11] := (True ? i2 : ib).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + + b[3,0] := (True ? i3 : i0).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[3,1] := (True ? i3 : i1).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[3,2] := (True ? i3 : i2).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[3,3] := (True ? i3 : i3).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[3,4] := (True ? i3 : i4).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[3,5] := (True ? i3 : i5).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[3,6] := (True ? i3 : i6).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[3,7] := (True ? i3 : i7).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[3,8] := (True ? i3 : i8).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[3,9] := (True ? i3 : i9).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[3,10] := (True ? i3 : ia).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[3,11] := (True ? i3 : ib).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + + b[4,0] := (True ? i4 : i0).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[4,1] := (True ? i4 : i1).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[4,2] := (True ? i4 : i2).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[4,3] := (True ? i4 : i3).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[4,4] := (True ? i4 : i4).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[4,5] := (True ? i4 : i5).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[4,6] := (True ? i4 : i6).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[4,7] := (True ? i4 : i7).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[4,8] := (True ? i4 : i8).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[4,9] := (True ? i4 : i9).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[4,10] := (True ? i4 : ia).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[4,11] := (True ? i4 : ib).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + + b[5,0] := (True ? i5 : i0).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[5,1] := (True ? i5 : i1).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[5,2] := (True ? i5 : i2).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[5,3] := (True ? i5 : i3).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[5,4] := (True ? i5 : i4).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[5,5] := (True ? i5 : i5).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[5,6] := (True ? i5 : i6).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[5,7] := (True ? i5 : i7).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[5,8] := (True ? i5 : i8).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[5,9] := (True ? i5 : i9).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[5,10] := (True ? i5 : ia).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[5,11] := (True ? i5 : ib).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + + b[6,0] := (True ? i6 : i0).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[6,1] := (True ? i6 : i1).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[6,2] := (True ? i6 : i2).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[6,3] := (True ? i6 : i3).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[6,4] := (True ? i6 : i4).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[6,5] := (True ? i6 : i5).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[6,6] := (True ? i6 : i6).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[6,7] := (True ? i6 : i7).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[6,8] := (True ? i6 : i8).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[6,9] := (True ? i6 : i9).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[6,10] := (True ? i6 : ia).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[6,11] := (True ? i6 : ib).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + + b[7,0] := (True ? i7 : i0).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[7,1] := (True ? i7 : i1).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[7,2] := (True ? i7 : i2).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[7,3] := (True ? i7 : i3).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[7,4] := (True ? i7 : i4).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[7,5] := (True ? i7 : i5).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[7,6] := (True ? i7 : i6).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[7,7] := (True ? i7 : i7).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[7,8] := (True ? i7 : i8).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[7,9] := (True ? i7 : i9).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[7,10] := (True ? i7 : ia).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[7,11] := (True ? i7 : ib).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + + b[8,0] := (True ? i8 : i0).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[8,1] := (True ? i8 : i1).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[8,2] := (True ? i8 : i2).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[8,3] := (True ? i8 : i3).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[8,4] := (True ? i8 : i4).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[8,5] := (True ? i8 : i5).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[8,6] := (True ? i8 : i6).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[8,7] := (True ? i8 : i7).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[8,8] := (True ? i8 : i8).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[8,9] := '--'.PadLeft(n); + b[8,10] := '--'.PadLeft(n); + b[8,11] := '--'.PadLeft(n); + + b[9,0] := (True ? i9 : i0).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[9,1] := (True ? i9 : i1).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[9,2] := (True ? i9 : i2).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[9,3] := (True ? i9 : i3).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[9,4] := (True ? i9 : i4).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[9,5] := (True ? i9 : i5).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[9,6] := (True ? i9 : i6).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[9,7] := (True ? i9 : i7).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[9,8] := '--'.PadLeft(n); + b[9,9] := (True ? i9 : i9).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[9,10] := (True ? i9 : ia).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[9,11] := '--'.PadLeft(n); + + b[10,0] := (True ? ia : i0).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[10,1] := (True ? ia : i1).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[10,2] := (True ? ia : i2).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[10,3] := (True ? ia : i3).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[10,4] := (True ? ia : i4).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[10,5] := (True ? ia : i5).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[10,6] := (True ? ia : i6).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[10,7] := (True ? ia : i7).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[10,8] := '--'.PadLeft(n); + b[10,9] := (True ? ia : i9).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[10,10] := (True ? ia : ia).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[10,11] := '--'.PadLeft(n); + + b[11,0] := (True ? ib : i0).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[11,1] := (True ? ib : i1).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[11,2] := (True ? ib : i2).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[11,3] := (True ? ib : i3).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[11,4] := (True ? ib : i4).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[11,5] := (True ? ib : i5).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[11,6] := (True ? ib : i6).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[11,7] := (True ? ib : i7).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + b[11,8] := '--'.PadLeft(n); + b[11,9] := '--'.PadLeft(n); + b[11,10] := '--'.PadLeft(n); + b[11,11] := (True ? ib : ib).GetType.ToString.Substring(7).ToWords('.').Last.PadLeft(n); + + b.Println(8); +end. \ No newline at end of file diff --git a/LanguageFeatures/ShortTypesInTemplateParams.pas b/LanguageFeatures/ShortTypesInTemplateParams.pas new file mode 100644 index 0000000..3410bd2 --- /dev/null +++ b/LanguageFeatures/ShortTypesInTemplateParams.pas @@ -0,0 +1,19 @@ +begin + var q := new Queue<(integer,integer)>; + q.Enqueue((1,2)); + q.Enqueue((2,5)); + q.Println; + Println(q); + + var l := new Listinteger>; + l.Add(x->x); + l.Add(x->x*x); + l.ForEach(f->Print(f(5))); + Println; + + var l1 := new List<(integer,integer)->integer>; + l1.Add((x,y)->x+y); + l1.Add((x,y)->x-y); + l1.Add((x,y)->x*y); + l1.ForEach(f->Print(f(2,3))); +end. \ No newline at end of file diff --git a/LanguageFeatures/Students.pas b/LanguageFeatures/Students.pas new file mode 100644 index 0000000..a90af77 --- /dev/null +++ b/LanguageFeatures/Students.pas @@ -0,0 +1,22 @@ +// Перегрузка операторов +type + Student = auto class + Name: string; + Height: integer; + public + // Сравнение по росту + class function operator<(left,right: Student): boolean := left.Height < right.Height; + class function operator>(left,right: Student): boolean := left.Height > right.Height; + function ToString: string; override := string.Format('{0} ({1})', Name, Height); + end; + +begin + var s1 := new Student('Stepa Morkovkin',188); + var s2 := new Student('Petya Pomidorov',180); + Writeln('s1: ',s1); + Writeln('s2: ',s2); + Writeln; + Writeln('s1(s1,s2): ',Student.operator>(s1,s2)); +end. \ No newline at end of file diff --git a/LanguageFeatures/Tuples/MySqrt.pas b/LanguageFeatures/Tuples/MySqrt.pas new file mode 100644 index 0000000..a976c51 --- /dev/null +++ b/LanguageFeatures/Tuples/MySqrt.pas @@ -0,0 +1,14 @@ +function MySqrt(x: real): real; +begin + var eps := 1e-15; + (var a, var b) := (x, real.MaxValue); + while abs(b-a) >= eps do + (a,b) := (b,(a + x / a) / 2); + Result := b; +end; + +begin + Println(MySqrt(2)); + Println(MySqrt(3)); + Println(MySqrt(4)); +end. \ No newline at end of file diff --git a/LanguageFeatures/WriteCycledLinkedList.pas b/LanguageFeatures/WriteCycledLinkedList.pas new file mode 100644 index 0000000..2a2d42e --- /dev/null +++ b/LanguageFeatures/WriteCycledLinkedList.pas @@ -0,0 +1,19 @@ +type + Node = class + public + data: T; + next: Node; + constructor (d: T; n: Node); + begin + data := d; + next := n; + end; + end; + +begin + var n1 := new Node(5,nil); + var n2 := new Node(6,n1); + writeln(n2); + n1.next := n2; + writeln(n2); +end. \ No newline at end of file diff --git a/LanguageFeatures/WriteRecord.pas b/LanguageFeatures/WriteRecord.pas new file mode 100644 index 0000000..d35db74 --- /dev/null +++ b/LanguageFeatures/WriteRecord.pas @@ -0,0 +1,26 @@ +// Иллюстрация конструкторов и методов в записях +// Если переопределен метод ToString, то он вызывается при выводе объекта этого типа процедурой writeln +type + SexType = (Male, Female); + Person = record + Name: string; + Age, Weight: integer; + Sex: SexType; + constructor (Name: string; Age, Weight: integer; Sex: SexType); + begin + Self.Name := Name; + Self.Age := Age; + Self.Sex := Sex; + Self.Weight := Weight; + end; + function ToString: string; override; + begin + Result := string.Format('Имя: {0} Возраст: {1} Вес: {2} Пол: {3}', Name, Age, Weight, Sex); + end; + end; + +var p: Person := new Person('Иванов',20,70,SexType.Male); + +begin + writeln(p); +end. diff --git a/LanguageFeatures/Yields/InfixTraverseTree.pas b/LanguageFeatures/Yields/InfixTraverseTree.pas new file mode 100644 index 0000000..e56cb7f --- /dev/null +++ b/LanguageFeatures/Yields/InfixTraverseTree.pas @@ -0,0 +1,20 @@ +type Node = auto class + data: T; + left,right: Node; +end; + +function CNode(x: T; l: Node := nil; + r: Node := nil): Node := new Node(x,l,r); + +function Infix(root: Node): sequence of T; +begin + if root = nil then exit; + yield sequence Infix(root.left); + yield root.data; + yield sequence Infix(root.right); +end; + +begin + var root := CNode(1,CNode(2,CNode(3),CNode(4)),CNode(5)); + Infix(root).Print; +end. \ No newline at end of file diff --git a/NETLibraries/NET4.0/BigIntegerExample.pas b/NETLibraries/NET4.0/BigIntegerExample.pas new file mode 100644 index 0000000..fb473bc --- /dev/null +++ b/NETLibraries/NET4.0/BigIntegerExample.pas @@ -0,0 +1,12 @@ +// Использование длинных целых. Вычисление 100! +{$reference 'System.Numerics.dll'} +uses System.Numerics; + +var n := 100; + +begin + var f := new BigInteger(1); + for var i:=2 to n do + f := f * i; + writelnFormat('{0}! = {1}',n,f); +end. \ No newline at end of file diff --git a/NETLibraries/NET4.0/ComplexExample.pas b/NETLibraries/NET4.0/ComplexExample.pas new file mode 100644 index 0000000..818b4fe --- /dev/null +++ b/NETLibraries/NET4.0/ComplexExample.pas @@ -0,0 +1,17 @@ +// Использование комплексных чисел +{$reference 'System.Numerics.dll'} +uses System.Numerics; + +begin + var a := new Complex(0,1); + writeln('Мнимая единица: ', a); + + var b := Complex.Sqrt(a); + writeln('Главный корень из мнимой единицы: ', b); + + var c := a*a; + writeln('Квадрат мнимой единицы: ', c); + + var d := new Complex(1,2); + writelnFormat('Модуль {0} равен {1}', d,d.Magnitude); +end. \ No newline at end of file diff --git a/NETLibraries/NET4.0/StopWatch.pas b/NETLibraries/NET4.0/StopWatch.pas new file mode 100644 index 0000000..98c6be5 --- /dev/null +++ b/NETLibraries/NET4.0/StopWatch.pas @@ -0,0 +1,11 @@ +// Stopwatch - класс высокоточного таймера (с точностью до 0.001 с) +begin + var stopWatch := new System.Diagnostics.Stopwatch; + stopWatch.Start; + + Sleep(123); + + stopWatch.Stop; + var ts := stopWatch.Elapsed; + writelnFormat('Время работы: {0:00}:{1:00}:{2:00}.{3:000}',ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds); +end. \ No newline at end of file diff --git a/NETLibraries/NET4.0/TupleCreate.pas b/NETLibraries/NET4.0/TupleCreate.pas new file mode 100644 index 0000000..9d07269 --- /dev/null +++ b/NETLibraries/NET4.0/TupleCreate.pas @@ -0,0 +1,10 @@ +// Создание кортежей +uses System; + +begin + var a := Tuple.Create('Иванов',24); + writeln(a.Item1,' ',a.Item2); + + var b := Tuple.Create('Петров',17,1,11); + writeln(b.Item1,' ',b.Item2,' ',b.Item3,' ',b.Item4); +end. \ No newline at end of file diff --git a/NETLibraries/System.Array/SystemArray1.pas b/NETLibraries/System.Array/SystemArray1.pas new file mode 100644 index 0000000..2bce694 --- /dev/null +++ b/NETLibraries/System.Array/SystemArray1.pas @@ -0,0 +1,37 @@ +Uses System, PABCSystem; + +const Size = 10; + +procedure PrintArray(a: array of T); +begin + foreach v: T in a do + Write(v, ' '); + Writeln; +end; + +var a: array of integer; + +begin + SetLength(a, Size); + // Заполнение массива + for var i:=0 to a.Length-1 do + a[i] := Random(100); + + // Вывод всех элементов массива + PrintArray(a); + + // Сортировка массива (знак & используется для того, + // чтобы воспользоваться ключевым словом array при обозначении класса Array) + &Array.Sort(a); + + PrintArray(a); + + // Обращение массива + &Array.Reverse(a); + + PrintArray(a); + + // Поиск вхождения элемента в массив + var i := &Array.IndexOf(a, 99); + Writeln(i); +end. \ No newline at end of file diff --git a/NETLibraries/System.DateTime/DateTime1.pas b/NETLibraries/System.DateTime/DateTime1.pas new file mode 100644 index 0000000..9832b1c --- /dev/null +++ b/NETLibraries/System.DateTime/DateTime1.pas @@ -0,0 +1,32 @@ +Uses System; + +var + d1, d2, d3: DateTime; // Объекты для хранения даты и времени + ts: TimeSpan; // Объект для хранения промежутков времени + +begin + // Получение текущей даты - вызов статического метода + d1 := DateTime.Now; + Writeln(d1); + + // Дата и время через один месяц + d2 := d1.AddMonths(1); + Writeln(d2); + + // Дата и время на 12 часов раньше + d2 := d1.AddHours(-12); + Writeln(d2); + + // Формирование даты - вызов конструктора объекта (год, месяц,число) + d3 := new DateTime(2001, 1, 1); + Writeln(d3); + + // Определение времени, прошедшего с начала тысячелетия (разность дат) + ts := d1.Subtract(d3); + + // Промежуток времени в днях (результат - вещественное число) + Writeln(ts.TotalDays); + + // Промежуток времени в днях, часах, минутах и секундах + WritelnFormat('{0} {1}:{2}:{3}',ts.Days,ts.Hours,ts.Minutes,ts.Seconds); +end. \ No newline at end of file diff --git a/NETLibraries/System.DateTime/DateTime2.pas b/NETLibraries/System.DateTime/DateTime2.pas new file mode 100644 index 0000000..f444870 --- /dev/null +++ b/NETLibraries/System.DateTime/DateTime2.pas @@ -0,0 +1,34 @@ +Uses System; + +var + d: DateTime; + s: string; + +begin + s := '27.03.2008 9:58:17'; + //Попытка преобразования строки в объект DateTime + if not DateTime.TryParse(s, d) then + begin + Writeln('Строка не содержит значение даты и времени'); + Exit; + end; + + // Проверка високосности заданного года с помощью статического метода + if DateTime.IsLeapYear(d.Year) then + Writeln('Год високосный') + else + Writeln('Год невисокосный'); + + // Преобразование даты и времени в строковое представление + s := d.ToString; + Writeln(s); + + // Преобразование даты в строковое представление + s := d.ToShortDateString; + Writeln(s); + + // Преобразование времени в строковое представление + s := d.ToShortTimeString; + Writeln(s); + +end. \ No newline at end of file diff --git a/NETLibraries/System.DateTime/DateTimeInterval.pas b/NETLibraries/System.DateTime/DateTimeInterval.pas new file mode 100644 index 0000000..b7afdf9 --- /dev/null +++ b/NETLibraries/System.DateTime/DateTimeInterval.pas @@ -0,0 +1,16 @@ +// Работа с классом System.DateTime +// Вычисление времени выполнения фрагмента кода + +uses System, PABCSystem; + +var dt: DateTime := DateTime.Now; + +begin + // Делаем случайную паузу + var ms := Random(1000); + Writeln('Sleep','(',ms,')'); + Sleep(ms); + + // Сравниваем с показаниями DateTime.Now + Writeln((DateTime.Now-dt).TotalMilliseconds,'ms'); +end. \ No newline at end of file diff --git a/NETLibraries/System.Net/DownloadFile.pas b/NETLibraries/System.Net/DownloadFile.pas new file mode 100644 index 0000000..3d6f11c --- /dev/null +++ b/NETLibraries/System.Net/DownloadFile.pas @@ -0,0 +1,12 @@ +// Скачивание файла +uses System.Net; + +const + address = 'www.yandex.ru'; + filename = 'LogoPABCNET2010_Rus.png'; + +begin + var w := new WebClient(); + w.DownloadFile('http://pascalabc.net/images/logo/'+filename,filename); + Exec(filename); +end. \ No newline at end of file diff --git a/NETLibraries/System.Net/MailSend.pas b/NETLibraries/System.Net/MailSend.pas new file mode 100644 index 0000000..666b6e7 --- /dev/null +++ b/NETLibraries/System.Net/MailSend.pas @@ -0,0 +1,17 @@ +// Исправьте имя SMTP-сервера SMTPServerName и адрес получателя toReceiver! +uses System.Net.Mail; + +const + SMTPServerName = 'mail.spark-mail.ru'; + +begin + var fromSender := 'ivanov@mail.ru'; + var toReceiver := 'petrov@yandex.ru'; + var subject := 'Proba'; + var body := 'Hello!' + NewLine + 'I am robot!'; + var message := new MailMessage(fromSender, toReceiver, subject, body); + + var mailClient := new SmtpClient(SMTPServerName); + + mailClient.Send(message); +end. \ No newline at end of file diff --git a/NETLibraries/System.Net/Ping.pas b/NETLibraries/System.Net/Ping.pas new file mode 100644 index 0000000..269017b --- /dev/null +++ b/NETLibraries/System.Net/Ping.pas @@ -0,0 +1,16 @@ +// Использование Ping +uses System.Net.NetworkInformation; + +const address = 'www.yandex.ru'; + +begin + var p := new Ping(); + try + var res := p.Send(address); + writeln('IP адрес сервера: ',res.Address); + writeln('Время отклика: ',res.RoundtripTime,' мс'); + except + on e: Exception do + write(e.Message); + end; +end. \ No newline at end of file diff --git a/NETLibraries/System.Net/WebClient.pas b/NETLibraries/System.Net/WebClient.pas new file mode 100644 index 0000000..0e5b12e --- /dev/null +++ b/NETLibraries/System.Net/WebClient.pas @@ -0,0 +1,10 @@ +// Использование WebClient +uses System.Net; + +begin + var w := new WebClient(); + w.Encoding := System.Text.Encoding.UTF8; + var s := w.DownloadString('http://pascalabc.net'); + writeln(s); + w.DownloadFile('http://pascalabc.net/images/logo/LogoPABCNET2010_Rus.png','LogoPABCNET2010_Rus.png'); +end. \ No newline at end of file diff --git a/NETLibraries/System.Parallel/Parallel1.pas b/NETLibraries/System.Parallel/Parallel1.pas new file mode 100644 index 0000000..5cdfcd0 --- /dev/null +++ b/NETLibraries/System.Parallel/Parallel1.pas @@ -0,0 +1,8 @@ +Uses System,System.Net,System.Threading.Tasks; + +begin + Parallel.Invoke ( + procedure -> begin (new WebClient()).DownloadFile ('http://yandex.ru', 'yandex.html') end, + procedure -> begin (new WebClient()).DownloadFile ('http://pascalabc.net', 'pabc.html') end + ); +end. \ No newline at end of file diff --git a/NETLibraries/System.Parallel/Parallel2.pas b/NETLibraries/System.Parallel/Parallel2.pas new file mode 100644 index 0000000..8b4fd3e --- /dev/null +++ b/NETLibraries/System.Parallel/Parallel2.pas @@ -0,0 +1,46 @@ +uses + System, System.Net, System.Threading.Tasks; + +type + Int = class + N: int64; + constructor(NN: int64); + begin + N := NN; + end; + + function IsPrime: boolean; + begin + Result := True; + for var i: int64 := 2 to round(sqrt(N)) do + if N mod i = 0 then + begin + Result := False; + exit; + end; + end; + end; + +type + BTask = Task; + +begin + var ss: array of int64 := (1265713689122381, 1265713689122461, 1265713689142451, 1265713689542501); // Все числа - простые + var tb := new BTask[4]; + // Запуск 4 потоков из пула потоков + // У каждого tb[i] свой Result! + for var i := 0 to ss.Length - 1 do + tb[i] := Task.Factory.StartNew((new Int(ss[i])).IsPrime); + + // Если поток не закончился, то обращение к tb[i].Result приостанавливает основную программу + for var i := 0 to tb.Length - 1 do + writeln(tb[i].Result); + // В эту точку мы попадем только после окончания всех четырех потоков + writeln(Milliseconds); + + // Последовательное выполнение + var t := Milliseconds; + for var i := 0 to ss.Length - 1 do + writeln((new Int(ss[i])).IsPrime); + writeln(Milliseconds - t); +end. \ No newline at end of file diff --git a/NETLibraries/System.Parallel/Parallel3.pas b/NETLibraries/System.Parallel/Parallel3.pas new file mode 100644 index 0000000..c058cad --- /dev/null +++ b/NETLibraries/System.Parallel/Parallel3.pas @@ -0,0 +1,57 @@ +uses + System, System.Net, System.Threading.Tasks, System.Collections.Generic; + +type + ListSimple = class + l := new List(); + procedure AddSimple(N: int64); + begin + var Result := True; + for var i: int64 := 2 to round(sqrt(N)) do + if N mod i = 0 then + begin + Result := False; + break; + end; + // lock не позволяет нескольким потокам одновременно выполнять эту секцию. + // Это обязательно, иначе если несколько потоков одновременно будут пытаться добавить значение в список, список может оказаться испорченным + // Секция, охраняемая lock, называется критической + lock l do + if Result then + l.Add(N); + end; + end; + +var hh := 1000; + +begin + var ls := new ListSimple; + + var ii: int64 := 1265713689181; + + Parallel.For(ii,ii+hh,ls.AddSimple); + + writeln(ls.l.Count); + // ls.l := ls.l.OrderBy(x->x).ToList(); - это можно включить для проверки того, что в обоих списках - одинаковые простые числа + for var i:=0 to ls.l.Count-1 do + write(ls.l[i],' '); + // Надо обратить внимание, что выводится неупорядоченная последовательность простых чисел ! + + writeln; + writeln('Время выполнения = ',Milliseconds); + + // То же, но непараллельно + var ls1 := new ListSimple; + + var t := Milliseconds; + for var i:=ii to ii+hh-1 do + ls1.AddSimple(i); + writeln(ls1.l.Count); + for var i:=0 to ls1.l.Count-1 do + write(ls1.l[i],' '); + writeln; + writeln('Время выполнения = ',Milliseconds-t); + + // Проверка того, что списки простых как множества совпадают + writeln('Количество элементов в разности множеств = ',ls.l.Except(ls1.l).Count()); +end. \ No newline at end of file diff --git a/NETLibraries/System.String/StringConvert.pas b/NETLibraries/System.String/StringConvert.pas new file mode 100644 index 0000000..fe2a5b8 --- /dev/null +++ b/NETLibraries/System.String/StringConvert.pas @@ -0,0 +1,25 @@ +var + s: string; + i: integer; + r: real; + +begin + // Преобразование строки в число + s := '123,3443'; // Дробная часть отделяется запятой - настройки Windows + if not real.TryParse(s, r) then + Writeln('Строка s не является строковым представлением вещественного числа') + else Writeln(r); + + if not integer.TryParse(s, i) then + Writeln('Строка s не является строковым представлением целого числа'); + + // Преобразование числа в строку + i := 10; + s := i.ToString; + Writeln(s); + + s := ''; + for i:=1 to 9 do + s += i.ToString; + Writeln(s); +end. \ No newline at end of file diff --git a/NETLibraries/System.String/StringMethods1.pas b/NETLibraries/System.String/StringMethods1.pas new file mode 100644 index 0000000..b0db02e --- /dev/null +++ b/NETLibraries/System.String/StringMethods1.pas @@ -0,0 +1,30 @@ +var s1,s2: string; + +begin + // Определение длины строки + s1 := 'ABCDEFGH'; + Writeln(s1.Length); + + // Сравнение строк без учета регистра символов + s1 := 'AAA'; + s2 := 'aaa'; + if String.Compare(s1, s2, {ignoreCase - без учета регистра} true) = 0 then + Writeln('Строки совпадают с точностью до регистра букв'); + + // Определение вхождений подстрок + s1 := 'Long string'; + s2 := 'string'; + if s1.EndsWith(s2) then + Writeln('В конце строки s1 содержится подстрока, совпадающая с s2'); + + // Поиск индекса вхождения подстроки в строку + Writeln(s1.IndexOf(s2)); + + // Извлечение подстрок + s1 := 'ABCDEFGH'; + s2 := s1.Substring( {начальная_позиция = } 3); + Writeln(s2); + + s2 := s1.Substring(3, {длина_подстроки = } 2); + Writeln(s2); +end. \ No newline at end of file diff --git a/NETLibraries/System.String/StringMethods2.pas b/NETLibraries/System.String/StringMethods2.pas new file mode 100644 index 0000000..13cc3e5 --- /dev/null +++ b/NETLibraries/System.String/StringMethods2.pas @@ -0,0 +1,37 @@ +var s1,s2: string; + +begin + // Извлечение подстрок + s1 := 'ABCDEFGH'; + s2 := s1.Substring( {начальная_позиция = } 3); + Writeln(s2); + + s2 := s1.Substring(3, {длина_подстроки = } 2); + Writeln(s2); + + // Вставка, удаление и замена подстрок + s1 := 'ABCDEFGH'; + s2 := s1.Insert(2, 'xxx'); + Writeln(s2); + + s2 := s2.Replace('x', '!'); + Writeln(s2); + + s2 := s2.Remove(2, 3); + Writeln(s2); + + s1 := 'слово слово слово'; + s2 := s1.Replace('слов', 'молок'); + Writeln(s2); + + // Удаление пробельных символов в концах строки + s1 := ' xxx xxx '; + Writeln('|', s1, '|'); + s1 := s1.Trim; + Writeln('|', s1, '|'); + + // Смена регистра символов + s1 := 'абвгд'; + s1 := s1.ToUpper; + Writeln(s1); +end. \ No newline at end of file diff --git a/NETLibraries/System.String/StringSplit.pas b/NETLibraries/System.String/StringSplit.pas new file mode 100644 index 0000000..184c12c --- /dev/null +++ b/NETLibraries/System.String/StringSplit.pas @@ -0,0 +1,26 @@ +uses System; + +var + str_arr: array of string; + int_arr: array of integer; + s: string := '12 765 765 76'; + +begin + // Разбиение строки на массив подстрок с заданным разелителем + str_arr := s.Split(' '); + + // Соединение массива подстрок с новым разделителем + s := string.Join('+', str_arr); + Write(s, '='); + + // Формирование целочисленного массива по массиву подстрок + SetLength(int_arr, str_arr.Length); + for var i:=0 to int_arr.Length-1 do + integer.TryParse(str_arr[i], int_arr[i]); + + // Вычисление суммы элементов целочисленного массива + var sum := 0; + foreach v: integer in int_arr do + sum += v; + Writeln(sum); +end. \ No newline at end of file diff --git a/NETLibraries/System.Timers.Timer/SystemTimer.pas b/NETLibraries/System.Timers.Timer/SystemTimer.pas new file mode 100644 index 0000000..8223bd8 --- /dev/null +++ b/NETLibraries/System.Timers.Timer/SystemTimer.pas @@ -0,0 +1,31 @@ +//События, +=, -=, демонстрация работы таймера System.Timers.Timer +uses System; + +var Timer:System.Timers.Timer; + x:integer; + exit:boolean; + +procedure OnTimer2(sender:object; e:System.Timers.ElapsedEventArgs); +begin + Writeln(x); + x:=x+1; + exit:=x>=10; +end; +procedure OnTimer1(sender:object; e:System.Timers.ElapsedEventArgs); +begin + Writeln(e.SignalTime); + x:=x+1; + if x>=5 then begin + Timer.Elapsed-=OnTimer1; + Timer.Elapsed+=OnTimer2; + end; +end; + +begin + Exit:=false; + Timer:=System.Timers.Timer.Create(1000); + Timer.Elapsed+=OnTimer1; + Timer.Start; + while not exit do + Sleep(Round(Timer.Interval)); +end. \ No newline at end of file diff --git a/NETLibraries/System.Windows.Forms/FormWebBrowser.pas b/NETLibraries/System.Windows.Forms/FormWebBrowser.pas new file mode 100644 index 0000000..51a1936 --- /dev/null +++ b/NETLibraries/System.Windows.Forms/FormWebBrowser.pas @@ -0,0 +1,17 @@ +// Иллюстрация использования компонента WebBrowser +{$apptype windows} +{$reference 'System.Windows.Forms.dll'} + +uses + System.Windows.Forms, + System.Net; + +begin + var myForm := new Form; + var w := new WebBrowser; + w.Url := new System.Uri('http://pascalabc.net'); + w.Dock := Dockstyle.Fill; + myForm.Controls.Add(w); + myForm.WindowState := FormWindowState.Maximized; + Application.Run(myForm); +end. diff --git a/NETLibraries/System.Windows.Forms/MouseDraw.pas b/NETLibraries/System.Windows.Forms/MouseDraw.pas new file mode 100644 index 0000000..db17bcf --- /dev/null +++ b/NETLibraries/System.Windows.Forms/MouseDraw.pas @@ -0,0 +1,52 @@ +// Рисование мышью на форме. Иллюстрация Windows.Forms, событий +{$apptype windows} +{$reference 'System.Windows.Forms.dll'} +{$reference 'System.Drawing.dll'} + +uses + System, + System.Drawing, + System.Windows.Forms; + +type + MyForm = class(Form) + private + g: Graphics; + // Предыдущие координаты мыши + x,y: integer; + public + constructor; + begin + Size := new System.Drawing.Size(640,480); + StartPosition := FormStartPosition.CenterScreen; + Text := 'Рисование мышью на форме'; + // Привязка обработчиков к событиям + MouseDown += OnMouseDown; + MouseMove += OnMouseMove; + Resize += OnResize; + g := Graphics.FromHwnd(Handle); + end; + procedure OnMouseDown(sender: object; e: MouseEventArgs); + begin + x := e.x; + y := e.y; + end; + procedure OnMouseMove(sender: object; e: MouseEventArgs); + begin + if e.Button = System.Windows.Forms.MouseButtons.Left then + begin + g.DrawLine(new Pen(Color.FromARGB(PABCSystem.Random(255),PABCSystem.Random(255),PABCSystem.Random(255))),x,y,e.x,e.y); + x := e.x; + y := e.y; + writeln(e.x,' ',e.y); + end; + end; + procedure OnResize(sender: object; e: EventArgs); + begin + g := Graphics.FromHwnd(Handle); + end; + end; + +begin + Application.Run(new MyForm); +end. \ No newline at end of file diff --git a/NETLibraries/System.Windows.Forms/WinFormWithButton.pas b/NETLibraries/System.Windows.Forms/WinFormWithButton.pas new file mode 100644 index 0000000..ecfa4db --- /dev/null +++ b/NETLibraries/System.Windows.Forms/WinFormWithButton.pas @@ -0,0 +1,29 @@ +// Создание оконного приложения +{$apptype windows} +{$reference 'System.Windows.Forms.dll'} + +uses + System, + System.Windows.Forms; + +var + myForm: Form; + myButton: Button; + +procedure MyButtonClick(sender: Object; e: EventArgs); +begin + myForm.Close; +end; + +begin + myForm := new Form; + myForm.Text := 'Оконное приложение'; + myButton := new Button; + myButton.Text := ' Закрыть окно '; + myButton.AutoSize := True; + myButton.Left := 90; + myButton.Top := 110; + myForm.Controls.Add(myButton); + myButton.Click += MyButtonClick; + Application.Run(myForm); +end. diff --git a/NumLibABC/ApproxCheb1.pas b/NumLibABC/ApproxCheb1.pas new file mode 100644 index 0000000..915dbf8 --- /dev/null +++ b/NumLibABC/ApproxCheb1.pas @@ -0,0 +1,14 @@ +uses NumLibABC; + +// +// +begin + var e:=0.1; + var x:=ArrGen(12,i->0.25*i-2); x.Println; + var y:=x.Select(z->2*z-5*Sqr(z)+8*z*Sqr(z)).ToArray; y.Println; + var oL:=new ApproxCheb(x,y,e); + oL.f.Println; // + Println(oL.r,oL.tol); // + oL.MakeCoef; // + oL.c.Println; +end. diff --git a/NumLibABC/Decomp1.pas b/NumLibABC/Decomp1.pas new file mode 100644 index 0000000..120f4d0 --- /dev/null +++ b/NumLibABC/Decomp1.pas @@ -0,0 +1,11 @@ +uses NumLibABC; + +// +begin + var A:=new real[3,3] ((2,3,-1),(1,-2,1),(1,0,2)); + var B:=new real[3] (9,3,2); + var oL:=new Decomp(A); + oL.Solve(B); + B.Println; + Writeln('cond=',oL.cond) +end. diff --git a/NumLibABC/DiffEqu1.pas b/NumLibABC/DiffEqu1.pas new file mode 100644 index 0000000..133b8a2 --- /dev/null +++ b/NumLibABC/DiffEqu1.pas @@ -0,0 +1,29 @@ +uses NumLibABC; + +// + +procedure Orbit(t:real; y,yp:array of real); +// +// y[] yp[] +begin + var alpha:=Sqr(ArcTan(1.0)); + var r:=y[0]*y[0]+y[1]*y[1]; r:=r*Sqrt(r)/alpha; + yp[0]:=y[2]; yp[1]:=y[3]; yp[2]:=-y[0]/r; yp[3]:=-y[1]/r +end; + +begin + var e:=0.25; + var y:=Arr(1.0-e,0.0,0.0,ArcTan(1)*Sqrt((1.0+e)/(1.0-e))); + var (abserr,relerr):=(0.0,0.3e-6); + var oL:=new RKF45(Orbit, y, abserr, relerr); + var (t,tb,th):=(0.0,12.0,0.5); + var t_out:=t; + repeat + oL.Solve(t,t_out); + Writeln(t:5:1,oL.y[0]:15:9,oL.y[1]:15:9); + case oL.flag of + -3,-2,-1,1,8:begin Writeln('Flag=',oL.flag); Exit end; + 2:t_out:=t+th; + end + until t>=tb +end. diff --git a/NumLibABC/Economi1.pas b/NumLibABC/Economi1.pas new file mode 100644 index 0000000..a66bbd0 --- /dev/null +++ b/NumLibABC/Economi1.pas @@ -0,0 +1,12 @@ +uses NumLibABC; + +// +begin + var x:=ArrGen(8,-0.75,x->x+0.25); + var p:=new Polynom(0,1,-1/2,1/3,-1/4,1/5); + var r:=p.EconomSym(0.75, 0.05); + Println(r.eps,r.n); + r.PrintlnBeauty; + for var i:=1 to x.Length do + Write(r.Value(x[i-1]):0:3,' ') +end. diff --git a/NumLibABC/FMinN_1.pas b/NumLibABC/FMinN_1.pas new file mode 100644 index 0000000..b99d8d5 --- /dev/null +++ b/NumLibABC/FMinN_1.pas @@ -0,0 +1,13 @@ +uses NumLibABC; + +// - +function f(x:array of real):real:=100*Sqr(x[1]-Sqr(x[0]))+Sqr(1-x[0]); + +begin + var xb:=Arr(-1.2,1.0); + var oL:=new FMinN(xb,f); + var r:=oL.HJ; + Writeln(' : ',oL.iter); + Write(' : '); r.Println; + Writeln(' : ',f(r)); +end. diff --git a/NumLibABC/FMinN_2.pas b/NumLibABC/FMinN_2.pas new file mode 100644 index 0000000..4dcf385 --- /dev/null +++ b/NumLibABC/FMinN_2.pas @@ -0,0 +1,14 @@ +uses NumLibABC; + +// MKSearch +begin + var f:function(x:array of real):real:= x->Power(x[0],4)+ + Power(x[1],4)-2*Sqr(x[0])+4*x[0]*x[1]-2*Sqr(x[1])+3; + var a:=Arr(-20.0,-20.0); + var b:=Arr(20.0,20.0); + var y:real; + var oL:=new FMinN(a,f); + oL.MKSearch(a,b,y); + Write(' : '); oL.x.Println; + Writeln(' : ', y); +end. diff --git a/NumLibABC/FMinN_3.pas b/NumLibABC/FMinN_3.pas new file mode 100644 index 0000000..9d9cf69 --- /dev/null +++ b/NumLibABC/FMinN_3.pas @@ -0,0 +1,14 @@ +uses NumLibABC; + +// BPHS +begin + var f:function(x:array of real):real:= x->Power(x[0],4)+ + Power(x[1],4)-2*Sqr(x[0])+4*x[0]*x[1]-2*Sqr(x[1])+3; + var a:=Arr(-20.0,-20.0); // + var b:=Arr(20.0,20.0); // + var y:real; // + var oL:=new FMinN(a,f); + oL.BPHS(a,b,y); + Write(' : '); oL.x.Println; + Writeln(' : ', y); +end. diff --git a/NumLibABC/FMinN_4.pas b/NumLibABC/FMinN_4.pas new file mode 100644 index 0000000..809e15e --- /dev/null +++ b/NumLibABC/FMinN_4.pas @@ -0,0 +1,23 @@ +uses NumLibABC; + +// BestP +begin + var f:function(x:array of real):real:= x->Power(x[0],4)+ + Power(x[1],4)-2*Sqr(x[0])+4*x[0]*x[1]-2*Sqr(x[1])+3; + var a:=Arr(-20.0,-20.0); // + var b:=Arr(20.0,20.0); // + var x:=new real[a.Length]; // MinHJ + var oL:=new FMinN(x,f); + var r:=oL.BestP(a,b,0.01); + var y:real; + var fet:=f(Arr(Sqrt(2),-Sqrt(2))); + foreach var t in r do begin + (y,x):=(t[0],t[1]); + Write(' : '); x.Println; + Write('.: '); + x.Foreach(z->WriteFormat('{0:0.0e0} ',Abs(z)-Sqrt(2))); + Writeln; + Writeln(' : ', y, ', .: ',Abs(y-fet)); + Writeln + end +end. diff --git a/NumLibABC/FMinN_5.pas b/NumLibABC/FMinN_5.pas new file mode 100644 index 0000000..eddd2b8 --- /dev/null +++ b/NumLibABC/FMinN_5.pas @@ -0,0 +1,13 @@ +uses NumLibABC; + +// ARS +begin + var f:function(x:array of real):real:= + x->4*Sqr(x[0]-5)+Sqr(x[1]-6); + var x:=Arr(-8.0,9.0); + var (t,R):=(1.0,1e-6); + var oL:=new FMinN(x,f); + oL.ARS(R,t); + Write(': '); oL.x.Println; + Writeln(' : ',f(oL.x)) +end. diff --git a/NumLibABC/FMinN_6.pas b/NumLibABC/FMinN_6.pas new file mode 100644 index 0000000..dccdb8d --- /dev/null +++ b/NumLibABC/FMinN_6.pas @@ -0,0 +1,27 @@ +uses NumLibABC; + +// ( ) + +function f(x:array of real):real; +begin + var x1:=x[0]; + var x2:=x[1]; + var s:=0.0; // + if x1+x2>8 then s:=real.MaxValue + else if -2*x1+3*x2>9 then s:=real.MaxValue + else if 2*x1-x2>10 then s:=real.MaxValue + else if x1<0 then s:=real.MaxValue + else if x2<0 then s:=real.MaxValue; + Result:=-4*x1-3*x2+1+s +end; + +begin + var a:=Arr(0.0,0.0); + var b:=Arr(8.0,8.0); + var y:real; + var oL:=new FMinN(a,f); + oL.MKSearch(a,b,y); + oL.x.Transform(t->real(Round(t))); + Write(' : '); oL.x.Println; + Writeln(' : ',f(oL.x)) +end. diff --git a/NumLibABC/FMin_1.pas b/NumLibABC/FMin_1.pas new file mode 100644 index 0000000..c0ede58 --- /dev/null +++ b/NumLibABC/FMin_1.pas @@ -0,0 +1,9 @@ +uses NumLibABC; + +// + +begin + var fun:real->real:=x->x*Sqr(x)-2*x-5; + var oL:=new Fmin(fun,-1,1); + Println(oL.x, oL.Value) +end. diff --git a/NumLibABC/Factors1.pas b/NumLibABC/Factors1.pas new file mode 100644 index 0000000..697873c --- /dev/null +++ b/NumLibABC/Factors1.pas @@ -0,0 +1,10 @@ +uses NumLibABC; + +// +// +begin + var oL:=new Factors(-20, 7, 73, -42); + var r:=oL.Factorize; + Writeln('k:=',r[0,1]); + for var i:=1 to r[0,0] do r.Row(i).Println; +end. diff --git a/NumLibABC/Fraction1.pas b/NumLibABC/Fraction1.pas new file mode 100644 index 0000000..25db375 --- /dev/null +++ b/NumLibABC/Fraction1.pas @@ -0,0 +1,8 @@ +uses NumLibABC; + +// +begin + var r:=((Frc(5,5,9)-Frc(7,18))/35+(Frc(40,63)-Frc(8,21))/20+ + (Frc(83,90)-Frc(41,50))/2)*50; + r.Print +end. diff --git a/NumLibABC/Matrix1.pas b/NumLibABC/Matrix1.pas new file mode 100644 index 0000000..f91f8bf --- /dev/null +++ b/NumLibABC/Matrix1.pas @@ -0,0 +1,11 @@ +uses NumLibABC; + +// () +begin + // M = det ((A-BxC)^T)xA + var A:=new Matrix(2,4,-3,0,4,-1,2,-7,5,6); + var B:=new Matrix(2,3,8,1,-5,6,7,2); + var C:=new Matrix(3,4,1,-1,7,0,3,2,9,4,5,0,-2,-4); + var M:=(((A-B*C).Transpose)*A).Det; + Writeln(M) +end. diff --git a/NumLibABC/NumLibABCTest.pas b/NumLibABC/NumLibABCTest.pas new file mode 100644 index 0000000..fbd32ed --- /dev/null +++ b/NumLibABC/NumLibABCTest.pas @@ -0,0 +1,981 @@ +uses NumLibABC; + +procedure TestApproxCheb(s:string; a,b:array of real; eps:real); +// a - массив вычисленных значений +// b - массив ожидаемых значений +// eps - допустимая абсолютная погрешность решений +begin + for var i:=0 to a.Length-1 do begin + var Msg:=s+': найдено: '+a[i]+', ожидалось '+b[i]; + Assert(Abs(Abs(a[i])-Abs(b[i]))<=eps,Msg); + end +end; + +procedure TestDecomp(s:string; a:array[,] of real; b:array of real; + roots:array of real; eps:real); +// a - матрица системы; +// b - вектор правых частей; +// roots - вектор эталонных решений; +// eps - максимальная абсолютная погрешность решений +begin + var oD:=new Decomp(a); + var Msg:=s+': cond='+oD.cond+' обнаружена вырожденность матрицы'; + var Flag:=oD.cond+1=oD.cond; + Assert(not Flag,Msg); + if not Flag then begin + oD.Solve(b); + var sum:=b.Zip(roots,(p,q)->Abs(Abs(p)-Abs(q))).Sum; + Msg:=s+': недопустимая погрешность '+sum+' > '+eps+NewLine+ + 'Получено : '+b.JoinIntoString(' ')+NewLine+ + 'Ожидалось: '+roots.JoinIntoString(' '); + Assert(sum<=eps,Msg); + end +end; + +procedure TestFactors(s:string; a:array of integer; roots:array of integer); +// a - коэффициенты полинома; +// aroots - вектор эталонных решений; +begin + var oL:=new Factors(a); + var r:=oL.Factorize; + var r1:=r.Rows.SelectMany(x->x); + var Msg:=s+': ошибка.'+Newline+r1.JoinIntoString+': получено'+NewLine+ + roots.JoinIntoString+': ожидалось'; + if r1.Count=roots.Count then begin + var s1:=r1.Zip(roots,(i,j)->i-j).Sum; + Assert(s1=0,Msg) + end + else + Assert(false,Msg) +end; + +{$region FMinTest} +procedure TestFMin(s:string; f:real->real; a,b,etx,ety,epsx,epsy:real); +// etx - ожидаемое значение аргумента +// etx - ожидаемое значение функции +// epsx - допустимая абсолютная погрешность по аргументу +// epsy - допустимая абсолютная погрешность по функции +begin + var oL:=new FMin(f,a,b); + var (x,y):=(oL.x,oL.Value); + var Msg:=s+': найден аргумент: '+x+', ожидался '+etx; + Assert(Abs(x-etx)<=epsx,Msg); + Msg:=s+': значение функции: '+y+', ожидалось '+ety; + Assert(Abs(y-ety)<=epsy,Msg); +end; + +procedure TestFMinN1(s:string; f:function(x:array of real):real; + xb:array of real; etx:array of real; ety,epsx,epsy:real); +// xb - массив аргументов +// etx - массив ожидаемых значений аргументов +// etx - ожидаемое значение функции +// epsx - допустимая абсолютная погрешность по аргументу +// epsy - допустимая абсолютная погрешность по функции +begin + var oL:=new FMinN(xb,f); + var x:=oL.HJ; + var y:=f(x); + var Msg:=s+':'+NewLine+'найдены аргументы : '+ + x.Select(t->Format('{0}',t)).JoinIntoString+NewLine+ + 'ожидались аргументы: '+ + etx.Select(t->Format('{0}',t)).JoinIntoString; + for var i:=0 to x.Length-1 do + if Abs(x[i]-etx[i])>epsx then begin + Assert(false,Msg); + break + end; + Msg:=s+': значение функции: '+y+', ожидалось '+ety; + Assert(Abs(y-ety)<=epsy,Msg); +end; + +procedure TestFMinN2(s:string; f:function(x:array of real):real; + a,b:array of real; k,m:integer; etx:array of real; ety,epsx,epsy:real); +// a,b - массивы нижних и верхних границ аргументов +// k - количество случайных точек в BPHS +// m - количество вызовов MKSearch +// etx - массив ожидаемых значений аргументов +// etx - ожидаемое значение функции +// epsx - допустимая абсолютная погрешность по аргументу +// epsy - допустимая абсолютная погрешность по функции +begin + var oL:=new FMinN(etx,f); + var y:real; + oL.BPHS(a,b,y,k,m); + var Msg:=s+':'+NewLine+'найдены аргументы : '+ + oL.x.Select(t->Format('{0}',t)).JoinIntoString+NewLine+ + 'ожидались аргументы: '+ + etx.Select(t->Format('{0}',t)).JoinIntoString; + for var i:=0 to oL.x.Length-1 do + if Abs(oL.x[i]-etx[i])>epsx then begin + Assert(false,Msg); + break + end; + Msg:=s+': значение функции: '+y+', ожидалось '+ety; + Assert(Abs(y-ety)<=epsy,Msg); +end; + +procedure TestFMinN3(s:string; f:function(x:array of real):real; + a,b:array of real; k,m:integer; etx:array of real; ety,epsx,epsy:real); +// a,b - массивы нижних и верхних границ аргументов +// k - количество случайных точек в BPHS +// m - количество вызовов MKSearch +// etx - массив ожидаемых значений аргументов +// etx - ожидаемое значение функции +// epsx - допустимая абсолютная погрешность по аргументу +// epsy - допустимая абсолютная погрешность по функции +begin + var oL:=new FMinN(etx,f); + var y:real; + var r:=oL.BestP(a,b,epsx,10,k,m); + var x:array of real; + foreach var t in r do begin + (y,x):=(t[0],t[1]); + var Msg:=s+':'+NewLine+'найдены аргументы : '+ + x.Select(t->Format('{0}',t)).JoinIntoString+NewLine+ + 'ожидались аргументы: '+ + etx.Select(t->Format('{0}',t)).JoinIntoString; + for var i:=0 to x.Length-1 do + if Abs(x[i]-etx[i])>epsx then begin + Assert(false,Msg); + break + end; + Msg:=s+': значение функции: '+y+', ожидалось '+ety; + Assert(Abs(y-ety)<=epsy,Msg) + end +end; + +procedure TestFMin4(s:string; f:function(x:array of real):real; + x:array of real; R:real; var t:real; v:array of real; eps,epsf:real); +// f - функция +// x - вектор координат +// R - максимально допустимая неопределенность +// t - полученный радиус сферы неопределенности +// v - вектор эталонного решения +// eps - оценочная точность решения по координатам +// epsf - оценочная точность по функции +begin + var oL:=new FMinN(x,f); + oL.ARS(R,t); + var Msg:=s+': Требуемая точность не достигнута'; + Assert(t<=R,Msg); + Msg:=s+': не найдено решение, ожидалось ['+v.Skip(1).JoinIntoString(',')+ + '], получено ['+oL.x.JoinIntoString(',')+']'; + var p:=true; + for var i:=0 to oL.x.Length-1 do p:=p and (Abs(oL.x[i])-Abs(v[i+1])<=eps); + Assert(p,Msg); + Msg:=s+': найден радиус сферы '+t+', ожидаемый '+v[0]; + Assert(Abs(t-v[0])<=epsf,Msg) +end; +{$endregion} + +procedure TestFraction(s:string; res,ans:Fraction); +// результат сравнения res=ans +begin + Assert(res=ans,s+': получено '+res.ToString+', ожидалось '+ans.ToString) +end; + +{$region MatrixTest} +procedure TestMatrixS(s:string; a,r,eps:real); +// a - найденное значение; +// r - ожидаемое значение; +// eps - максимальная допустимая абсолютная погрешность +begin + var Msg:=s+': погрешность выше допустимой.'+Newline+'Получено значение '+ + a+', ожидалось значение '+r; + Assert(Abs(a-r)<=eps,Msg) +end; + +procedure TestMatrixV(s:string; a,r:Vector; eps:real); +// a - вектор найденных значений; +// r - вектор ожидаемых значений; +// eps - максимальная допустимая абсолютная погрешность +begin + for var i:=0 to a.Length-1 do + Assert(Abs(a.Value[i]-r.Value[i])<=eps, + s+': погрешность выше допустимой.'+Newline+'Получено значение '+ + a.Value[i]+', ожидалось значение '+r.Value[i]) +end; + +procedure TestMatrixM(s:string; a,r:Matrix; eps:real); +// a - вычисленная матрица; +// r - эталонная матрица; +// eps - максимальная допустимая абсолютная погрешность +begin + for var i:=0 to a.RowCount-1 do + for var j:=0 to a.ColCount-1 do + Assert(Abs(a.Value[i,j]-r.Value[i,j])<=eps, + s+': погрешность выше допустимой.'+Newline+'Получено значение a['+ + i+','+j+']='+a.Value[i,j]+', ожидалось значение '+r.Value[i,j]) +end; +{$endregion} + +procedure TestPolRt(s:string; a:Polynom; roots:array of complex; eps:real); +// roots -массив ожидаемых значений корней +// eps - максимальная абсолютная погрешность решений +begin + var oP:=new PolRt(a); + if oP.ier>0 then begin + var Msg:=s+': тест не прошел, ошибка с кодом '+oP.ier; + Assert(false,Msg) + end + else begin + var r:=oP.Value; + for var i:=0 to r.Length-1 do begin + var Msg:=s+': найдено: ('+r[i].Real+','+r[i].Imaginary+'), ожидалось ('+ + roots[i].Real+','+roots[i].Imaginary+')'; + Assert(Complex.Abs(r[i]-roots[i])<=eps,Msg); + end + end +end; + +procedure TestPolynomD(s:string; res,lim:real; n1,n2:integer); +// res - вычисленное значение +// lim - предельно допустимая величина res +// проверяется также условие n2n2,s+': экономизации не произошло'); + Assert(res<=lim,s+': отклонение '+res+' превышает '+lim); +end; + +procedure TestPolynomV(s:string; p:Polynom; x,r,eps:real); +// х - аргумент, для которого вычисляется полином +// r - ожидаемое значение +// eps - максимальная абсолютная погрешность решения +begin + var a:=p.Value(x); + var Msg:=s+': найдено: '+a+', ожидалось '+r; + Assert(Abs(a-r)<=eps,Msg) +end; + +procedure TestQuanc8(s:string; a,b:real; F:real->real; ae,re,r2,eps:real); +// cres - аналитически найденное значение интеграла +// eps - допустимая абсолютная погрешность решения +begin + var Msg:string; + var oQ:=new Quanc8(f,a,b,ae,re); + var r1:=oQ.Value; + if r1[2]=0 then begin + Msg:=s+': вычислено '+r1[0]+', ожидалось '+r2; + Assert(Abs(r1[0]-r2)<=eps,Msg) + end + else begin + Msg:=s+': вычислено '+r1[0]+', ожидалось '+r2+', errest='+r1[1]+', flag='+r1[2]; + Assert(Abs(r1[0]-r2)<=eps,Msg) + end +end; + +procedure TestRKF45(s:string; res,ans,eps:real); +begin + Assert(Abs(res-ans)<=eps,s+': контрольная сумма '+res+', ожидалась '+ans) +end; + +procedure TestRootsIsolation(s:string; f:real->real; a,b,h:real; + t:array of real); +// f - функция +// a,b - границы интервала поиска +// h - шаг поиска +// t - эталонный массив нулей функции +begin + var oRI:=new RootsIsolation(f,a,b,h); + var r:=oRI.Value; + for var i:=0 to t.Length-1 do begin + var Msg:=s+': точка нуля '+t[i]+' не в интервале ['+r[i][0]+';'+r[i][1]+']'; + Assert(t[i].Between(r[i][0],r[i][1]),Msg) + end; +end; + +procedure TestSpline(st:string; x:real; F:real->real; eps:real; S:Spline); +// eps - относительная погрешность в процентах +begin + var r1:=F(x); + var r2:=S.Value(x); + var Msg:=st+': F('+x+')='+r1+', получено '+r2; + Assert(Abs((r1-r2)/r1)<=eps/100,Msg); +end; + +procedure TestSvenn(s:string; f:real->real; x0,t,a,b:real); +// f - функция +// x0 - начальная точка поиска +// t - шаг поиска +// a,b - ожидаемый интервал (результат должен ему принадлежать) +begin + var oS:=new Svenn(f,x0,t); + var r:=oS.Value; + var Msg:=s+': не найдено решение, ожидалось ['+a+';'+b+']'; + Assert(r[2]=0,Msg); + Msg:=s+': интервал ['+a+';'+b+'] не входит в ['+r[0]+';'+r[1]+']'; + Assert(a.Between(r[0],r[1]) and b.Between(r[0],r[1]),Msg) +end; + +{$region VectorTest} +procedure TestVector1(s:string; a,r,eps:real); +// a - найденное значение; +// r - ожидаемое значение; +// eps - максимальная допустимая абсолютная погрешность +begin + var Msg:=s+': погрешность выше допустимой.'+Newline+'Получено значение '+ + a+', ожидалось значение '+r; + Assert(Abs(a-r)<=eps,Msg) +end; + +procedure TestVectorN(s:string; a,r:Vector; eps:real); +// a - вектор найденных значений; +// r - вектор ожидаемых значений; +// eps - максимальная допустимая абсолютная погрешность +begin + for var i:=0 to a.Length-1 do + Assert(Abs(a.Value[i]-r.Value[i])<=eps, + s+': погрешность выше допустимой.'+Newline+'Получено значение '+ + a.Value[i]+', ожидалось значение '+r.Value[i]) +end; +{$endregion} + +procedure TestZeroin(s:string; a,b:real; F:real->real; root,eps:real); +// root - точное значение корня +// eps - абсолютная погрешность значения корня +begin + var oZ:=new Zeroin(F,eps); + var x:=oZ.Value(a,b); + var Msg:=s+': корень: '+x+', ожидалось '+root; + Assert(Abs(x-root)<=eps,Msg); +end; + +begin + var nt:=1; + Writeln('*** ',&NumLibABCVersion,' ***'); + Writeln(' *** Тестирование начато ***'); + + {$region ApproxCheb} + begin + var e:=0.1; + var x:=ArrGen(12,i->0.25*i-2); + var y:=x.Select(z->2*z-5*Sqr(z)+8*z*Sqr(z)).ToArray; + var oC:=new ApproxCheb(x,y,e); + oC.MakeCoef; + TestApproxCheb('AppoxCheb 1',oC.c,Arr(0.0,2.0,-5.0,8.0),1e-12); + + e:=0.1; + x:=ArrGen(10,i->i-3.0); + y:=x.Select(z->4+z*(-2.5+z*(1.752+z*(-9+z*0.28)))).ToArray; + oC:=new ApproxCheb(x,y,e); + oC.MakeCoef; + TestApproxCheb('AppoxCheb 2',oC.c,Arr(4.0,-2.5,1.752,-9.0,0.28),1e-12); + + e:=0.5; + x:=ArrGen(7,i->0.2*i-0.3); + y:=x.Select(z->3*sin(z)+5.6*Ln(Abs(z))).ToArray; + oC:=new ApproxCheb(x,y,e); + TestApproxCheb('AppoxCheb 3',oC.f,y,0.8); + + Writeln(nt:2,'. Проверка класса ApproxCheb завершена'); + nt+=1; + end; + {$endregion} + + {$region Decomp} + begin + // из первоисточника + var a:=new real[3,3] ( + (10.0,-7.0,0.0), + (-3.0,2.0,6.0), + (5.0,-1.0,5.0)); + var b:=Arr(7.0,4.0,6.0); + var r:=Arr(0.0,-1.0,1.0); + TestDecomp('Decomp/Solve 1',a,b,r,1e-15); + + // Фаддеев Д.К, Фаддеева В.Н. "Вычислительные методы линейной алгебры" + // Точное регение получено при помощи пакета Maple15 + a:=new real[4,4] ( + (1.0,0.17,-0.25,0.54), + (0.47,1.0,0.67,-0.32), + (-0.11,0.35,1.0,-0.74), + (0.55,0.43,0.36,1.0)); + b:=Arr(0.3,0.5,0.7,0.9); + r:=Arr(7039205/15965951,-5796135/15965951,18629045/15965951,6283675/15965951); + TestDecomp('Decomp/Solve 2',a,b,r,1e-15); + + // Свидетельство к алгоритму 135б. В кн. Агеев М.И. и др. + // "Библиотека алгоритмов 101б-150б" + var aa:=new real[3,3] ( + (4.0,2.0,2.0), + (2.0,2.0,2.0), + (2.0,2.0,3.0)); + a:=Copy(aa); //для теста + //a:=MatrGen(3,3,(i,j)->aa[3*i+j]); + b:=Arr(2.0,3.0,4.0); + r:=Arr(-0.5,1.0,1.0); + TestDecomp('Decomp/Solve 3-1',a,b,r,1e-15); + a:=Copy(aa); + b:=Arr(-1.0,1.0,2.0); + r:=Arr(-1.0,0.5,1.0); + TestDecomp('Decomp/Solve 3-2',a,b,r,1e-15); + a:=Copy(aa); + b:=Arr(3.0,2.0,3.0); + r:=Arr(0.5,-0.5,1.0); + TestDecomp('Decomp/Solve 3-3',a,b,r,1e-15); + + Writeln(nt:2,'. Проверка класса Decomp/Solve завершена'); + nt+=1 + end; + {$endregion} + + {$region Factors} + begin + var a:=Arr(-20,7,73,-42); + TestFactors('Factors 1',a,Arr(3,-1,2,-1,3,5,7,4)); + + a:=Arr(45,-12,-52,-1,6); + TestFactors('Factors 2',a,Arr(2,1,1,3,2,-5)); + + a:=Arr(6,-13,9,-2); + TestFactors('Factors 3',a,Arr(3,-1,1,1,2,3,1,2)); + + a:=Arr(40,10,2); + TestFactors('Factors 4',a,Arr(0,1)); + + a:=Arr(-40,78,-29,3); + TestFactors('Factors 5',a,Arr(3,1,1,4,1,5,3,2)); + + Writeln(nt:2,'. Проверка класса Factors завершена'); + nt+=1 + end; + {$endregion} + + {$region FMin} + begin + var f:real->real:=x->x*(x*x-2)-5; + TestFMin('FMin 1',f,0,1,Sqrt(2/3),-(Sqrt(32/27)+5),1e-8,1e-18); + + TestFMin('FMin 2',f,-4,4,Sqrt(2/3),-(Sqrt(32/27)+5),1e-7,1e-18); + + f:=x->x*Sqr(x-1)*(x-3)*Sqr(x-3); + var etx:=(13-Sqrt(97))/12; + var ety:=-(232229+4171*Sqrt(97))/93312; + TestFMin('FMin 3',f,-5,1.5,etx,ety,1e-7,1e-17); + + etx:=(13+Sqrt(97))/12; + ety:=(-232229+4171*Sqrt(97))/93312; + TestFMin('FMin 4',f,0.5,3.1,etx,ety,1e-7,1e-15); + + f:=x->x=0?1e15:(x+2)*Exp(1/x); + TestFMin('FMin 5',f,-1.5,4,2.0,4*Exp(0.5),1e-7,1e-17); + + Writeln(nt:2,'. Проверка класса FMin завершена'); + nt+=1 + end; + {$endregion} + + {$region FMinN} + begin + var Rosenbrock:function(x:array of real):real:= + x->100*Sqr(x[1]-Sqr(x[0]))+Sqr(1-x[0]); + var xb:=Arr(-1.2,1.0); + var xet:=Arr(1.0,1.0); + TestFminN1('FMinN 1: HJ, функция Розенброка', + Rosenbrock,xb,xet,0,1e-5,1e-8); + + var Woods:function(x:array of real):real:=x-> + begin + var s1:=x[1]-Sqr(x[0]); + var s2:=1-x[0]; + var s3:=x[1]-1; + var t1:=x[3]-Sqr(x[2]); + var t2:=1-x[2]; + var t3:=x[3]-1; + var t4:=s3+t3; + var t5:=s3-t3; + Result:=100*Sqr(s1)+Sqr(s2)+90*Sqr(t1)+Sqr(t2)+10*Sqr(t4)+0.1*Sqr(t5) + end; + xb:=Arr(-3.0,-1.0,-3.0,-1.0); + xet:=Arr(1.0,1.0,1.0,1.0); + TestFminN1('FMinN 2: HJ, функция с 4 аргументами', + Woods,xb,xet,0,1e-4,1e-8); + + var f1:function(x:array of real):real:= + x->x[0]*(Sqr(x[0])-2)-5; + xb:=Arr(0.0); + xet:=Arr(Sqrt(2/3)); + TestFminN1('FMinN 3: HJ, функция x^3-2x-5', + f1,xb,xet,-Sqrt(32/27)-5,1e-4,1e-8); + + var FSimplex:function(x:array of real):real:=x-> + begin + var x1:=x[0]; + var x2:=x[1]; + var s:=0.0; + if x1+x2>8 then s:=real.MaxValue + else if -2*x1+3*x2>9 then s:=real.MaxValue + else if 2*x1-x2>10 then s:=real.MaxValue + else if x1<0 then s:=real.MaxValue + else if x2<0 then s:=real.MaxValue; + Result:=-4*x1-3*x2+1+s + end; + xb:=Arr(0.0,0.0); + xet:=Arr(6.0,2.0); + var oL:=new FMinN(xb,FSimplex); + var a:=Arr(0.0,0.0); + var b:=Arr(8.0,8.0); + var y:real; + oL.MKSearch(a,b,y); + xb:=oL.x.Select(t->real(Round(t))).ToArray; + TestFminN1('FMinN 4: MKSearch+HJ, целочисленная функция со штрафом', + FSimplex,xb,xet,-29,1e-4,1e-8); + + a:=Arr(-1.0,-1.0); + b:=Arr(2.0,2.0); + xb:=new real[a.Length]; + xet:=Arr(1.0,1.0); + TestFminN2('FMinN 5: BPHS, функция Розенброка', + Rosenbrock,a,b,100,1000,xet,0,1e-3,1e-5); + + a:=Arr(-1.0,-1.0,-1.0,-1.0); + b:=Arr(2.0,2.0,2.0,2.0); + xet:=Arr(1.0,1.0,1.0,1.0); + TestFminN2('FMinN 6: BPHS, функция с 4 аргументами', + Woods,a,b,100,5000,xet,0,1e-1,1e-2); + + a:=Arr(0.0,0.0); + b:=Arr(8.0,8.0); + xet:=Arr(6.0,2.0); + TestFminN2('FMinN 7: BestP, целочисленная функция со штрафом', + FSimplex,a,b,100,1000,xet,-29,1e-2,1e-6); + + f1:=x->4*Sqr(x[0]-5)+Sqr(x[1]-6); + xb:=Arr(-8.0,9.0); + var (t,R):=(1.0,1e-6); + var v:=Arr(f1(Arr(5.0,6.0)),5.0,6.0); + TestFMin4('FMinN 8: ARS',f1,xb,R,t,v,2*R,10*R); + + f1:=x->2*Sqr(x[0])+x[0]*x[1]+Sqr(x[1]); + xb:=Arr(-10.0,10.0); + (t,R):=(1.0,1e-10); + v:=Arr(f1(Arr(0.0,0.0)),0.0,0.0); + TestFMin4('FMinN 9: ARS',f1,xb,R,t,v,2*R,10*R); + + Writeln(nt:2,'. Проверка класса FMinN завершена'); + nt+=1 + end; + {$endregion} + + {$region Fraction} + begin + var r:=((Frc(5,5,9)-Frc(7,18))/35+(Frc(40,63)-Frc(8,21))/20+ + (Frc(83,90)-Frc(41,50))/2)*50; + TestFraction('Fraction 1',r,Frc(74,7)); + + r:=Frc(34,197)+Frc(6,9,91)-Frc(351,95113)*Frc(1,7); + TestFraction('Fraction 2',r,Frc(10692560566,1705090751)); + + var m:=Range(1,30,2).Aggregate(BigInteger(1),(i,j)->i*j); + var n:=Range(2,30,2).Aggregate(BigInteger(1),(i,j)->i*j)+1; + var a:=Frc(m,n); + var b:=Frc(6190283353629375,42849873690624001); + TestFraction('Fraction 3',a,b); + + Writeln(nt:2,'. Проверка класса Fraction завершена'); + nt+=1 + end; + {$endregion} + + {$region Matrix} + begin + var a:=new Matrix(3,4,-2,4,0,3,6,11,-5,7,0,8,-4,1); + a.SetRow(new Vector(a.Row(2).Value.Select(x->x-2).ToArray),2); + a.MultCol(1,3); + var vb:=new Vector(1,-1,0,2); + a.InsertRowBefore(vb,3); + a.SwapRows(2,3); + a.SwapCols(1,3); + a:=a.Transpose; + var Atr:=a.Inv; + var d:=254.0; + var x:=new Matrix(4,4,173/d,83/d,27/d,28/d,-426/d,-222/d,-112/d,72/d, + 122/d,60/d,44/d,8/d,-277/d,-105/d,-77/d,-14/d); + TestMatrixM('Matrix 1',Atr,x,1e-14); + + a:=new Matrix(2,4,-3,0,4,-1,2,-7,5,6); + var b:=new Matrix(2,3,8,1,-5,6,7,2); + var c:=new Matrix(3,4,1,-1,7,0,3,2,9,4,5,0,-2,-4); + var r:=(((a-b*c).Transpose)*a).Det; + TestMatrixS('Matrix 2',r,0.0,1e-15); + + a:=new Matrix(3,3,2,3,-1,1,-2,1,1,0,2); + vb:=new Vector(9,3,2); + var vr:=a.Inv*vb; + TestMatrixV('Matrix 3',vr,new Vector(4,0,-1),1e-15); + + vr:=new Vector(vb.Length); + var det:=a.Det; + for var i:=0 to vb.Length-1 do begin + var t:=a.Copy; + t.SetCol(vb,i,0); + var detx:=t.Det; + vr.Value[i]:=detx/det; + end; + TestMatrixV('Matrix 4',vr,new Vector(4,0,-1),1e-15); + + var cond:real; + vr:=A.SLAU(vb,cond); + TestMatrixV('Matrix 5.1',vr,new Vector(4,0,-1),1e-15); + TestMatrixS('Matrix 5.2',cond,1.97935318837932,1e-14); + + Writeln(nt:2,'. Проверка класса Matrix завершена'); + nt+=1 + end; {$endregion} + + {$region Polrt} + begin + var p:=new Polynom(-120,34,-4,-1,1); + var cr:=Arr(cplx(3,0),cplx(-4,0),cplx(1,-3),cplx(1,3)); + TestPolrt('Polrt 1',p,cr,1e-15); + + p:=new Polynom(6,-5,-2,1); + cr:=Arr(cplx(1,0),cplx(-2,0),cplx(3,0)); + TestPolrt('Polrt 2',p,cr,1e-15); + + p:=new Polynom(-120,274,-225,85,-15,1); + cr:=Arr(cplx(1,0),cplx(2,0),cplx(3,0),cplx(4,0),cplx(5,0)); + TestPolrt('Polrt 3',p,cr,1e-12); + + p:=new Polynom(8,-6,6,1,2,-2,1); + cr:=ArrFill(6,cplx(-1,-1)); + cr[0]:=cplx(0.5,-Sqrt(3)/2); cr[1]:=Conjugate(cr[0]); + cr[2]:=cplx(1.5,-Sqrt(7)/2); cr[3]:=Conjugate(cr[2]); + cr[5]:=Conjugate(cr[4]); + TestPolrt('Polrt 4',p,cr,1e-15); + + p:=new Polynom(-36,0,49,0,-14,0,1); + cr:=Arr(cplx(-2,0),cplx(2,0),cplx(-3,0),cplx(3,0),cplx(-1,0),cplx(1,0)); + TestPolrt('Polrt 5',p,cr,1e-15); + + p:=new Polynom(-16,0,0,0,1); + cr:=Arr(cplx(0,2),cplx(0,-2),cplx(-2,0),cplx(2,0)); + TestPolrt('Polrt 6',p,cr,1e-15); + + p:=new Polynom(-250,125,45,-32,4); + cr:=Arr(cplx(2.5,0),cplx(5,0),cplx(-2,0),cplx(2.5,0)); + TestPolrt('Polrt 7',p,cr,1e-8); + + p:=new Polynom(-1,0,0,0,0,1); + cr:=ArrFill(5,cplx(1,0)); // y=x^5-1 + cr[1]:=cplx(-(Sqrt(5)+1)/4,-Sqrt(10-2*Sqrt(5))/4); cr[2]:=Conjugate(cr[1]); + cr[3]:=cplx((Sqrt(5)-1)/4,-Sqrt(10+2*Sqrt(5))/4); cr[4]:=Conjugate(cr[3]); + TestPolrt('Polrt 8',p,cr,1e-15); + + Writeln(nt:2,'. Проверка класса PolRt завершена'); + nt+=1; + end; + {$endregion} + + {$region Polynom} + begin + var p:=new Polynom(2,6,8,3,1); // запись 13862(10) + TestPolynomV('Polynom 1',p,10,13862,1e-15); + + p:=new Polynom(0,3,8,6,4,2,5); // запись 0.386425 + TestPolynomV('Polynom 2',p,0.1,0.386425,1e-15); + + p:=new Polynom(1,0,1,1,0,1,1,0,1); // 365(10)=101101101(2) + TestPolynomV('Polynom 3',p,2,365,1e-15); + + p:=new Polynom(1,1,1/2,1/6,1/24,1/120,1/720,1/5040,1/40320); // exp(x) + TestPolynomV('Polynom 4',p,0.36,exp(0.36),1e-9); + + // пример -1435+(25*12+917) = -218 + var a:=new Polynom(5,3,4,1); + var b:=new Polynom(5,2); + var c:=new Polynom(2,1); + var d:=new Polynom(7,1,9); + TestPolynomV('Polynom 5',-a+(b*c+d),10,-218,1e-15); + + p:=new Polynom(6,-2,0,-5,0,2,3); + a:=new Polynom(-1,3,-2,4); + (b,c):=p/a; + var x:=pi; + var x1:=b.Value(x)+c.Value(x)/a.Value(x); + var x2:=p.Value(x)/a.Value(x); + var Msg:='Polynom 6: найдено: '+x1+', ожидалось '+x2; + Assert(Abs(x1-x2)<=1e-15,Msg); + + var k:=ArrFill(20,0.0); + var i:=3; + k[1]:=2; + var pr:=1.0; + while i<=19 do begin + pr:=-pr*i*(i-1); + k[i]:=1/pr; + i:=i+2 + end; + p:=new Polynom(k); + var p2:=p.EconomSym(1,1e-10); + var dm:=-1.0;; + for var j:=0 to 20 do begin + x:=-1.0+j/10; + var y:=p.Value(x); + var z:=p2.Value(x); + var d1:=Abs(y-z); + if dmreal:=x->x=0?1.0:Sin(x)/x; // интегральный синус + var s:real; + begin + s:=2.0; + var (p2,f1,sgn,i):=(2.0,1.0,1,1); + var tt:real; + repeat + p2*=4; f1*=2*i*(2*i+1); sgn:=-sgn; + tt:=sgn*p2/f1/(2*i+1); + s+=tt; + i+=1; + until Abs(tt)4/(1+x*x); + TestQuanc8('Quanc8 2',0,1,f,abserr,relerr,pi,1e-13); + + s:=6+20*Sqrt(10); + TestQuanc8('Quanc8 3',-9,1000,x->1/Sqrt(Abs(x)),abserr,relerr,s,1e-3); + + f:=x->x/Sqrt(Sqr(Sqr(x))+16); + s:=ln(2)/2; + TestQuanc8('Quanc8 4',0,Sqrt(3),f,abserr,relerr,s,1e-12); + + f:=x->ArcCos(2*x); + s:=pi/2; + TestQuanc8('Quanc8 5',-0.5,0.5,f,abserr,relerr,s,1e-15); + + Writeln(nt:2,'. Проверка класса Quanc8 завершена'); + nt+=1 + end; + {$endregion} + + {$region RKF45} + begin + // лямбда-процедура чтобы не выходить за пределы блока + var p1:procedure(t:real; y,yp:array of real):=(t,y,yp)-> + begin + var alpha:=Sqr(ArcTan(1.0)); + var r:=y[0]*y[0]+y[1]*y[1]; r:=r*Sqrt(r)/alpha; + yp[0]:=y[2]; yp[1]:=y[3]; yp[2]:=-y[0]/r; yp[3]:=-y[1]/r + end; + // конец процедуры + var e:=0.25; + var y:=Arr(1.0-e,0.0,0.0,ArcTan(1)*Sqrt((1.0+e)/(1.0-e))); + var (abserr,relerr):=(0.0,0.3e-6); + var oL:=new RKF45(p1,y,abserr,relerr); + var (t,tb,th):=(0.0,12.0,0.5); + var t_out:=t; + var ss:=0.0; + repeat + oL.Solve(t,t_out); + ss+=t+oL.y[0]+y[1]; + case oL.flag of + -3,-2,-1,1,8: break; + 2:t_out:=t+th; + end + until t>=tb; + TestRKF45('RKF45 1',ss,140.749980780164,1e-12); + + p1:=(t,y,yp)->begin yp[0]:=y[0]/4*(1-y[0]/20) end; + // + (abserr,relerr):=(0.0,1e-6); + (t,tb,th):=(0.0,20.0,5.0); + y:=Arr(1.0); + t_out:=t; + oL:=new RKF45(p1,y,abserr,relerr); + ss:=0.0; + repeat + OL.Solve(t,t_out); + ss+=t+oL.y[0]+20/(1+19*Exp(-0.25*t)); + case oL.flag of + -3,-2,-1,1,8: break; + 2:t_out:=t+th + end + until t>=tb; + TestRKF45('RKF45 2',ss,136.941910731927,1e-12); + + (abserr,relerr):=(0.0,1e-6); + (t,tb,t_out):=(0.0,0.0,0.0); + var (te,ns):=(20.0,4); + y:=Arr(1.0); + oL:=new RKF45(p1,y,abserr,relerr); + oL.flag:=-1; + p1(t,y,oL.yp); + for var i:=1 to ns do begin + t:=((ns-i+1)*tb+(i-1)*te)/ns; + t_out:=((ns-i)*tb+i*te)/ns; + while oL.flag<0 do begin + oL.Solve(t,t_out); + ss+=t+oL.y[0]+20/(1+19*Exp(-0.25*t)); + case oL.flag of + -3,-1,1,8: break; + end + end; + oL.flag:=-2 + end; + TestRKF45('RKF45 3',ss,603.231676788451,1e-12); + + Writeln(nt:2,'. Проверка класса RKF45 завершена'); + nt+=1 + end; + {$endregion} + + {$region RootsIsolation} + begin + var f:real->real:=x->(x+4.5)*(x+3)*(x-2)*(x-3.8); + var (a,b,h):=(-10.0,8.0,0.5); + TestRootsIsolation('RootsIsolation 1',f,a,b,h,Arr(-4.5,-3.0,2.0,3.8)); + + f:=t->sin(t)/(1+Sqr(Exp(t)))-0.1; + (a,b,h):=(-10,5,0.3); + var r:=Arr(-9.52495,-6.18307,-3.24191,0.27789,1.00272); // найдено заранее + TestRootsIsolation('RootsIsolation 2',f,a,b,h,r); + + Writeln(nt:2,'. Проверка класса RootsIsolation завершена'); + nt+=1 + end; + {$endregion} + + {$region Spline} + begin + var f:real->real:=x->x*x*x; + var pp:=PartitionPoints(1.0,10.0,9).Select(x->new Point(x,f(x))).ToArray; + var Sp:=new Spline(pp); // создаем сплайн с заданными узлами интерполяции. + TestSpline('Spline1-1',1,f,1e-15,Sp); // левая точка + TestSpline('Spline1-2',1.25,f,1e-15,Sp); // внутри + TestSpline('Spline1-3',2.5,f,1e-15,Sp); // внутри + TestSpline('Spline1-4',7.2,f,1e-15,Sp); // внутри + TestSpline('Spline1-5',10,f,1e-5,Sp); // правая точка + + f:=x->Power(x,4); + pp:=PartitionPoints(1.0,10.0,9).Select(x->new Point(x,f(x))).ToArray; + Sp:=new Spline(pp); + TestSpline('Spline2-1',1.28,f,32,Sp); // 32% у края... надо исходный шаг мельче + TestSpline('Spline2-2',2.5,f,0.8,Sp); // 0.8% + TestSpline('Spline2-3',5.1,f,0.005,Sp); // 0.005% + TestSpline('Spline2-4',9.7,f,0.01,Sp); // 0.01% + + pp:=PartitionPoints(1.0,10.0,36).Select(x->new Point(x,f(x))).ToArray; + Sp:=new Spline(pp); + TestSpline('Spline3-1',1.28,f,0.03,Sp); // 0.03% + TestSpline('Spline3-2',1.1,f,0.24,Sp); // 0.24% + TestSpline('Spline3-3',1.03,f,0.18,Sp); // 0.18% + + f:=x->(3*x-8)/(8*x-4.1); + pp:=PartitionPoints(1.0,10.0,18).Select(x->new Point(x,f(x))).ToArray; + Sp:=new Spline(pp); + TestSpline('Spline4-1',1.1,f,4.8,Sp); // 4.8% + TestSpline('Spline4-2',2.6,f,5.8,Sp); // 5.8% + TestSpline('Spline4-3',5.9,f,0.001,Sp); // <0.001% + TestSpline('Spline4-4',9.9,f,0.001,Sp); // <0.001% + + Writeln(nt:2,'. Проверка класса Spline завершена'); + nt+=1 + end; + {$endregion} + + {$region Svenn} + begin + var f:real->real:=x->Sqr(x-5); + TestSvenn('Svenn 1',f,0,1,5-1e-10,5+1e-10); + + f:=x->Abs((x-4)*(x+7)); + TestSvenn('Svenn 2',f,0,2,4-1e-10,4+1e-10); + + TestSvenn('Svenn 3',f,-3,1,-7-1e-10,-7+1e-10); + + f:=x->x*(x*x-2)-5; + TestSvenn('Svenn 4',f,0,1,2.0945514814,2.0945514816); + + Writeln(nt:2,'. Проверка класса Svenn завершена'); + nt+=1 + end; + {$endregion} + + {$region Vector} + begin + var a:=new Vector(3,-4,1); + var b:=new Vector(-1,0,5); + var r:=(2*a-b).ModV; + TestVector1('Vector 1',r,Sqrt(122),1e-15); + + a:=new Vector(Arr(3.0,0.0,-4.0)); + var vr:=a.Ort; + TestVectorN('Vector 2',vr,new Vector(0.6,0,-0.8),1e-15); + + var pa:=Arr(2.0,-1.0,2.0); + var pb:=Arr(1.0,2.0,-1.0); + var pc:=Arr(3.0,2.0,1.0); + var BC:=new Vector(pb,pb); + var CA:=new Vector(pc,pa); + var CB:=new Vector(pc,pb); + vr:=(BC-2*CA).VP(CB); + TestVectorN('Vector 3',vr,new Vector(-12,8,12),1e-15); + + a:=new Vector(2,-1,1); + b:=new Vector(2,3,6); + r:=a*b/(a.ModV*b.ModV); + TestVector1('Vector 4',r,1/Sqrt(6),1e-15); + + pa:=Arr(7.0,3.0,4.0); + pb:=Arr(1.0,0.0,6.0); + pc:=Arr(4.0,5.0,-2.0); + a:=new Vector(pa,pb); + b:=new Vector(pA,pc); + r:=a.VP(b).ModV/2; + TestVector1('Vector 5',r,24.5,1e-15); + + Writeln(nt:2,'. Проверка класса Vector завершена'); + nt+=1 + end; + {$endregion} + + {$region Zeroin} + begin + var f:real->real:=x->x*(x*x-2)-5; // классика + // Точное решeние по формуле Кардано 2.094551481542326591482386540579... + var root:=(Power(5+Sqrt(643/27),1/3)+Power(5-Sqrt(643/27),1/3))/Power(2,1/3); + TestZeroin('Zeroin 1',2,3,f,root,1e-15); + + f:=x->Power((12-2*x)/(x-1),1/3)+Power((x-1)/(12-2*x),1/3)-2.5; + root:=2; + TestZeroin('Zeroin 2',1.01,3.5,f,root,1e-15); // разрыв при х=1 + + root:=97/17; + TestZeroin('Zeroin 3',3,5.99,f,root,1e-15); // разрыв при х=6 + + f:=x->3*Sin(x)+4*Cos(x)-5; + root:=2*ArcTan(1/3); + TestZeroin('Zeroin 4',-1,1,f,root,1e-8); + + Writeln(nt:2,'. Проверка класса Zeroin завершена'); + nt+=1 + end; + {$endregion} + + Writeln('*** Тестирование завершено ***'); + Writeln('*** Если в тесте класса FMinN были ошибки, повторите тест ***'); + +end. \ No newline at end of file diff --git a/NumLibABC/PolRT1.pas b/NumLibABC/PolRT1.pas new file mode 100644 index 0000000..c97da73 --- /dev/null +++ b/NumLibABC/PolRT1.pas @@ -0,0 +1,10 @@ +uses NumLibABC; + +// +// +begin + var p:=new Polynom(-609, -283 ,294, -38, -5,1); + var oL:=new PolRt(p); + if oL.ier=0 then oL.Value.Println + else Writeln(': ier=',oL.ier); +end. diff --git a/NumLibABC/Polynom1.pas b/NumLibABC/Polynom1.pas new file mode 100644 index 0000000..52a2aa2 --- /dev/null +++ b/NumLibABC/Polynom1.pas @@ -0,0 +1,11 @@ +uses NumLibABC; + +// +begin + var u:=(new Polynom(2, -6, 0, 3.8, 0, 1)).Value(-7.16); // + Println(u); + + var t:=new Polynom(1, -7, 12, -3, -2); + var (p,q):=(t.PInt, t.PDif); // + p.PrintlnBeauty; q.PrintlnBeauty; +end. diff --git a/NumLibABC/Polynom2.pas b/NumLibABC/Polynom2.pas new file mode 100644 index 0000000..6b8a408 --- /dev/null +++ b/NumLibABC/Polynom2.pas @@ -0,0 +1,16 @@ +uses NumLibABC; + +// +begin + var a:=new Polynom(6.5,-4,2.12,1); + var b:=new Polynom(3,0,-3.8); + var c:=new Polynom(ArrGen(5,i->i*i+1.0)); + (-c +(a-2*b)*a+11.5*(1-b)).Println; // - + + a:=new Polynom(3,0,-72,12,0,-1,2); + b:=new Polynom(-1,0,2,1); + var (p,q):=a/b; + Print(''); p.PrintlnBeauty; + Print(''); b.PrintlnBeauty + +end. diff --git a/NumLibABC/Quanc8_1.pas b/NumLibABC/Quanc8_1.pas new file mode 100644 index 0000000..d749547 --- /dev/null +++ b/NumLibABC/Quanc8_1.pas @@ -0,0 +1,9 @@ +uses NumLibABC; + +// + +begin + var f:real->real := x->x=0?1.0:sin(x)/x; + var oL := new Quanc8(f,0,2,1e-7,0); + Writeln(oL.Value); +end. diff --git a/NumLibABC/RootsIsolation1.pas b/NumLibABC/RootsIsolation1.pas new file mode 100644 index 0000000..5e22591 --- /dev/null +++ b/NumLibABC/RootsIsolation1.pas @@ -0,0 +1,10 @@ +uses NumLibABC; + +// y(x)=0 +// +begin + var f:real->real:=t->sin(t)/(1+Sqr(Exp(t)))-0.1; + var (a,b,h):=(-10,5,0.5); + var oL:=new RootsIsolation(f,a,b,h); + Println(oL.Value) +end. diff --git a/NumLibABC/SLAU1.pas b/NumLibABC/SLAU1.pas new file mode 100644 index 0000000..3395d2f --- /dev/null +++ b/NumLibABC/SLAU1.pas @@ -0,0 +1,11 @@ +uses NumLibABC; + +// () +begin + var A:=new Matrix(3,3,2,3,-1,1,-2,1,1,0,2); + var B:=new Vector(9,3,2); + var cond:real; + var x:=A.SLAU(B,cond); + x.Println; + Writeln(' = ',cond) +end. diff --git a/NumLibABC/Spline1.pas b/NumLibABC/Spline1.pas new file mode 100644 index 0000000..09d0b46 --- /dev/null +++ b/NumLibABC/Spline1.pas @@ -0,0 +1,12 @@ +uses NumLibABC; + +// +begin + var f:real->real:=x->(3*x-8)/(8*x-4.1); + var pt:=PartitionPoints(1.0,10.0,18).Select(x->new Point(x,f(x))).ToArray; + var oL:=new Spline(pt); + var r:=oL.Value(4.8); + Writeln(' =4.8: ',r); + var (d1,d2):=oL.Diff(4.8); + Writeln(' 1- 2- : ',d1,' ',d2) +end. diff --git a/NumLibABC/Vector1.pas b/NumLibABC/Vector1.pas new file mode 100644 index 0000000..b11ad62 --- /dev/null +++ b/NumLibABC/Vector1.pas @@ -0,0 +1,20 @@ +uses NumLibABC; + +// +begin + // + var a:=new Vector(3,-4,1); + var b:=new Vector(-1,0,5); + Writeln((2*a-b).ModV); + + // + var p:=Arr(3.0,0.0,-4.0); + a:=new Vector(p); + a.Ort.Println; + + // + a:=new Vector(2,-1,1); + b:=new Vector(2,3,6); + Writeln(a*b/(a.ModV*b.ModV)) + +end. diff --git a/NumLibABC/Zeroin1.pas b/NumLibABC/Zeroin1.pas new file mode 100644 index 0000000..5840c73 --- /dev/null +++ b/NumLibABC/Zeroin1.pas @@ -0,0 +1,9 @@ +uses NumLibABC; + +// +begin + var f:real->real := t->sin(t)/(1+Sqr(Exp(t)))-0.1; + var oL:=new Zeroin(f,1e-12); + Println(oL.Value(-10,-9.5), oL.Value(-6.5,-6), oL.Value(-3.5,-3), + oL.Value(0,0.5),oL.Value(1,1.5)) +end. diff --git a/OMPSamples/Hanoi.pas b/OMPSamples/Hanoi.pas new file mode 100644 index 0000000..9b02ba6 --- /dev/null +++ b/OMPSamples/Hanoi.pas @@ -0,0 +1,35 @@ +//Демонстрация использования параллельных секций на примере задачи о ханойских башнях +// Вывод решения закомментирован, так как он занимает большую часть времени + +//параллельная процедура +procedure MovePiramidParallel(n: integer; f, t, w: integer); +begin + if n = 0 then + exit; + {$omp parallel sections} + begin + MovePiramidParallel(n - 1, f, w, t); + //writelnFormat('Переложить диск с {0} на {1}', f, t); + MovePiramidParallel(n - 1, w, t, f); + end; +end; +//последовательная процедура +procedure MovePiramid(n: integer; f, t, w: integer); +begin + if n = 0 then + exit; + MovePiramid(n - 1, f, w, t); + //writelnFormat('Переложить диск с {0} на {1}', f, t); + MovePiramid(n - 1, w, t, f); + +end; + +begin + var m0 := Milliseconds; + MovePiramid(27, 1, 2, 3); + writeln('Последовательное выполнение: ', Milliseconds - m0, 'ms'); + + var m1 := Milliseconds; + MovePiramidParallel(27, 1, 2, 3); + writeln('Параллельное выполнение: ', Milliseconds - m1, 'ms'); +end. \ No newline at end of file diff --git a/OMPSamples/MultMatrix.pas b/OMPSamples/MultMatrix.pas new file mode 100644 index 0000000..13796ff --- /dev/null +++ b/OMPSamples/MultMatrix.pas @@ -0,0 +1,37 @@ +uses Arrays; + +procedure ParallelMult(a,b,c: array [,] of real; n: integer); +begin + {$omp parallel for } + for var i:=0 to n-1 do + for var j:=0 to n-1 do + begin + c[i,j]:=0; + for var l:=0 to n-1 do + c[i,j]:=c[i,j]+a[i,l]*b[l,j]; + end; +end; + +procedure Mult(a,b,c: array [,] of real; n: integer); +begin + for var i:=0 to n-1 do + for var j:=0 to n-1 do + begin + c[i,j]:=0; + for var l:=0 to n-1 do + c[i,j]:=c[i,j]+a[i,l]*b[l,j]; + end; +end; + +const n = 400; + +begin + var a := Arrays.CreateRandomRealMatrix(n,n); + var b := Arrays.CreateRandomRealMatrix(n,n); + var c := new real[n,n]; + ParallelMult(a,b,c,n); + writeln('Параллельное перемножение матриц: ',Milliseconds,' миллисекунд'); + var d := Milliseconds; + Mult(a,b,c,n); + writeln('Последовательное перемножение матриц: ',Milliseconds-d,' миллисекунд'); +end. \ No newline at end of file diff --git a/OMPSamples/Mutual Lock.pas b/OMPSamples/Mutual Lock.pas new file mode 100644 index 0000000..03e1848 --- /dev/null +++ b/OMPSamples/Mutual Lock.pas @@ -0,0 +1,33 @@ +// Демонстрация использования критических секций и возможных взаимоблокировок +begin + {$omp parallel sections} + begin + begin + WriteLn('Thread 1 started'); + {$omp critical a} + begin + Writeln('Lock a set by 1 thread'); + //ReadLn; + {$omp critical b} + begin + Writeln('Lock b set by 1 thread'); + end; + end; + WriteLn('Thread 1 finished'); + end; + begin + WriteLn('Thread 2 started'); + {$omp critical b} + begin + Writeln('Lock b set by 2 thread'); + //ReadLn; + {$omp critical a} + begin + Writeln('Lock a set by 2 thread'); + end; + end; + WriteLn('Thread 2 finished'); + end; + end; + Writeln('Program finished without mutual lock!'); +end. \ No newline at end of file diff --git a/OMPSamples/QuickSort.pas b/OMPSamples/QuickSort.pas new file mode 100644 index 0000000..ca6541c --- /dev/null +++ b/OMPSamples/QuickSort.pas @@ -0,0 +1,96 @@ +//Демонстрация использования параллельных секций на примере быстрой сортировки +var + a: array of integer; + +var + b: array of integer; + +// Partition - разделение A[l]..A[r] на части A[l]..A[q] <= A[q+1]..A[r] +function Partition(a: array of integer; l, r: integer): integer; +begin + var i := l - 1; + var j := r + 1; + var x := A[l]; + while True do + begin + repeat + i += 1; + until A[i] >= x; + repeat + j -= 1; + until A[j] <= x; + if i < j then + Swap(A[i], A[j]) + else + begin + Result := j; + exit; + end; + end; +end; + + // Параллельная cортировка частей +procedure Sort(A: array of integer; l, r: integer); +begin + if l >= r then + exit; + var j := Partition(A, l, r); + {$omp parallel sections} + begin + Sort(A, l, j); + Sort(A, j + 1, r); + end; +end; +// Параллельная сортировка +procedure QuickSortParrallel(A: array of integer); +begin + Sort(A, 0, a.Length - 1) +end; + +//Последовательная Сортировка частей +procedure SortSeq(a: array of integer; l, r: integer); +begin + if l >= r then + exit; + var j := Partition(A, l, r); + SortSeq(A, l, j); + SortSeq(A, j + 1, r); +end; +//Последовательная сортировка +procedure QuickSortSeq(A: array of integer); +begin + SortSeq(A, 0, a.Length - 1) +end; + //заполнение массивов равными значениями для обоих сортировок +procedure FillRandArr(A, B: array of integer); +begin + Randomize; + for var i := 0 to A.Length - 1 do + begin + a[i] := Random(1000); + b[i] := a[i]; + end; +end; + //Вывод массива +procedure printArr(A: array of integer); +begin + Randomize; + for var i := 0 to A.Length - 1 do + writeln(a[i]); +end; + +begin + + SetLength(a, 10000000); + SetLength(b, 10000000); + + FillRandArr(a, b); + var m1 := Milliseconds; + QuickSortSeq(B); + writeln('Последовательное выполнение: ', Milliseconds - m1, 'ms'); + + var m0 := Milliseconds; + QuickSortParrallel(a); + writeln('Параллельное выполнение: ', Milliseconds - m0, 'ms'); + +end. \ No newline at end of file diff --git a/OMPSamples/SqrSinArrays.pas b/OMPSamples/SqrSinArrays.pas new file mode 100644 index 0000000..3c7de0f --- /dev/null +++ b/OMPSamples/SqrSinArrays.pas @@ -0,0 +1,47 @@ +// демонстрация работы параллельного for +//заполнение массива +procedure FillRandArr(A: array of real); +begin + Randomize; + for var i := 0 to A.Length - 1 do + a[i] := Random(1000); +end; + // вывод массива +procedure printArr(A: array of real); +begin + for var i := 0 to A.Length - 1 do + writeln(a[i]); +end; +// Последовательное вычисление квадратов синусов +procedure SqrSinArr(A: array of real; var C: array of real); +begin + + for var i := 0 to A.Length - 1 do + C[i] := sqr(sin(A[i])); +end; +// Параллельное вычисление квадратов синусов +procedure SqrSinArrParallel(A: array of real; var C: array of real); +begin + + {$omp parallel for} + for var i := 0 to A.Length - 1 do + C[i] := sqr(sin(A[i])); +end; + +begin + var A: array of real; + var C: array of real; + SetLength(A, 10000000); + SetLength(C, A.Length); + FillRandArr(A); + + var m0 := Milliseconds; + SqrSinArrParallel(A, C); + + writeln('Параллельное выполнение: ', Milliseconds - m0, 'ms'); + + m0 := Milliseconds; + SqrSinArr(A, C); + writeln('Последовательное выполнение: ', Milliseconds - m0, 'ms'); + +end. \ No newline at end of file diff --git a/OMPSamples/SumOfPrime.pas b/OMPSamples/SumOfPrime.pas new file mode 100644 index 0000000..ef2c2e6 --- /dev/null +++ b/OMPSamples/SumOfPrime.pas @@ -0,0 +1,44 @@ +// Демонстрация работы директивы parallel for c опцией редукции +// на примере вычисления суммы простых чисел среди первых n +// натуральных чисел + +// проверка на простоту числа n +function IsPrime(n:integer):boolean; +begin + result:=false; + for var i:integer:=2 to round(sqrt(n)) do + if n mod i = 0 then + exit; + result:=true; +end; +//Последовательное вычисление суммы простых чисел +function SumOfPrimesSeq(n:integer):int64; +begin + var sum:int64:=0; + for var i:integer:=2 to n do + if IsPrime(i) then + sum:=sum+i; + result:=sum; +end; +//Параллельное вычисление суммы простых чисел +function SumOfPrimesPar(n:integer):int64; +begin + var sum:int64:=0; + {$omp parallel for reduction(+:sum)} + for var i:integer:=2 to n do + if IsPrime(i) then + sum:=sum+i; + result:=sum; +end; + +const Count = 5000000; + +begin + var t := Milliseconds; + WriteLn(SumOfPrimesSeq(Count)); + Writeln('Seq time = ', Milliseconds - t); + + t := Milliseconds; + WriteLn(SumOfPrimesPar(Count)); + Writeln('Par time = ', Milliseconds - t); +end. \ No newline at end of file diff --git a/OMPSamples/Write Critical.pas b/OMPSamples/Write Critical.pas new file mode 100644 index 0000000..c850aa8 --- /dev/null +++ b/OMPSamples/Write Critical.pas @@ -0,0 +1,27 @@ +// Вывод в параллельной секции без использования критических секций +// и с их использованием. В первом случае из-за параллельного доступа +// к разделяемому ресурсу возможно, что строки будут выводиться +// на одной строке, и в произвольно порядке. Во втором случае такого не будет. +begin + {$omp parallel sections} + begin + begin + WriteLn('Thread 1 started'); + end; + begin + WriteLn('Thread 2 started'); + end; + end; + + {$omp parallel sections} + begin + begin + {$omp critical a} + WriteLn('Thread 1 started'); + end; + begin + {$omp critical a} + WriteLn('Thread 2 started'); + end; + end; +end. \ No newline at end of file diff --git a/OpenGL и OpenCL/OpenCL/MatrMlt.cl b/OpenGL и OpenCL/OpenCL/MatrMlt.cl new file mode 100644 index 0000000..8c66636 --- /dev/null +++ b/OpenGL и OpenCL/OpenCL/MatrMlt.cl @@ -0,0 +1,28 @@ +#pragma OPENCL EXTENSION cl_khr_fp64: enable + + + +__kernel void MatrMltMatr(__global double* A, __global double* B, __global double* C, int W) +{ + int cX = get_global_id(0); + int cY = get_global_id(1); + + double sum = 0.0; + for (int i=0; i(A_Matr), // Тип в &<> надо указывать явно, потому что компилятор не может вычислить его из типа элементов массива + B.NewQueue.AddWriteArray2&(B_Mart), + C, + W + ); + + var Otp_C_Q := + C.NewQueue.AddReadArray2&(A_Matr) + + HPQ(()-> + begin + 'Матрица С = A*B:'.Println; + A_Matr.Println; + Writeln; + end); + + var Calc_V2_Q := + code['MatrMltVec'].NewQueue.AddExec1(MatrW, + C, + V1.NewQueue.AddWriteArray1&(V1_Arr), + V2, + W + ); + + var Otp_V2_Q := + V2.NewQueue.AddReadArray1&(V1_Arr) + + HPQ(()-> + begin + 'Вектор V2 = C*V1:'.Println; + V1_Arr.Println; + Writeln; + end); + + // Выполнение всего и сразу асинхронный вывод + + Context.Default.SyncInvoke( + + Calc_C_Q + + Calc_V2_Q * Otp_C_Q + // Считать V2 и выводить C можно одновременно, поэтому тут *, т.е. параллельное выполнение + Otp_V2_Q + + ); + + except + on e: Exception do Writeln(e); // Эта строчка позволяет выводить всю ошибку, если при выполнении Context.SyncInvoke возникла ошибка + end; +end. \ No newline at end of file diff --git a/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.cl b/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.cl new file mode 100644 index 0000000..8f5d9c5 --- /dev/null +++ b/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.cl @@ -0,0 +1,12 @@ + + + +// Это подпрограмма которую вызывает из "SimpleAddition.pas" 10 раз параллельно +__kernel void TEST(__global int* message) +{ + int gid = get_global_id(0); // номер текущего вызова TEST + + message[gid] += gid; +} + + diff --git a/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.pas b/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.pas new file mode 100644 index 0000000..810b3fd --- /dev/null +++ b/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.pas @@ -0,0 +1,27 @@ +uses OpenCLABC; + +begin + + // Чтение и компиляция .cl файла + + var prog := new ProgramCode(Context.Default, ReadAllText('SimpleAddition.cl')); + + // Подготовка параметров + + var A := new Buffer( 10 * sizeof(integer) ); // Буфер достаточного размера, чтобы хранить 10 элементов типа "integer" + + // Выполнение + + prog['TEST'].Exec1(10, // Используем 10 ядер + + // Заполняем весь буфер значениями (1), прямо перед выполнением + // Тип значения integer, потому что это тип по-умолчанию для целых чисел + A.NewQueue.AddFillValue(1) + + ); + + // Чтение и вывод результата + + A.GetArray1&.Println; // Читаем всё содержимое как одномерный массив с элементами типа "integer" + +end. \ No newline at end of file diff --git a/OpenGL и OpenCL/OpenCLABC/Wait очереди/1.pas b/OpenGL и OpenCL/OpenCLABC/Wait очереди/1.pas new file mode 100644 index 0000000..4e2d514 --- /dev/null +++ b/OpenGL и OpenCL/OpenCLABC/Wait очереди/1.pas @@ -0,0 +1,32 @@ +uses OpenCLABC; +uses NamedQData; + +begin + // График выполнения очередей: + // + // D + // / + // B + // / \ + // A E + // \ / + // C + // \ + // F + // + + var A := NamedQ('A'); + var B := NamedQ('B'); + var C := NamedQ('C'); + var D := NamedQ('D'); + var E := NamedQ('E'); + var F := NamedQ('F'); + + Context.Default.SyncInvoke( + A + + (B+D) * + (C+F) * + (WaitForAll(B,C) + E) + ); + +end. \ No newline at end of file diff --git a/OpenGL и OpenCL/OpenCLABC/Wait очереди/2.pas b/OpenGL и OpenCL/OpenCLABC/Wait очереди/2.pas new file mode 100644 index 0000000..c04e7c5 --- /dev/null +++ b/OpenGL и OpenCL/OpenCLABC/Wait очереди/2.pas @@ -0,0 +1,31 @@ +uses OpenCLABC; +uses NamedQData; + +begin + // График выполнения очередей: + // + // A1--B1--C1------E1 + // \ / + // \ / + // A2------C2--D2--E2 + // + + var A1 := NamedQ('A1'); + var A2 := NamedQ('A2'); + + var B1 := NamedQ('B1'); + + var C1 := NamedQ('C1'); + var C2 := NamedQ('C2'); + + var D2 := NamedQ('D2'); + + var E1 := NamedQ('E1'); + var E2 := NamedQ('E2'); + + Context.Default.SyncInvoke( + ( A1 + B1 + C1 + WaitFor(D2) + E1 ) * + ( A2 + WaitFor(B1) + C2 + D2 + E2 ) + ); + +end. \ No newline at end of file diff --git a/OpenGL и OpenCL/OpenCLABC/Wait очереди/NamedQData.pas b/OpenGL и OpenCL/OpenCLABC/Wait очереди/NamedQData.pas new file mode 100644 index 0000000..7af3a38 --- /dev/null +++ b/OpenGL и OpenCL/OpenCLABC/Wait очереди/NamedQData.pas @@ -0,0 +1,13 @@ +unit NamedQData; + +uses OpenCLABC; + +function NamedQ(name: string; delay: integer := 1000) := +HPQ(()-> +begin + lock output do Writeln($'Очередь {name} начала выполнятся'); + Sleep(delay); + lock output do Writeln($'Очередь {name} выполнилась'); +end); + +end. \ No newline at end of file diff --git a/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/0.cl b/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/0.cl new file mode 100644 index 0000000..50d612d --- /dev/null +++ b/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/0.cl @@ -0,0 +1,11 @@ + + + +__kernel void TEST(__global int* message) +{ + int gid = get_global_id(0); // номер текущего вызова TEST + + message[gid] += gid; +} + + diff --git a/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Использовать.pas b/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Использовать.pas new file mode 100644 index 0000000..e4b8a59 --- /dev/null +++ b/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Использовать.pas @@ -0,0 +1,24 @@ +uses OpenCLABC; + +begin + + // Запустите "Прекомпилировать.pas", чтобы создать этот файл + {$resource 0.cl.temp_bin} + + var prog := ProgramCode.DeserializeFrom(Context.Default, + System.Reflection.Assembly.GetExecutingAssembly.GetManifestResourceStream('0.cl.temp_bin') + ); + + // Дальше всё так же как в "0Простейшие примеры\SimpleAddition" + + var A := new Buffer( 10 * sizeof(integer) ); + + prog['TEST'].Exec1(10, + + A.NewQueue.AddFillValue(1) + + ); + + A.GetArray1&.Println; + +end. \ No newline at end of file diff --git a/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Прекомпилировать.pas b/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Прекомпилировать.pas new file mode 100644 index 0000000..fa75e2d --- /dev/null +++ b/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Прекомпилировать.pas @@ -0,0 +1,8 @@ +uses OpenCLABC; + +begin + var prog := new ProgramCode(Context.Default, ReadAllText('0.cl')); + var f := System.IO.File.Create('0.cl.temp_bin'); + prog.SerializeTo(f); + f.Close; +end. \ No newline at end of file diff --git a/OpenGL и OpenCL/OpenGL/Rot Triangle 1.vertex.glsl b/OpenGL и OpenCL/OpenGL/Rot Triangle 1.vertex.glsl new file mode 100644 index 0000000..9d216f7 --- /dev/null +++ b/OpenGL и OpenCL/OpenGL/Rot Triangle 1.vertex.glsl @@ -0,0 +1,18 @@ +#version 460 + +attribute vec2 position; +attribute vec3 color; +uniform float rot_k; + +void main() +{ + + gl_Position.x = position.x*rot_k; + gl_Position.y = position.y; + gl_Position.z = 0.0f; + gl_Position.w = 1.0f; + + gl_FrontColor.rgb = color; + gl_FrontColor.a = 1.0f; + +} diff --git a/OpenGL и OpenCL/OpenGL/Крутящийся треугольник 1 (простейший пример).pas b/OpenGL и OpenCL/OpenGL/Крутящийся треугольник 1 (простейший пример).pas new file mode 100644 index 0000000..63948b3 --- /dev/null +++ b/OpenGL и OpenCL/OpenGL/Крутящийся треугольник 1 (простейший пример).pas @@ -0,0 +1,238 @@ +{$reference System.Windows.Forms.dll} +{$reference System.Drawing.dll} + +// Данный пример демонстрирует запуск простейшей программы с модулем OpenGL +// Примите во внимание, что методы из gl_gdi. - могут служить только временной заменой в серьёзной программе +// (По крайней мере в данной версии. В будущем, возможно, gl_gdi будет улучшено) +// Они использованы тут, чтоб пример был проще + +uses System.Windows.Forms; +uses System.Drawing; +uses System; +uses OpenGL; + +{$apptype windows} // убирает консоль + +var gl: OpenGL.gl; + +{$region Shader} + +function InitShader(fname: string; st: ShaderType): gl_shader; +begin + Result := gl.CreateShader(st); + + var source := ReadAllText(fname); + + gl.ShaderSource(Result, 1, + new string[](source), + new integer[](source.Length) + ); + + gl.CompileShader(Result); + // получаем состояние успешности компиляции + // 1=успешно + // 0=ошибка + var comp_ok: integer; + gl.GetShaderiv(Result, ShaderParameterName.COMPILE_STATUS, comp_ok); + if comp_ok = 0 then + begin + + // узнаём нужную длинную строки + var l: integer; + gl.GetShaderiv(Result, ShaderParameterName.INFO_LOG_LENGTH, l); + + // выделяем достаточно памяти чтоб сохранить строку + var ptr := System.Runtime.InteropServices.Marshal.AllocHGlobal(l); + + // получаем строку логов + gl.GetShaderInfoLog(Result, l, IntPtr.Zero, ptr); + + // преобразовываем в управляемую строку + var log := System.Runtime.InteropServices.Marshal.PtrToStringAnsi(ptr); + Writeln(log); + + // и в конце обязательно освобождаем памяти, чтобы не было утечек памяти + System.Runtime.InteropServices.Marshal.FreeHGlobal(ptr); + end; + +end; + +{$endregion Shader} + +{$region Program} + +function InitProgram(vertex_shader, fragment_shader: gl_shader): gl_program; +begin + Result := gl.CreateProgram; + + gl.AttachShader(Result, vertex_shader); + if fragment_shader<>gl_shader.Zero then gl.AttachShader(Result, fragment_shader); + + gl.LinkProgram(Result); + // всё то же самое что и у шейдеров + var link_ok: integer; + gl.GetProgramiv(Result, ProgramPropertyARB.LINK_STATUS, link_ok); + if link_ok = 0 then + begin + + var l: integer; + gl.GetProgramiv(Result, ProgramPropertyARB.INFO_LOG_LENGTH, l); + var ptr := System.Runtime.InteropServices.Marshal.AllocHGlobal(l); + + gl.GetProgramInfoLog(Result, l, IntPtr.Zero, ptr); + var log := System.Runtime.InteropServices.Marshal.PtrToStringAnsi(ptr); + Writeln(log); + + System.Runtime.InteropServices.Marshal.FreeHGlobal(ptr); + end; + +end; + +{$endregion Program} + +const dy = -Sin(Pi / 6) / 2; + +begin + + // Создаёт и настраиваем окно + var f := new Form; + f.StartPosition := FormStartPosition.CenterScreen; + f.ClientSize := new Size(500, 500); + f.FormBorderStyle := FormBorderStyle.Fixed3D; + // Если окно закрылось - надо сразу завершить программу + f.Closed += (o,e)->Halt(); + + // Настраиваем поверхность рисования + var hdc := gl_gdi.InitControl(f); + + // Настраиваем перерисовку + gl_gdi.SetupControlRedrawing(f, hdc, EndFrame-> + begin + + {$region Настройка глобальных параметров OpenGL} + + // При создании экземпляра OpenGL.gl инициализируются некоторые функции + // Это необходимо для всех функций из OpenGL1.2 и выше, потому что они локальны для контекста OpenGL + gl := new OpenGL.gl; + + {$endregion Настройка глобальных параметров OpenGL} + + {$region Инициализация переменных} + + var vertex_pos_buffer: gl_buffer; + gl.CreateBuffers(1, vertex_pos_buffer); + gl.NamedBufferData( + vertex_pos_buffer, + new IntPtr(3*sizeof(Vec2f)), + ArrGen(3, i-> + begin + var rot := i * Pi * 2 / 3; + + Result := new Vec2f( + Sin(rot), + Cos(rot) + dy + ); + + end), + VertexBufferObjectUsage.STATIC_DRAW + ); + + var vertex_clr_buffer: gl_buffer; + gl.CreateBuffers(1, vertex_clr_buffer); + gl.NamedBufferData( + vertex_clr_buffer, + new IntPtr(3*sizeof(Vec3f)), + new Vec3f[]( + new Vec3f(1,0,0), + new Vec3f(0,1,0), + new Vec3f(0,0,1) + ), + VertexBufferObjectUsage.STATIC_DRAW + ); + + var element_buffer: gl_buffer; + gl.CreateBuffers(1, element_buffer); + gl.NamedBufferData( + element_buffer, + new IntPtr(3*sizeof(byte)), + new byte[]( + 0,1,2 + ), + VertexBufferObjectUsage.STATIC_DRAW + ); + + var vertex_shader := InitShader('Rot Triangle 1.vertex.glsl', ShaderType.VERTEX_SHADER); +// var fragment_shader := InitShader('fragment.glsl', ShaderType.FRAGMENT_SHADER); + + var sprog := InitProgram(vertex_shader, gl_shader.Zero {fragment_shader}); + + var uniform_rot_k := gl.GetUniformLocation(sprog, 'rot_k'); + + var attribute_position := gl.GetAttribLocation(sprog, 'position'); + var attribute_color := gl.GetAttribLocation(sprog, 'color'); + + var t := new System.Diagnostics.Stopwatch; + t.Start; + + {$endregion Инициализация переменных} + + while true do + begin + // очищаем окно в начале перерисовки + gl.Clear(ClearBufferMask.COLOR_BUFFER_BIT); + + + + gl.UseProgram(sprog); + + gl.Uniform1f(uniform_rot_k, Cos( t.Elapsed.Ticks * 0.0000002 ) ); + + gl.BindBuffer(BufferTargetARB.ARRAY_BUFFER, vertex_pos_buffer); + gl.VertexAttribPointer( + attribute_position, + 2, + VertexAttribPointerType.FLOAT, + false, + 8, + IntPtr.Zero + ); + gl.EnableVertexAttribArray(attribute_position); + + gl.BindBuffer(BufferTargetARB.ARRAY_BUFFER, vertex_clr_buffer); + gl.VertexAttribPointer( + attribute_color, + 3, + VertexAttribPointerType.FLOAT, + false, + 12, + IntPtr.Zero + ); + gl.EnableVertexAttribArray(attribute_color); + + gl.BindBuffer(BufferTargetARB.ELEMENT_ARRAY_BUFFER, element_buffer); + gl.DrawElements( + PrimitiveType.TRIANGLES, + 3, + DrawElementsType.UNSIGNED_BYTE, + IntPtr.Zero + ); + + gl.DisableVertexAttribArray(attribute_position); + gl.DisableVertexAttribArray(attribute_color); + + + + // получаем тип последней ошибки + var err := gl.GetError; + // и если ошибка есть - выводим её + if err<>ErrorCode.NO_ERROR then Writeln(err); + + gl.Finish; + // EndFrame меняет местами буферы и ждёт vsync + EndFrame; + end; + + end); + + Application.Run(f); +end. \ No newline at end of file diff --git a/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html b/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html new file mode 100644 index 0000000..1a4f70b --- /dev/null +++ b/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html @@ -0,0 +1,1921 @@ + + + + + + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OpenGL и OpenCL/Справка OpenCLABC.html b/OpenGL и OpenCL/Справка OpenCLABC.html new file mode 100644 index 0000000..07108a1 --- /dev/null +++ b/OpenGL и OpenCL/Справка OpenCLABC.html @@ -0,0 +1,2086 @@ + + + + + + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OpenGL и OpenCL/Справка OpenGLABC.html b/OpenGL и OpenCL/Справка OpenGLABC.html new file mode 100644 index 0000000..335b55e --- /dev/null +++ b/OpenGL и OpenCL/Справка OpenGLABC.html @@ -0,0 +1,886 @@ + + + + + + +
+
+
+
+
+
+
+
+
+ + + + + + diff --git a/Other/SpeedTests/ArraySlice.pas b/Other/SpeedTests/ArraySlice.pas new file mode 100644 index 0000000..f82ec81 --- /dev/null +++ b/Other/SpeedTests/ArraySlice.pas @@ -0,0 +1,9 @@ +begin + var s := Arr(1..1000); + var s1: array of integer; + var n := 100000000; + MillisecondsDelta; + loop n do + s1 := s[1:11]; + MillisecondsDelta.Println; +end. \ No newline at end of file diff --git a/Other/SpeedTests/ArraySliceAssignment.pas b/Other/SpeedTests/ArraySliceAssignment.pas new file mode 100644 index 0000000..7a700cf --- /dev/null +++ b/Other/SpeedTests/ArraySliceAssignment.pas @@ -0,0 +1,9 @@ +begin + var s := Arr(1..10); + Milliseconds; + var n := 100000000; + MillisecondsDelta.Println; + loop n do + s[0:10] := s; + MillisecondsDelta.Println; +end. \ No newline at end of file diff --git a/Other/SpeedTests/CalculationsGlobalLocal/BlockVars.pas b/Other/SpeedTests/CalculationsGlobalLocal/BlockVars.pas new file mode 100644 index 0000000..176f245 --- /dev/null +++ b/Other/SpeedTests/CalculationsGlobalLocal/BlockVars.pas @@ -0,0 +1,13 @@ +// Сравнение скорости работы глобальных и внутриблочных переменных. +// См. также файл GlobalVars.pas +begin + var s := 0.0; + var i: real := 1; + while i<1000000000 do + begin + s += 1/i; + i += 1; + end; + writeln(s); + writeln('Время расчета = ',Milliseconds/1000,' с'); +end. diff --git a/Other/SpeedTests/CalculationsGlobalLocal/GlobalVars.pas b/Other/SpeedTests/CalculationsGlobalLocal/GlobalVars.pas new file mode 100644 index 0000000..7976854 --- /dev/null +++ b/Other/SpeedTests/CalculationsGlobalLocal/GlobalVars.pas @@ -0,0 +1,15 @@ +// Сравнение скорости работы глобальных и внутриблочных переменных. +// См. также файл BlockVars.pas +var + s: real := 0; + i: real := 1; + +begin + while i<1000000000 do + begin + s += 1/i; + i += 1; + end; + writeln(s); + writeln('Время расчета = ',Milliseconds/1000,' с'); +end. diff --git a/Other/SpeedTests/ListSlice.pas b/Other/SpeedTests/ListSlice.pas new file mode 100644 index 0000000..6dc560e --- /dev/null +++ b/Other/SpeedTests/ListSlice.pas @@ -0,0 +1,10 @@ +begin + var s := Lst(1..1000); + var s1: List; + Milliseconds; + var n := 10000000; + MillisecondsDelta.Println; + loop n do + s1 := s[1:11]; + MillisecondsDelta.Println; +end. \ No newline at end of file diff --git a/Other/SpeedTests/ListSliceAssignment.pas b/Other/SpeedTests/ListSliceAssignment.pas new file mode 100644 index 0000000..b8cf9be --- /dev/null +++ b/Other/SpeedTests/ListSliceAssignment.pas @@ -0,0 +1,9 @@ +begin + var s := Lst(1..10); + Milliseconds; + var n := 100000000; + MillisecondsDelta.Println; + loop n do + s[0:10] := s; + MillisecondsDelta.Println; +end. \ No newline at end of file diff --git a/Other/SpeedTests/Milli.pas b/Other/SpeedTests/Milli.pas new file mode 100644 index 0000000..16534cf --- /dev/null +++ b/Other/SpeedTests/Milli.pas @@ -0,0 +1,14 @@ +// Производительность заполнения статических и динамических массивов +const n = 20000; + +var a: array [1..n,1..n] of real; + +begin + for var i:=1 to n do + for var j:=1 to n do + a[i,j] := 1; + Println(MillisecondsDelta/1000); + + var m := MatrFill(n,n,1); + Println(MillisecondsDelta/1000); +end. diff --git a/Other/SpeedTests/Substring_vs_Slice.pas b/Other/SpeedTests/Substring_vs_Slice.pas new file mode 100644 index 0000000..d2f7710 --- /dev/null +++ b/Other/SpeedTests/Substring_vs_Slice.pas @@ -0,0 +1,12 @@ +begin + var s := Range(#32,#1000).JoinIntoString; + var s1: string; + Milliseconds; + var n := 100000000; + loop n do + s1 := s.Substring(10,10); + MillisecondsDelta.Println; + loop n do + s1 := s[1:11]; + MillisecondsDelta.Println; +end. \ No newline at end of file diff --git a/Other/UnmanagedGraphics/MessageBox.pas b/Other/UnmanagedGraphics/MessageBox.pas new file mode 100644 index 0000000..df79987 --- /dev/null +++ b/Other/UnmanagedGraphics/MessageBox.pas @@ -0,0 +1,6 @@ +function MessageBox(h:integer;m,c:string;t:integer):integer; +external 'User32.dll' name 'MessageBox'; + +begin + MessageBox(0,'Привет!','Сообщение',0); +end. \ No newline at end of file diff --git a/PascalABCNET.ini b/PascalABCNET.ini new file mode 100644 index 0000000..9ea787c --- /dev/null +++ b/PascalABCNET.ini @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/StandardUnits/CRT/Bill.pas b/StandardUnits/CRT/Bill.pas new file mode 100644 index 0000000..5cc3309 --- /dev/null +++ b/StandardUnits/CRT/Bill.pas @@ -0,0 +1,145 @@ +// Отражение шарика от стенок. Консольный режим +// Для запуска программы используйте Shift+F9 !!! +uses CRT; + +const +// Ширина поля + w = 80; +// Высота поля + h = 24; + +var +/// Координаты шарика + ax,ay: integer; +/// Вектор перемещения шарика + vx,vy: integer; +/// Массив клеток поля + a: array [1..w,1..h] of char; + +/// Очистка массива a +procedure CleanA; +begin + for var j := 1 to h do + for var i := 1 to w do + A[i,j] := ' ' +end; + +/// Создание горизонтальной стены +procedure HorizWall(x,y,L: integer); +begin + for var i := x to x+L-1 do + A[i,y] := '*' +end; + +/// Создание вертикальной стены +procedure VertWall(x,y,L: integer); +begin + for var j := y to y+L-1 do + A[x,j] := '*' +end; + +/// Заполнение поля стенами +procedure Fill; +begin + CleanA; + HorizWall(1,1,w); + HorizWall(1,h,w); + VertWall(1,1,h); + VertWall(w,1,h); + + HorizWall(49,9,31); + HorizWall(49,14,31); +end; + +/// Перерисовка экрана +procedure DrawScreen; +begin + TextColor(White); + ClrScr; + for var j := 1 to h do + for var i := 1 to w do + write(A[i,j]) +end; + +/// Возвращает True, если на пути шарика препятствие +function FilledInFront: boolean; +begin + Result := (A[ax+vx,ay]<>' ') or (A[ax,ay+vy]<>' ') or (A[ax+vx,ay+vy]<>' ') +end; + +/// Меняет направление шарика +procedure ChangeDirection; +begin + if A[ax+vx,ay]<>' ' then + vx := -vx; + if A[ax,ay+vy]<>' ' then + vy := -vy; + if (A[ax+vx,ay]=' ') and (A[ax,ay+vy]=' ') and (A[ax+vx,ay+vy]<>' ') then + begin + vx := -vx; + vy := -vy + end; + Sleep(10); +end; + +/// Рисует шарик +procedure ShowBall; +begin + GotoXY(ax,ay); + write('B'); +end; + +/// Стирает шарик +procedure HideBall; +begin + GotoXY(ax,ay); + write(' '); +end; + +/// Устанавливает вектор движение шарика +procedure SetBallCoords(x,y: integer); +begin + ax := x; + ay := y +end; + +/// Устанавливает координаты шарика +procedure SetBallVeloc(vx0,vy0: integer); +begin + vx := vx0; + vy := vy0 +end; + +/// Перемещает шарик к позиции (x,y) +procedure MoveTo(x,y: integer); +begin + HideBall; + SetBallCoords(x,y); + ShowBall +end; + +/// Перемещает шарик на вектор (dx,dy) +procedure MoveBy(dx,dy: integer); +begin + MoveTo(ax+dx,ay+dy); +end; + +BEGIN + SetWindowTitle('Биллиард (ностальгия по CRT)'); + HideCursor; + + Fill; + DrawScreen; + + SetBallCoords(70,13); + SetBallVeloc(1,1); + TextColor(Yellow); + ShowBall; + + repeat + Delay(20); + if FilledInFront then + ChangeDirection; + MoveBy(vx,vy); + until KeyPressed; +END. diff --git a/StandardUnits/CRT/CPaint.pas b/StandardUnits/CRT/CPaint.pas new file mode 100644 index 0000000..5ea9b40 --- /dev/null +++ b/StandardUnits/CRT/CPaint.pas @@ -0,0 +1,70 @@ +// Рисование курсором в консольном окне +// Иллюстрация GotoXY, TextBackGround +// Для запуска программы используйте Shift+F9 !!! +uses Crt; + +var + draw: boolean; + color: integer; + +function IsCoordCorrect(x,y: integer): boolean; +begin + Result := (x in [1..WindowWidth]) and (y in [1..WindowHeight]); +end; + +procedure MyGotoXY(x,y: integer); +begin + if not IsCoordCorrect(x,y) then + exit; + GotoXY(x,y); +end; + +procedure DrawSymbol(x,y: integer; c: char); +begin + if not IsCoordCorrect(x,y) then + exit; + GotoXY(x,y); + write(c); + GotoXY(x,y); +end; + +begin + draw := True; + color := Green; + ClrScr; + SetWindowTitle('Рисование курсором (Esc-выход, Num 5 - изменение цвета)'); + TextBackGround(color); + GotoXY(WindowWidth div 2,WindowHeight div 2); + var c: char; + repeat + c := ReadKey; + if c=#32 then + draw := not draw; + if c=#0 then + begin + c := ReadKey; + case c of + // Изменение цвета по клавише Num 5 + {5} #12: begin + color := color + 1; + if color=16 then + color := 0; + TextBackGround(color); + end; + {RU}#33: MyGotoXY(WhereX+1,WhereY-1); + {RD}#34: MyGotoXY(WhereX+1,WhereY+1); + {LD}#35: MyGotoXY(WhereX-1,WhereY+1); + {LU}#36: MyGotoXY(WhereX-1,WhereY-1); + {L} #37: MyGotoXY(WhereX-1,WhereY); + {U} #38: MyGotoXY(WhereX,WhereY-1); + {R} #39: MyGotoXY(WhereX+1,WhereY); + {D} #40: MyGotoXY(WhereX,WhereY+1); + #67: ClrScr; + end; + if draw then + DrawSymbol(WhereX, WhereY,' '); + end; + until c=#27; + TextBackGround(Black); + GotoXY(1,25); +end. diff --git a/StandardUnits/CRT/CRTColors.pas b/StandardUnits/CRT/CRTColors.pas new file mode 100644 index 0000000..5b205c8 --- /dev/null +++ b/StandardUnits/CRT/CRTColors.pas @@ -0,0 +1,20 @@ +// Стандартные CRT-цвета +// Для запуска программы используйте Shift+F9 !!! +uses CRT; + +begin + SetWindowTitle('Стандартные CRT-цвета'); + for var i:=0 to 15 do + begin + TextBackground(i); + for var j:=0 to 15 do + begin + TextColor(j); + write(' CRT'); + end; + writeln; + end; + HideCursor; + TextBackground(0); + TextColor(0); +end. diff --git a/StandardUnits/CRT/SimpleTextEditor.pas b/StandardUnits/CRT/SimpleTextEditor.pas new file mode 100644 index 0000000..b8dc321 --- /dev/null +++ b/StandardUnits/CRT/SimpleTextEditor.pas @@ -0,0 +1,17 @@ +// Простейший текстовый редактор +// Для запуска программы используйте Shift+F9 !!! +uses CRT; + +begin + SetWindowTitle('Текстовый редактор (Enter - новая строка, Esc - выход)'); + clrScr; + repeat + var c := ReadKey; + case c of + #13: writeln; + #27: break; + #32..#255: write(c); + #0: c := ReadKey; + end; + until false; +end. diff --git a/StandardUnits/FormsABC/CalcIntegral.pas b/StandardUnits/FormsABC/CalcIntegral.pas new file mode 100644 index 0000000..d73a20b --- /dev/null +++ b/StandardUnits/FormsABC/CalcIntegral.pas @@ -0,0 +1,64 @@ +uses FormsABC; + +type Fun = function (x: real): real; + +var funs: array of Fun := (sin,cos,sqr); + +function CalcIntegral(a,b: real; N: integer; f: Fun): real; +begin + Result := 0; + var x := a; + var h := (b-a)/N; + for var i:=0 to N-1 do + begin + Result += f(x); + x += h; + end; + Result *= h; +end; + +var + a := new RealField('a:'); + f1 := new FlowBreak; + b := new RealField('b:'); + f2 := new FlowBreak; + N := new IntegerField('N:'); + f3 := new FlowBreak; + tl := new TextLabel('Функция: '); + f4 := new FlowBreak; + cb := new ComboBox; + f5 := new FlowBreak(50); + s1 := new Space(20); + ok := new Button('Вычислить'); + tb: TextBox; + +procedure MyClick; +begin + var f := funs[cb.SelectedIndex]; + var res := CalcIntegral(a.Value,b.Value,N.Value,f); + tb.AddLine(Format('Интеграл({0},{1},{2},{3}) = {4}',a.Value,b.Value,N.Value,cb.SelectedValue,res.ToString)); +end; + +procedure InitControls; +begin + MainForm.Title := 'Вычисление определенного интеграла'; + MainForm.SetSize(500,350); + MainForm.CenterOnScreen; + b.Value := 1; + N.Value := 10; + cb.Items.Add('sin'); + cb.Items.Add('cos'); + cb.Items.Add('x^2'); + cb.SelectedIndex := 0; + ok.Click += MyClick; + mainPanel.Dock := DockStyle.Left; + mainPanel.Width := 150; + + ParentControl := MainForm; + tb := new TextBox; + tb.Dock := DockStyle.Fill; +end; + +begin + InitControls; +end. \ No newline at end of file diff --git a/StandardUnits/FormsABC/PaintBoxDraw.pas b/StandardUnits/FormsABC/PaintBoxDraw.pas new file mode 100644 index 0000000..3f5e162 --- /dev/null +++ b/StandardUnits/FormsABC/PaintBoxDraw.pas @@ -0,0 +1,76 @@ +uses + System.Drawing, + System.Windows.Forms, + System.Threading, + FormsABC; + +procedure DrawMandelbrot(g: Graphics; w,h: integer; scale: real; dx,dy: integer); +const max = 10; +begin + for var ix:=0 to w-1 do + for var iy:=0 to h-1 do + begin + var x := 0.0; + var y := 0.0; + var cx := scale * (ix - dx); + var cy := scale * (iy - dy); + var i := 1; + while i<255 do + begin + var x1 := x*x-y*y+cx; + var y1 := 2*x*y+cy; + x := x1; + y := y1; + if (abs(x)>max) and (abs(y)>max) then break; + i += 1; + end; + if i>=255 then + g.FillRectangle(Brushes.Red,ix,iy,1,1) + else + g.FillRectangle(new SolidBrush(Color.FromArgb(255,255-i,255-i)),ix,iy,1,1) + end; +end; + +var + Scale := new RealField('Масштаб: '); + l1 := new FlowBreak; + dx := new IntegerField('dx: '); + l2 := new FlowBreak; + dy := new IntegerField('dy: '); + l3 := new FlowBreak(20); + b := new Button(' Нарисовать '); + p: PaintBox; + + +procedure Draw; +begin + var g := p.Graphics; + DrawMandelbrot(g,p.Width,p.Height,Scale.Value,dx.Value,dy.Value); + p.Invalidate; +end; + +procedure My(o: Object); +begin + Draw; +end; + +procedure Click; +begin + ThreadPool.QueueUserWorkItem(My); +end; + +begin + MainForm.Title := 'Множество Мандельброта'; + MainForm.SetSize(700, 600); + MainPanel.Dock := Dockstyle.Left; + MainPanel.Width := 120; + Scale.Value := 0.0035; + dx.Value := 430; + dy.Value := 280; + b.Click += Click; + + ParentControl := MainForm; + p := new PaintBox; + p.Dock := DockStyle.Fill; + ThreadPool.QueueUserWorkItem(My); +end. \ No newline at end of file diff --git a/StandardUnits/FormsABC/f0.pas b/StandardUnits/FormsABC/f0.pas new file mode 100644 index 0000000..9d99a29 --- /dev/null +++ b/StandardUnits/FormsABC/f0.pas @@ -0,0 +1,24 @@ +uses FormsABC; + +var + a,b,sum,prod: IntegerField; + d: Button; + +procedure MyClick; +begin + sum.Value := a.Value + b.Value; + prod.Value := a.Value * b.Value; +end; + +begin + a := new IntegerField('a:'); + b := new IntegerField('b:'); + LineBreak; + sum := new IntegerField('Сумма:',220); + LineBreak; + prod := new IntegerField('Произведение:',220); + LineBreak; + EmptyLine(20); + d := new Button('Вычислить'); + d.Click += MyClick; +end. \ No newline at end of file diff --git a/StandardUnits/FormsABC/f0_MV.pas b/StandardUnits/FormsABC/f0_MV.pas new file mode 100644 index 0000000..0c38882 --- /dev/null +++ b/StandardUnits/FormsABC/f0_MV.pas @@ -0,0 +1,40 @@ +uses FormsABC; + +type + Model = class + class procedure Calc(x,y: integer; var sum,prod: integer); + begin + sum := x + y; + prod := x * y; + end; + end; + + View = class + private + a,b,sum,prod: IntegerField; + procedure MyClick; + begin + var s,p: integer; + Model.Calc(a.Value,b.Value,s,p); + sum.Value := s; + prod.Value := p; + end; + public + constructor Create; + begin + a := new IntegerField('a:'); + b := new IntegerField('b:'); + LineBreak; + sum := new IntegerField('Сумма:',220); + LineBreak; + prod := new IntegerField('Произведение:',220); + LineBreak; + EmptyLine(20); + var d := new Button('Вычислить'); + d.Click += MyClick; + end; + end; + +begin + var v := new View; +end. \ No newline at end of file diff --git a/StandardUnits/FormsABC/f0_class.pas b/StandardUnits/FormsABC/f0_class.pas new file mode 100644 index 0000000..fc46960 --- /dev/null +++ b/StandardUnits/FormsABC/f0_class.pas @@ -0,0 +1,30 @@ +uses FormsABC; + +type + View = class + private + a,b,sum,prod: IntegerField; + procedure MyClick; + begin + sum.Value := a.Value + b.Value; + prod.Value := a.Value * b.Value; + end; + public + constructor Create; + begin + a := new IntegerField('a:'); + b := new IntegerField('b:'); + LineBreak; + sum := new IntegerField('Сумма:',220); + LineBreak; + prod := new IntegerField('Произведение:',220); + LineBreak; + EmptyLine(20); + var d := new Button('Вычислить'); + d.Click += MyClick; + end; + end; + +begin + var v := new View; +end. \ No newline at end of file diff --git a/StandardUnits/PABCSystem/SerializationGraph.pas b/StandardUnits/PABCSystem/SerializationGraph.pas new file mode 100644 index 0000000..8ac010c --- /dev/null +++ b/StandardUnits/PABCSystem/SerializationGraph.pas @@ -0,0 +1,19 @@ +// Сериализация объектов +// Можно сериализовать только объекты, помеченные атрибутом [Serializable] +// Внешние Serialize, Deserialize позволяют сохранить в файле - восстановить +// один объект (один граф объектов с данным корнем) +type + [Serializable] + Node = auto class + x: integer; + next: Node; + end; + +const fname = 'a.dat'; + +begin + var m := new Node(5,new Node(3,new Node(4,nil))); + Serialize(fname,m); // Сериализуем объект в файл + var m1 := Deserialize(fname) as Node; // Десериализуем из файла + Print(m1); +end. \ No newline at end of file diff --git a/StandardUnits/PABCSystem/SerializationMany.pas b/StandardUnits/PABCSystem/SerializationMany.pas new file mode 100644 index 0000000..c5a2671 --- /dev/null +++ b/StandardUnits/PABCSystem/SerializationMany.pas @@ -0,0 +1,28 @@ +// Сериализация объектов +// Можно сериализовать только объекты, помеченные атрибутом [Serializable] +// Внешние Serialize, Deserialize позволяют сохранить в файле - восстановить +// один объект (один граф объектов с данным корнем) +type + [Serializable] + My = auto class + x,y: integer; + end; + IntArray = array of integer; + +const fname = 'a.dat'; + +begin + var f := CreateBinary(fname); + f.Serialize(new My(444,555)); + f.Serialize(|1,2,3|); + f.Serialize(Lst(1..9)); + f.Close; + + f := OpenBinary(fname); + var m: My := f.Deserialize as My; + var a: array of integer := f.Deserialize as IntArray; + var l: List := f.Deserialize as List; + f.Close; + + Print(m,a,l); +end. \ No newline at end of file diff --git a/StandardUnits/PABCSystem/SerializationOne.pas b/StandardUnits/PABCSystem/SerializationOne.pas new file mode 100644 index 0000000..9b39597 --- /dev/null +++ b/StandardUnits/PABCSystem/SerializationOne.pas @@ -0,0 +1,18 @@ +// Сериализация объектов +// Можно сериализовать только объекты, помеченные атрибутом [Serializable] +// Внешние Serialize, Deserialize позволяют сохранить в файле - восстановить +// один объект (один граф объектов с данным корнем) +type + [Serializable] + My = auto class + x,y: integer; + end; + +const fname = 'a.dat'; + +begin + var m := new My(2,3); + Serialize(fname,m); // Сериализуем объект в файл + var m1 := Deserialize(fname) as My; // Десериализуем из файла + Print(m1); +end. \ No newline at end of file diff --git a/StandardUnits/PABCSystem/a.dat b/StandardUnits/PABCSystem/a.dat new file mode 100644 index 0000000..44fe693 Binary files /dev/null and b/StandardUnits/PABCSystem/a.dat differ diff --git a/StandardUnits/Timers/Timer1.pas b/StandardUnits/Timers/Timer1.pas new file mode 100644 index 0000000..fadc433 --- /dev/null +++ b/StandardUnits/Timers/Timer1.pas @@ -0,0 +1,21 @@ +Uses Timers; + +var t1, t2: Timer; + +procedure OnTimer1; +begin + Write('!'); +end; + +procedure OnTimer2; +begin + Write('?'); +end; + +begin + t1 := new Timer(200, OnTimer1); + t2 := new Timer(300, OnTimer2); + t1.Start; + t2.Start; + Sleep(10000); +end. \ No newline at end of file diff --git a/StandardUnits/Timers/Timer2.pas b/StandardUnits/Timers/Timer2.pas new file mode 100644 index 0000000..073c3a6 --- /dev/null +++ b/StandardUnits/Timers/Timer2.pas @@ -0,0 +1,59 @@ +// "Собачка". Иллюстрация использования таймера. +uses GraphABC, Timers; + +var + t: Timer; + xx,yy,px,py: integer; + +procedure Draw; +begin + FillCircle(xx,yy,11); +end; + +procedure Show; +begin + Brush.Color := clBlack; + Draw; +end; + +procedure Hide; +begin + Brush.Color := clWhite; + Draw; +end; + +procedure Move(x,y: integer); +begin + Hide; + xx := x; + yy := y; + show; +end; + +procedure Timer1; +begin + if (xx<>px) or (yy<>py) then + begin + var t := 1/10; + var newx := round((1-t)*xx+t*px); + var newy := round((1-t)*yy+t*py); + Move(newx,newy); + end; +end; + +procedure MouseMove(x,y,mb: integer); +begin + px := x; py := y; +end; + +begin + SetWindowCaption('"Собачка"'); + SetSmoothingOff; + OnMouseMove:=MouseMove; + xx := 100; yy := 100; + px := xx; py := yy; + Show; + Timer1; + t := new Timer(20,Timer1); + t.Start; +end. diff --git a/StandardUnits/Turtle/Turtle1.pas b/StandardUnits/Turtle/Turtle1.pas new file mode 100644 index 0000000..2d40e88 --- /dev/null +++ b/StandardUnits/Turtle/Turtle1.pas @@ -0,0 +1,53 @@ +uses Turtle,GraphWPF; + +var + Atom,FStr,XStr,YStr: string; + angle,len,x0,y0: real; + n: integer; + +procedure Init1; // Dragon +begin + (Atom,FStr,XStr,YStr) := ('fx','f','x+yf+','-fx-y'); + (angle,len,n,x0,y0) := (90,3,15,300,450); +end; + +procedure Init2; // Koch curve +begin + (Atom,FStr,XStr,YStr) := ('F', 'F-F++F-F', '', ''); + (angle,len,n,x0,y0) := (60,5,7,10,550); +end; + +procedure Init3; // Quadratic Koch Island +begin + (Atom,FStr,XStr,YStr) := ('F+F+F+F', 'F+F-FF+F+F-F', '', ''); + (angle,len,n,x0,y0) := (90,4,4,250,450); +end; + +procedure Init4; // Gosper hexagonal curve +begin + (Atom,FStr,XStr,YStr) := ('XF', 'F', 'X+YF++YF-FX--FXFX-YF+','-FX+YFYF++YF+FX--FX-Y'); + (angle,len,n,x0,y0) := (60,4,5,580,56); +end; + +procedure RunStr(s: string; n: integer); +begin + foreach var c in s do + case c of + '+': Turn(angle); + '-': Turn(-angle); + 'f','F': if n>0 then RunStr(FStr,n-1) else Forw(len); + 'x','X': if n>0 then RunStr(XStr,n-1); + 'y','Y': if n>0 then RunStr(YStr,n-1); + else Print('error') + end; +end; + +begin + Init4; + ToPoint(x0,y0); + SetWidth(0.5); + //SetColor(Colors.Red); + Down; + RunStr(Atom,n); + Up; +end. \ No newline at end of file diff --git a/Городок/data/Thumbs.db b/Городок/data/Thumbs.db deleted file mode 100644 index 2b45c48..0000000 Binary files a/Городок/data/Thumbs.db and /dev/null differ diff --git a/Карта_Пирата/data/Thumbs.db b/Карта_Пирата/data/Thumbs.db deleted file mode 100644 index 5496ccf..0000000 Binary files a/Карта_Пирата/data/Thumbs.db and /dev/null differ