В Coords - DrawArc и SeoMouseDown ... для основных обработчиков для независимости от GraphWPF

Вернул пока назад CharAnsi
This commit is contained in:
Mikhalkovich Stanislav 2025-10-15 12:36:43 +03:00
parent db0f880b5d
commit 0e066aac48
4 changed files with 111 additions and 2 deletions

View file

@ -9,8 +9,8 @@ begin
c := Chr(i); c := Chr(i);
Println($'Символ с кодом {i} в кодировке Unicode - это {c}'); Println($'Символ с кодом {i} в кодировке Unicode - это {c}');
Println; Println;
i := OrdAnsi(c); i := OrdWindows(c);
Println($'Код символа {c} в кодировке Windows равен {i}'); Println($'Код символа {c} в кодировке Windows равен {i}');
c := ChrAnsi(i); c := ChrWindows(i);
Println($'Символ с кодом {i} в кодировке Windows - это {c}'); Println($'Символ с кодом {i} в кодировке Windows - это {c}');
end. end.

View file

@ -0,0 +1,15 @@
// Использование DrawArc и ATan2 (3.11.1)
uses Coords;
begin
SetMouseDown((x,y,mb) -> begin
if mb <> 2 then exit;
var xr := ScreenToRealX(x);
var yr := ScreenToRealY(y);
DrawCircle(xr,yr,0.1,Colors.Red);
DrawLine(0,0,xr,yr);
var angle := RadToDeg(ATan2(yr,xr));
DrawArc(0,0,2,0,angle);
Println(angle);
end);
end.

View file

@ -310,6 +310,45 @@ begin
dc.DrawEllipse(cb,cp,p,r,r); dc.DrawEllipse(cb,cp,p,r,r);
end; end;
procedure ArcPlay(dc: DrawingContext; x,y,r,startAngle,endAngle: real; c: Color);
begin
var cp := ColorPen(c,CurrentPenWidth);
var center := fso.RealToScreen(Pnt(x,y));
r := r * Scale;
var geometry := new System.Windows.Media.StreamGeometry();
var context := geometry.Open();
var startAngleRad := startAngle * PI / 180;
var endAngleRad := endAngle * PI / 180;
var startPoint := new Point(
center.X + r * Cos(startAngleRad),
center.Y - r * Sin(startAngleRad)
);
var endPoint := new Point(
center.X + r * Cos(endAngleRad),
center.Y - r * Sin(endAngleRad)
);
context.BeginFigure(startPoint, false, false);
var cw := endAngle - startAngle < 0;
var dir := System.Windows.Media.SweepDirection.Counterclockwise;
if cw then
dir := System.Windows.Media.SweepDirection.Clockwise;
context.ArcTo(endPoint,
new System.Windows.Size(r, r),
0,
False,
dir,
true,
false
);
context.Close;
dc.DrawGeometry(nil, cp, geometry);
end;
procedure RectanglePlay(dc: DrawingContext; x,y,w,h: real; c: Color; borderc: Color); procedure RectanglePlay(dc: DrawingContext; x,y,w,h: real; c: Color; borderc: Color);
begin begin
var cb := ColorBrush(c); var cb := ColorBrush(c);
@ -404,6 +443,12 @@ type
public public
procedure Play(dc: DrawingContext); override := LinePlay(dc,x,y,x1,y1,c,width); procedure Play(dc: DrawingContext); override := LinePlay(dc,x,y,x1,y1,c,width);
end; end;
ArcC = auto class(Command)
x,y,radius,startAngle,endAngle: real;
c: Color;
public
procedure Play(dc: DrawingContext); override := ArcPlay(dc,x,y,radius,startAngle,endAngle,c);
end;
TextC = auto class(Command) TextC = auto class(Command)
x,y: real; x,y: real;
text: string; text: string;
@ -533,6 +578,11 @@ begin
DrawPoints(points,PointRadius); DrawPoints(points,PointRadius);
end; end;
/// Рисует дугу
procedure DrawArc(x,y,r,startAngle,endAngle: real; Color: GColor := Colors.Black)
:= ArcC.Create(x,y,r,startAngle,endAngle,Color).AddToListAndPlay;
/// Расстояние между точками /// Расстояние между точками
function Distance(p1,p2: Point): real := Sqrt((p2.x-p1.x)**2 + (p2.y-p1.y)**2); function Distance(p1,p2: Point): real := Sqrt((p2.x-p1.x)**2 + (p2.y-p1.y)**2);
/// Расстояние между точками /// Расстояние между точками
@ -671,6 +721,39 @@ type
AfterResize := True; AfterResize := True;
end; end;
end; end;
procedure SetMouseDown(handler: (real,real,integer) -> ());
begin
OnMouseDown += handler;
end;
procedure SetMouseUp(handler: (real,real,integer) -> ());
begin
OnMouseUp += handler;
end;
procedure SetMouseMove(handler: (real,real,integer) -> ());
begin
OnMouseMove += handler;
end;
procedure SetKeyPress(handler: char -> ());
begin
OnKeyPress += handler;
end;
procedure SetKeyDown(handler: Key -> ());
begin
OnKeyDown += handler;
end;
function RealToScreenX(xx: real) := fso.RealToScreenX(xx);
function RealToScreenY(yy: real) := fso.RealToScreenY(yy);
function ScreenToRealX(xx: real) := fso.ScreenToRealX(xx);
function ScreenToRealY(yy: real) := fso.ScreenToRealY(yy);
function ScreenToReal(p: Point): Point := fso.ScreenToReal(p);
function RealToScreen(p: Point): Point := fso.RealToScreen(p);
initialization initialization
InitCoordGrid; InitCoordGrid;

View file

@ -2123,6 +2123,12 @@ function Succ(x: char): char;
function ChrWindows(a: byte): char; function ChrWindows(a: byte): char;
/// Преобразует символ в код в кодировке Windows /// Преобразует символ в код в кодировке Windows
function OrdWindows(a: char): byte; function OrdWindows(a: char): byte;
/// Преобразует код в символ в кодировке Windows. Устарело. Используйте ChrWindows
function ChrAnsi(a: byte): char;
/// Преобразует символ в код в кодировке Windows. Устарело. Используйте OrdWindows
function OrdAnsi(a: char): byte;
/// Преобразует код в символ в кодировке Unicode /// Преобразует код в символ в кодировке Unicode
function Chr(a: word): char; function Chr(a: word): char;
/// Преобразует символ в код в кодировке Unicode /// Преобразует символ в код в кодировке Unicode
@ -9960,6 +9966,11 @@ begin
end; end;
end; end;
function ChrAnsi(a: byte): char := ChrWindows(a);
function OrdAnsi(a: char): byte := OrdWindows(a);
function Ord(a: integer): integer; function Ord(a: integer): integer;
begin begin
Result := a; Result := a;