Новый модуль ClientServer и изменения в модулях PABCSystem, GraphABC. Новый пример FuncTransform.pas
This commit is contained in:
parent
1208540730
commit
a815942bc5
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%MINOR%=0
|
||||
%REVISION%=1132
|
||||
%COREVERSION%=0
|
||||
%REVISION%=1133
|
||||
%MINOR%=0
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.0.0.1132'
|
||||
!define VERSION '3.0.0.1133'
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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 xx<b do
|
||||
begin
|
||||
var x0 := fso.RealToScreenX(xx);
|
||||
Line(x0,y1,x0,y2);
|
||||
xx += hx
|
||||
end;
|
||||
|
||||
xx := -hx;
|
||||
while xx>a do
|
||||
begin
|
||||
var x0 := fso.RealToScreenX(xx);
|
||||
Line(x0,y1,x0,y2);
|
||||
xx -= hx
|
||||
end;
|
||||
|
||||
var hy := 1.0;
|
||||
var yy := hy;
|
||||
while yy<max do
|
||||
begin
|
||||
var y0 := fso.RealToScreenY(yy);
|
||||
Line(x1,y0,x2,y0);
|
||||
yy += hy
|
||||
end;
|
||||
|
||||
yy := -hy;
|
||||
while yy>min 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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
48
bin/Lib/ClientServer.pas
Normal file
48
bin/Lib/ClientServer.pas
Normal file
|
|
@ -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.
|
||||
|
|
@ -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 xx<b do
|
||||
begin
|
||||
var x0 := fso.RealToScreenX(xx);
|
||||
Line(x0,y1,x0,y2);
|
||||
xx += hx
|
||||
end;
|
||||
|
||||
xx := -hx;
|
||||
while xx>a do
|
||||
begin
|
||||
var x0 := fso.RealToScreenX(xx);
|
||||
Line(x0,y1,x0,y2);
|
||||
xx -= hx
|
||||
end;
|
||||
|
||||
var hy := 1.0;
|
||||
var yy := hy;
|
||||
while yy<max do
|
||||
begin
|
||||
var y0 := fso.RealToScreenY(yy);
|
||||
Line(x1,y0,x2,y0);
|
||||
yy += hy
|
||||
end;
|
||||
|
||||
yy := -hy;
|
||||
while yy>min 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;
|
||||
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue