Новый модуль ClientServer и изменения в модулях PABCSystem, GraphABC. Новый пример FuncTransform.pas

This commit is contained in:
miks1965 2016-01-05 13:10:24 +03:00
parent 1208540730
commit a815942bc5
12 changed files with 291 additions and 24 deletions

View file

@ -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;

View file

@ -1,4 +1,4 @@
%MINOR%=0
%REVISION%=1132
%COREVERSION%=0
%REVISION%=1133
%MINOR%=0
%MAJOR%=3

View file

@ -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;

View file

@ -1 +1 @@
!define VERSION '3.0.0.1132'
!define VERSION '3.0.0.1133'

View file

@ -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));

View file

@ -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"

View file

@ -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);

View file

@ -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
View 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.

View file

@ -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.

View file

@ -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