diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index d8257c506..395b77c27 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "0"; public const string Build = "0"; - public const string Revision = "1132"; + public const string Revision = "1133"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 3713e2cc4..43d6c703a 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%MINOR%=0 -%REVISION%=1132 %COREVERSION%=0 +%REVISION%=1133 +%MINOR%=0 %MAJOR%=3 diff --git a/InstallerSamples/Applications/GraphApplications/FuncTransform.pas b/InstallerSamples/Applications/GraphApplications/FuncTransform.pas index d60432b8c..c9859b9e1 100644 --- a/InstallerSamples/Applications/GraphApplications/FuncTransform.pas +++ b/InstallerSamples/Applications/GraphApplications/FuncTransform.pas @@ -9,6 +9,10 @@ var 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; @@ -16,7 +20,7 @@ end; procedure DrawGraphic(f: real -> real); begin - Draw(f, -5, 5, -3, 3); + Draw(f, -boundx, boundx, -boundy, boundy); Window.Title := Format('mx={0:f2} my={1:f2} dx={2:f2} dy={3:f2}', mx, my, dx, dy); Redraw; end; diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index d54b957fb..4d0554962 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.0.0.1132' +!define VERSION '3.0.0.1133' diff --git a/ReleaseGenerators/RebuildStandartModules.pas b/ReleaseGenerators/RebuildStandartModules.pas index ad94146f7..646c1b426 100644 --- a/ReleaseGenerators/RebuildStandartModules.pas +++ b/ReleaseGenerators/RebuildStandartModules.pas @@ -4,7 +4,7 @@ uses DrawManField, Events, FilesOperations, GOLDParserEngine, GraphABC, GraphABCHelper, IniFile, PointerTools, PointRect, PT4, Robot, RobotField, RobotTaskMaker, RobotZadan, Sockets, Utils, VCL, Timers, PT4Exam, PT4TaskMakerNET, RBDMUtils, - Collections, Arrays, Core, FormsABC, MPI; + Collections, Arrays, Core, FormsABC, MPI, ClientServer; begin writeln(cos(pi)); diff --git a/ReleaseGenerators/sect_Core.nsh b/ReleaseGenerators/sect_Core.nsh index f8e416dff..24820e57c 100644 --- a/ReleaseGenerators/sect_Core.nsh +++ b/ReleaseGenerators/sect_Core.nsh @@ -185,6 +185,7 @@ File ..\bin\Lib\Collections.pas File ..\bin\Lib\Core.pas File ..\bin\Lib\MPI.pas + File ..\bin\Lib\ClientServer.pas File ..\bin\Lib\__RedirectIOMode.vb File ..\bin\Lib\VBSystem.vb @@ -229,6 +230,7 @@ ${AddFile} "Collections.pas" ${AddFile} "Core.pas" ${AddFile} "MPI.pas" + ${AddFile} "ClientServer.pas" ${AddFile} "__RedirectIOMode.vb" ${AddFile} "VBSystem.vb" diff --git a/TestSuite/CompilationSamples/GraphABC.pas b/TestSuite/CompilationSamples/GraphABC.pas index ba21d4234..1938d3491 100644 --- a/TestSuite/CompilationSamples/GraphABC.pas +++ b/TestSuite/CompilationSamples/GraphABC.pas @@ -582,6 +582,10 @@ function ClientRectangle: System.Drawing.Rectangle; //------------------------------------------ /// Рисует график функции f, заданной на отрезке [a,b] по оси абсцисс и на отрезке [min,max] по оси ординат, в прямоугольнике, задаваемом координатами x1,y1,x2,y2, procedure Draw(f: real -> real; a,b,min,max: real; x1,y1,x2,y2: integer); +/// Рисует график функции f, заданной на отрезке [a,b] по оси абсцисс и на отрезке [min,max] по оси ординат, в прямоугольнике r +procedure Draw(f: real -> real; a,b,min,max: real; r: System.Drawing.Rectangle); +/// Рисует график функции f, заданной на отрезке [a,b] по оси абсцисс и на отрезке [min,max] по оси ординат, на полное графическое окно +procedure Draw(f: real -> real; a,b,min,max: real); /// Рисует график функции f, заданной на отрезке [a,b], в прямоугольнике, задаваемом координатами x1,y1,x2,y2, procedure Draw(f: real -> real; a,b: real; x1,y1,x2,y2: integer); /// Рисует график функции f, заданной на отрезке [a,b], в прямоугольнике r @@ -3490,32 +3494,100 @@ begin end; type FS = auto class - mx,my,a,max: real; - x0,y0: integer; + mx,my,a,min,max: real; + x1,y1: integer; f: real -> real; function Apply(x: real): Point; begin - Result := Pnt(x0+Round(mx*(x-a)),y0+Round(my*(max-f(x)))); + Result := Pnt(x1+Round(mx*(x-a)),y1+Round(my*(max-f(x)))); end; + + function RealToScreenX(x: real): integer := Round(x1 + mx * (x-a)); + + function RealToScreenY(y: real): integer := Round(y1 - my * (y+min)); end; procedure Draw(f: real -> real; a,b,min,max: real; x1,y1,x2,y2: integer); begin + var coefx := (x2-x1)/(b-a); + var coefy := (y2-y1)/(max-min); + + Pen.Color := Color.Black; Rectangle(x1,y1,x2+1,y2+1); + + var fso := new FS(coefx,coefy,a,min,max,x1,y1,f); + + // Линии + {Pen.Color := Color.LightGray; + + var hx := 1.0; + var xx := hx; + while xxa do + begin + var x0 := fso.RealToScreenX(xx); + Line(x0,y1,x0,y2); + xx -= hx + end; + + var hy := 1.0; + var yy := hy; + while yymin do + begin + var y0 := fso.RealToScreenY(yy); + Line(x1,y0,x2,y0); + yy -= hy + end; + + // Оси + Pen.Color := Color.Blue; + + var x0 := fso.RealToScreenX(0); + var y0 := fso.RealToScreenY(0); + + Line(x0,y1,x0,y2); + Line(x1,y0,x2,y0);} + + // График + + Pen.Color := Color.Black; var n := (x2-x1) div 3; - var fso := new FS((x2-x1)/(b-a),(y2-y1)/(max-min),a,max,x1,y1,f); - Polyline(Range(a,b,n).Select(fso.Apply).ToArray) + Polyline(Range(a,b,n).Select(fso.Apply).ToArray); +end; + +procedure Draw(f: real -> real; a,b,min,max: real; r: System.Drawing.Rectangle); +var x1 := r.X; y1 := r.Y; + x2 := r.X+r.Width-1; + y2 := r.Y+r.Height-1; +begin + Draw(f,a,b,min,max,x1,y1,x2,y2); +end; + +procedure Draw(f: real -> real; a,b,min,max: real); +begin + Draw(f,a,b,min,max,ClientRectangle); end; procedure Draw(f: real -> real; a,b: real; x1,y1,x2,y2: integer); begin - Rectangle(x1,y1,x2+1,y2+1); var n := (x2-x1) div 3; - var min := Range(a,b,n).Min(f); - var max := Range(a,b,n).Max(f); - var fso := new FS((x2-x1)/(b-a),(y2-y1)/(max-min),a,max,x1,y1,f); - Polyline(Range(a,b,n).Select(fso.Apply).ToArray) + Draw(f,a,b,Range(a,b,n).Min(f),Range(a,b,n).Max(f),x1,y1,x2,y2) end; procedure Draw(f: real -> real; a,b: real; r: System.Drawing.Rectangle); diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index 3659c6c34..5b209cd0f 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -1155,11 +1155,11 @@ function Power(x, y: integer): real; function Power(x: BigInteger; y: integer): BigInteger; /// Возвращает x, округленное до ближайшего целого function Round(x: real): integer; -/// Возвращает x, округленное до ближайшего большого целого +/// Возвращает x, округленное до ближайшего длинного целого function RoundBigInteger(x: real): BigInteger; /// Возвращает целую часть вещественного числа x function Trunc(x: real): integer; -/// Возвращает целую часть вещественного числа x как BigInteger +/// Возвращает целую часть вещественного числа x как длинное целое function TruncBigInteger(x: real): BigInteger; /// Возвращает целую часть числа x function Int(x: real): real; @@ -6109,6 +6109,23 @@ begin Result := Math.Sqrt(x); end; +/// Возвращает квадратный корень числа +function Sqrt(Self: real): real; extensionmethod; +begin + Result := Sqrt(Self); +end; + +/// Возвращает квадратный корень числа +function Sqrt(Self: integer): real; extensionmethod; +begin + Result := Sqrt(Self); +end; + +function Sqrt(Self: BigInteger): real; extensionmethod; +begin + Result := Sqrt(real(Self)); +end; + function Sqr(x: integer): int64; begin Result := x * x; @@ -6159,21 +6176,45 @@ begin Result := Convert.ToInt32(Math.Round(x)); end; +/// Возвращает число, округленное до ближайшего целого +function Round(Self: real): integer; extensionmethod; +begin + Result := Round(Self); +end; + function RoundBigInteger(x: real): BigInteger; begin Result := BigInteger.Create(Math.Round(x)); end; +/// Возвращает число, округленное до ближайшего длинного целого +function RoundBigInteger(Self: real): BigInteger; extensionmethod; +begin + Result := RoundBigInteger(Self); +end; + function Trunc(x: real): integer; begin Result := Convert.ToInt32(Math.Truncate(x)); end; +/// Возвращает целую часть вещественного числа +function Trunc(Self: real): integer; extensionmethod; +begin + Result := Trunc(Self); +end; + function TruncBigInteger(x: real): BigInteger; begin Result := BigInteger.Create(Math.Truncate(x)); end; +/// Возвращает целую часть вещественного числа как длинное целое +function TruncBigInteger(Self: real): BigInteger; extensionmethod; +begin + Result := TruncBigInteger(Self); +end; + function Int(x: real): real; begin //if x>=0 then diff --git a/bin/Lib/ClientServer.pas b/bin/Lib/ClientServer.pas new file mode 100644 index 000000000..c99cd5e11 --- /dev/null +++ b/bin/Lib/ClientServer.pas @@ -0,0 +1,48 @@ +unit ClientServer; + +uses System.Net, System.Net.Sockets, System.IO; + +var + hostname := '127.0.0.1'; + port := 13000; + +procedure RunServer(OnProcessCommand: string ->()); +begin + var server := new TcpListener(IPAddress.Any, 13000); + server.Start(); + + while (true) do + begin + var client := server.AcceptTcpClient(); + + var stream := client.GetStream(); + + var br := new BinaryReader(stream); + var data := br.ReadString(); + + if OnProcessCommand<>nil then + begin + OnProcessCommand(data); + end; + br.Close(); + + stream.Close(); + client.Close(); + end; +end; + +procedure SendCommand(s: string); +begin + var client := new TcpClient(hostname,port); + var stream := client.GetStream(); + + var bw := new BinaryWriter(stream); + bw.Write(s); + bw.Close(); + + stream.Close(); + client.Close(); +end; + +begin +end. \ No newline at end of file diff --git a/bin/Lib/GraphABC.pas b/bin/Lib/GraphABC.pas index fad51782a..1938d3491 100644 --- a/bin/Lib/GraphABC.pas +++ b/bin/Lib/GraphABC.pas @@ -3494,21 +3494,80 @@ begin end; type FS = auto class - mx,my,a,max: real; - x0,y0: integer; + mx,my,a,min,max: real; + x1,y1: integer; f: real -> real; function Apply(x: real): Point; begin - Result := Pnt(x0+Round(mx*(x-a)),y0+Round(my*(max-f(x)))); + Result := Pnt(x1+Round(mx*(x-a)),y1+Round(my*(max-f(x)))); end; + + function RealToScreenX(x: real): integer := Round(x1 + mx * (x-a)); + + function RealToScreenY(y: real): integer := Round(y1 - my * (y+min)); end; procedure Draw(f: real -> real; a,b,min,max: real; x1,y1,x2,y2: integer); begin + var coefx := (x2-x1)/(b-a); + var coefy := (y2-y1)/(max-min); + + Pen.Color := Color.Black; Rectangle(x1,y1,x2+1,y2+1); + + var fso := new FS(coefx,coefy,a,min,max,x1,y1,f); + + // Линии + {Pen.Color := Color.LightGray; + + var hx := 1.0; + var xx := hx; + while xxa do + begin + var x0 := fso.RealToScreenX(xx); + Line(x0,y1,x0,y2); + xx -= hx + end; + + var hy := 1.0; + var yy := hy; + while yymin do + begin + var y0 := fso.RealToScreenY(yy); + Line(x1,y0,x2,y0); + yy -= hy + end; + + // Оси + Pen.Color := Color.Blue; + + var x0 := fso.RealToScreenX(0); + var y0 := fso.RealToScreenY(0); + + Line(x0,y1,x0,y2); + Line(x1,y0,x2,y0);} + + // График + + Pen.Color := Color.Black; var n := (x2-x1) div 3; - var fso := new FS((x2-x1)/(b-a),(y2-y1)/(max-min),a,max,x1,y1,f); Polyline(Range(a,b,n).Select(fso.Apply).ToArray); end; diff --git a/bin/Lib/PABCRtl.dll b/bin/Lib/PABCRtl.dll index 8b8ef5a30..edcd6e518 100644 Binary files a/bin/Lib/PABCRtl.dll and b/bin/Lib/PABCRtl.dll differ diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index 3659c6c34..5b209cd0f 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -1155,11 +1155,11 @@ function Power(x, y: integer): real; function Power(x: BigInteger; y: integer): BigInteger; /// Возвращает x, округленное до ближайшего целого function Round(x: real): integer; -/// Возвращает x, округленное до ближайшего большого целого +/// Возвращает x, округленное до ближайшего длинного целого function RoundBigInteger(x: real): BigInteger; /// Возвращает целую часть вещественного числа x function Trunc(x: real): integer; -/// Возвращает целую часть вещественного числа x как BigInteger +/// Возвращает целую часть вещественного числа x как длинное целое function TruncBigInteger(x: real): BigInteger; /// Возвращает целую часть числа x function Int(x: real): real; @@ -6109,6 +6109,23 @@ begin Result := Math.Sqrt(x); end; +/// Возвращает квадратный корень числа +function Sqrt(Self: real): real; extensionmethod; +begin + Result := Sqrt(Self); +end; + +/// Возвращает квадратный корень числа +function Sqrt(Self: integer): real; extensionmethod; +begin + Result := Sqrt(Self); +end; + +function Sqrt(Self: BigInteger): real; extensionmethod; +begin + Result := Sqrt(real(Self)); +end; + function Sqr(x: integer): int64; begin Result := x * x; @@ -6159,21 +6176,45 @@ begin Result := Convert.ToInt32(Math.Round(x)); end; +/// Возвращает число, округленное до ближайшего целого +function Round(Self: real): integer; extensionmethod; +begin + Result := Round(Self); +end; + function RoundBigInteger(x: real): BigInteger; begin Result := BigInteger.Create(Math.Round(x)); end; +/// Возвращает число, округленное до ближайшего длинного целого +function RoundBigInteger(Self: real): BigInteger; extensionmethod; +begin + Result := RoundBigInteger(Self); +end; + function Trunc(x: real): integer; begin Result := Convert.ToInt32(Math.Truncate(x)); end; +/// Возвращает целую часть вещественного числа +function Trunc(Self: real): integer; extensionmethod; +begin + Result := Trunc(Self); +end; + function TruncBigInteger(x: real): BigInteger; begin Result := BigInteger.Create(Math.Truncate(x)); end; +/// Возвращает целую часть вещественного числа как длинное целое +function TruncBigInteger(Self: real): BigInteger; extensionmethod; +begin + Result := TruncBigInteger(Self); +end; + function Int(x: real): real; begin //if x>=0 then