添加绘图扩展库

This commit is contained in:
2025-02-12 17:45:12 +08:00
parent 314869d09c
commit a0717b7cd3
21 changed files with 2851 additions and 213 deletions
+59 -6
View File
@@ -7,7 +7,8 @@ Interface
概览:
天软科技
20171215 添加注释
20240308 整理代码
20240308 整理代码
20250211 user类型支持数组 "user[n]"
*)
(**
@example(范例--内存管理--1)
@@ -174,6 +175,7 @@ type ctslctrans = class(tmemoryclass)
_nomalloc;
_ptr;//对象地址
_objs;//子对象
_objstartsubs;//
_objstart;//起始位置
_objsize;//字节长度
_objst;//类型
@@ -448,7 +450,7 @@ type ctslctrans = class(tmemoryclass)
raise "内存管理对象构造错误!";
return;
end
_objsize := _objstart := _objss := _objst := _objs := array();
_objstartsubs := _objsize := _objstart := _objss := _objst := _objs := array();
ldata := length(data)-1;
_size := data[ldata,3]+data[ldata,4]-data[0,3];
Fstrcdata := data;
@@ -481,6 +483,17 @@ type ctslctrans = class(tmemoryclass)
_objs[v0]:= new ctslctrans(v2,tptr,nil);
end
end else
if v1="userarray2" then
begin
v0s := array();
v22 := modyv(v2,v3);
for ii,vii in v["pos"] do
begin
_objstartsubs[i,ii] := vii;
v0s[ii] := new ctslctrans(v22,ptr+vii,ifset);
end
_objs[v0]:= v0s;
end else
if v1="userarray" then
begin
_objs[v0]:= new ctslctrans(modyv(v2,v3),ptr+v3,ifset);//+v3
@@ -517,6 +530,17 @@ type ctslctrans = class(tmemoryclass)
_objs[v0]:= no;
_tool.writeptr(_ptr+v3,no._ptr);
end else
if v1="userarray2" then
begin
v0s := array();
v22 := modyv(v2,v3);
for ii,vii in v["pos"] do
begin
_objstartsubs[v0,ii] := vii;
v0s[ii] := new ctslctrans(v22,_ptr+vii,true);
end
_objs[v0]:= v0s;
end else
if v1="userarray" then
begin
no := new ctslctrans(modyv(v2,v3),_ptr+v3,true);//+v3;
@@ -570,6 +594,16 @@ type ctslctrans = class(tmemoryclass)
o := _objs[i];
o._setcptr_(tptr);
end else
if v="userarray2" then
begin
for ii,vii in _objstartsubs[i] do
begin
tptr := ptr+vii;
o := _objs[i,ii];
o._setcptr_(tptr);
end
end else
if v="userarray" then
begin
tptr := ptr+v3;
@@ -727,11 +761,18 @@ type ctslctrans = class(tmemoryclass)
ret := array();
for i,v in _objs do
begin
if ifarray(v) then
begin
for j,vj in v do
begin
ret[i,j] := vj._getdata_();
end
end else
if v is class(ctslctrans)then
begin
ret[i]:= v._getdata_();
end else
ret[i]:= _getvalue_(i);
ret[i]:= _getvalue_(i);
end
return ret;
end
@@ -2257,13 +2298,25 @@ begin
end else
if(tp1="user")then
begin
ret[i,5]:= "userarray";
size := 1;
ret[i,5]:= "userarray";
sz := 0;
dp1 := min(alim,tpbyte);
dp1 := min(alim,tpbyte);
npoint := ceil(npoint/dp1)* dp1;
ret1 := tslarraytocstructcalc(v,alim,npoint,sz);
ret[i,2]:= ret1;
if size>1 then
begin
ret[i,5]:= "userarray2";
npointi := npoint;
ret[i,"pos",0] :=npointi ;
for ii:=2 to size do
begin
npointi := ceil((npointi+sz)/dp1)* dp1;
ret[i,"pos",ii-1] :=npointi ;
end
sz := npointi-npoint+sz;
end else
size := 1;
end else
begin
raise ("类型错误:" $ tp1);
+9 -10
View File
@@ -19,16 +19,16 @@ type t_children_sizer = class()
flayout := 0;
fhorizontalspacing := 10;
fverticalspacing := 10;
ftopbottomspacing := 5;
fleftrightspacing := 20;
ftopbottomspacing := 10;
fleftrightspacing := 10;
fautosizing := 0;
end
function AdjustSize(); //调整
begin
if flayout=0 then return ;
if fautosizing then return ;
fautosizing := true;
if not fowner then return ;
fautosizing := true;
faownercls := fowner.ClientRect;
dolayoutctls(w,h);
if fowner.autosize then
@@ -45,7 +45,7 @@ type t_children_sizer = class()
if p and p.autosize then p.AdjustSize();//处理传到
fautosizing := false;
end
function getsizerinfo();
function getsizerinfo(); //获取信息
begin
r := array();
r["layout"] := flayout;
@@ -56,7 +56,7 @@ type t_children_sizer = class()
r["leftrightspacing"] := fleftrightspacing;
return r;
end
function setsizerinfo(v);
function setsizerinfo(v);//设置信息
begin
if not(ifarray(v) and v) then return ;
flg := false;
@@ -81,7 +81,7 @@ type t_children_sizer = class()
end
"horizontalspacing":
begin
if vi<>fhorizontalspacing and vi>0 then
if vi<>fhorizontalspacing and vi>=0 then
begin
fhorizontalspacing := vi;
flg := true;
@@ -89,7 +89,7 @@ type t_children_sizer = class()
end
"verticalspacing":
begin
if vi<>fverticalspacing and vi>0 then
if vi<>fverticalspacing and vi>=0 then
begin
fverticalspacing := vi;
flg := true;
@@ -97,7 +97,7 @@ type t_children_sizer = class()
end
"topbottomspacing":
begin
if vi<>ftopbottomspacing and vi>0 then
if vi<>ftopbottomspacing and vi>=0 then
begin
ftopbottomspacing := vi;
flg := true;
@@ -105,7 +105,7 @@ type t_children_sizer = class()
end
"leftrightspacing":
begin
if vi<>fleftrightspacing and vi>0 then
if vi<>fleftrightspacing and vi>=0 then
begin
fleftrightspacing := vi;
flg := true;
@@ -259,7 +259,6 @@ type t_children_sizer = class()
end
end
end
function setcontrolsperline(v);
begin
nv := integer(v);
+10
View File
@@ -342,6 +342,16 @@ public //
AOwner.InsertComponent(Self);
end
end
function set_loadstate(v); //设置loading状态
begin
if v then
begin
includestate(FComponentState,csLoading);
end else
begin
excludestate(FComponentState,csLoading);
end
end
function RootOwner(); //获得域根节点
begin
if fasdomain then return self(true);
+38 -14
View File
@@ -48,6 +48,7 @@ type tcontrol = class(tcomponent)
FOnDblClick; //双击
FOnDragDrop;
FOnDragOver;
fonGetPreferredSize;
FOnSize;
FOnMove;
//FOnEditingDone;
@@ -564,7 +565,7 @@ type tcontrol = class(tcomponent)
begin
nft.changedkeys((fts .<> ftc));
wkactl.FontChanged();
end
end
ifop := true;
end
end
@@ -1016,8 +1017,8 @@ type tcontrol = class(tcomponent)
if (o is class(TWinControl)) and o.WsPopUp then return ;
if (Align=alNone) then
begin
//p := Parent ;
//if p and p.childsizing.layout>0 then return p.AdjustSize();
p := Parent ;
if p and p.childsizing.layout>0 then return p.AdjustSize();
AdjustSize();
end
end
@@ -1029,8 +1030,8 @@ type tcontrol = class(tcomponent)
if not NoRecycled() then return ;
CallMessgeFunction(OnSize,o,e);
DoWMSIZE(o,e);
//p := Parent ;
//if p and p.childsizing.layout>0 then return p.AdjustSize();
p := Parent ;
if p and p.childsizing.layout>0 then return p.AdjustSize();
AdjustSize();
end
function CMCursorChanged(o,e):CM_CURSORCHANGED;virtual;
@@ -1484,7 +1485,9 @@ type tcontrol = class(tcomponent)
public
procedure AdjustSize();virtual; // smart calling DoAutoSize
begin
//includestate(FControlFlags,cfAutoSizeNeeded);
//includestate(FControlFlags,cfAutoSizeNeeded);
if csLoading in ComponentState then return ;
If csDestroying in Componentstate Then return ;
if fautosizing then
begin
return ;
@@ -1493,7 +1496,7 @@ type tcontrol = class(tcomponent)
sf := self(true);
if (sf is class(TWinControl)) and sf.WsPopUp then return ;
if Parent then
begin
begin
if Parent.autosize then Parent.AdjustSize();
else if Align<>alNone then Parent.DoControlAlign();
end
@@ -1503,13 +1506,33 @@ type tcontrol = class(tcomponent)
function GetPreferredSize(w,h);virtual;
begin
ft := Font;
if ft then
begin
c := caption;
w := ft.Width*(length(c)+2);
h := ft.Height+3;
end
end
if not ft then return ;
if fonGetPreferredSize then
begin
e := new tmmeasuresize();
CallMessgeFunction(fonGetPreferredSize,self(true),e);
if e.width>=0 and e.Height>=0 then
begin
w := e.Width;
h := e.Height;
end else
begin
try
info := fonGetPreferredSize.functioninfo();
fn := info["functionname"];
if ifstring(info["classname"]) then fn := info["classname"] $ "." $ fn;
fn := "onGetPreferredSize call: "$fn $" err!";
except
fn := "onGetPreferredSize is not function";
end ;
raise fn;
end
return ;
end
c := caption;
w := ft.Width*(length(c)+2);
h := ft.Height+4;
end
protected
function set_Preferre_size();
begin
@@ -1562,6 +1585,7 @@ type tcontrol = class(tcomponent)
**}
//property MouseEntered read FMouseEntered;
property OnSize:eventhandler read FOnSize write FOnSize;
property ongetpreferredsize:eventhandler read fonGetPreferredSize write fonGetPreferredSize;
property OnMove:eventhandler read FOnMove write FOnMove;
property OnMouseMove:eventhandler read FOnMouseMove Write FOnMouseMove;
property OnPopupMenu:eventhandler read FOnPopupMenu write FOnPopupMenu;
+7 -5
View File
@@ -83,12 +83,14 @@ type tgraphiccontrol = class(TControl)
function GetPreferredSize(w,h);override;
begin
ft := Font;
if ft then
begin
c := caption;
w := ft.Width*(max(length(c),1))+2;
h := ft.Height+3;
if not ft then return ;
if ongetpreferredsize then
begin
return inherited;
end
c := caption;
w := ft.Width*(max(length(c),1))+2;
h := ft.Height+3;
end
function InvalidateRect(rec,f);
begin
+23 -3
View File
@@ -6112,7 +6112,7 @@ type Ttfm2Component = class(TTmfParser)
return findclass(nn);
end
end
function SetTfmData(owner,obj,data,lazydata);
function SetTfmData(owner,obj,data,lazydata,outobjs);
begin
u1 := obj.GetPublishproperties();
u2 := obj.GetPublishEvents();
@@ -6157,6 +6157,11 @@ type Ttfm2Component = class(TTmfParser)
if cobj then
begin
nobj := createobject(cobj,owner);
if nobj is class(tcontrol) then
begin
outobjs[length(outobjs)] := nobj;
nobj.set_loadstate(true);
end
try
if(nobj is class(TToolBar))then
begin
@@ -6173,7 +6178,8 @@ type Ttfm2Component = class(TTmfParser)
invoke(owner,n,1,nobj);
except
end;
call(thisfunction,owner,nobj,v,lazydata);
call(thisfunction,owner,nobj,v,lazydata,outobjs);
end
end
end
@@ -6189,7 +6195,8 @@ type Ttfm2Component = class(TTmfParser)
lazydata := array();
//lazydata[0] := array();
darray := gettree2();
SetTfmData(owner,owner,darray,lazydata);
outobjs := array();
SetTfmData(owner,owner,darray,lazydata,outobjs);
for i,v in lazydata do
begin
try
@@ -6198,6 +6205,19 @@ type Ttfm2Component = class(TTmfParser)
except
end;
end
needadjust := array();
for i,v in outobjs do
begin
v.set_loadstate(false);
if (v is class(TWinControl)) then
begin
if v.ControlCount<1 then needadjust[length(needadjust)] := v;
end else needadjust[length(needadjust)] := v;
end
for i,v in needadjust do
begin
v.AdjustSize();
end
end
end
function LoadFromTfm(owner);
+18 -2
View File
@@ -2587,7 +2587,11 @@ type TWinControl = class(tcontrol)
inherited;
end;
function AdjustSize();override;
begin
begin
If csDestroying in Componentstate Then
begin
return ;
end
if autosizing then
begin
return ;
@@ -2596,7 +2600,11 @@ type TWinControl = class(tcontrol)
if IsUpDating() then
begin
return ;
end
end
If csLoading in Componentstate Then
begin
return ;
end
cs := fchildsizing;
if cs and cs.layout>0 then return cs.AdjustSize();
if autosize then
@@ -2627,10 +2635,17 @@ type TWinControl = class(tcontrol)
end
function GetPreferredSize(w,h);override;
begin
if ongetpreferredsize then return inherited;
brec := BoundsRect;
crec := ClientRect;
dw := (brec[2]-brec[0])-(crec[2]-crec[0]);
dh := (brec[3]-brec[1])-(crec[3]-crec[1]);
cs := fchildsizing;
if autosize and cs.layout>0 then
begin
dh += cs.topbottomspacing;
dw += cs.leftrightspacing;
end
cts := Controls;
w := 0;
h := 0;
@@ -2675,6 +2690,7 @@ type TWinControl = class(tcontrol)
h := max(h,ah);
w+=dw;
h+=dh;
end
procedure DoControlAlign({rect});override;
begin
+1
View File
@@ -177,6 +177,7 @@ type tcustomcoolbar=class(tcustomcontrol)
end
function AdjustSize();override;
begin
if csLoading in ComponentState then return ;
inherited;
doControlALign();
InvalidateRect(nil,false);
+9
View File
@@ -68,6 +68,15 @@ type TMMENUSELECT=class(tuieventbase)
@param(flags)(integer) 状态 %%
**}
end
type tmmeasuresize = class(tuieventbase)
function create();override;
begin
width := -1;
height := -1;
end
width;
height;
end
type TMKEY=class(tuieventbase)
{**
@param(说明) 按键消息
+63 -43
View File
@@ -526,12 +526,16 @@ type tcustombtn = class(TCustomControl) //
begin
dc.font.color := bc;
end
end
end
end
function GetPreferredSize(w,h);override;
begin
class(tcontrol).GetPreferredSize(w,h);
if ongetpreferredsize then return ;
bs := BoundsRect;
cs := ClientRect;
dh := (bs[3]-bs[1])-(cs[3]-cs[1])+2;
h+=dh;
end
function FontChanged(o);override; //字体改变
begin
@@ -569,9 +573,7 @@ type tcustombtn = class(TCustomControl) //
bs := caption;
inherited;
if bs = caption then return ;
//if autosize then return set_Preferre_size();
if NoRecycled() then AdjustSize();
//InvalidateRect(nil,false);
end
function PaintMouseDown();virtual; //按下绘制
begin
@@ -2282,10 +2284,13 @@ type tVirtualCalender=class(TSLUIBASE)
if FHost then
begin
ft := FHost.Font;
FCellWidth := ft.Width*3;
FCellHeight := ft.Height+4;
FTodayHeight := FCellHeight;
FMonthselheight := FCellHeight;
if ft then
begin
FCellWidth := ft.Width*3;
FCellHeight := ft.Height+4;
FTodayHeight := FCellHeight;
FMonthselheight := FCellHeight;
end
end
end
function CalcDateMatrx();
@@ -2562,12 +2567,12 @@ type TcustomLabel = class(TGraphicControl)
if ifstring(s)and caption <> s then
begin
inherited;
//if autosize then set_Preferre_size();
if NoRecycled() then AdjustSize();
end
end
function AdjustSize();override;
begin
if csLoading in ComponentState then return ;
if autosizing then return ;
if autosize then
set_Preferre_size();
@@ -2575,11 +2580,9 @@ type TcustomLabel = class(TGraphicControl)
end
function FontChanged(o);override;
begin
if autosize then
set_Preferre_size();
else
InvalidateRect(nil,false);
end
inherited;
return InvalidateRect(nil,false);
end
function paint();override;
begin
dc := canvas;
@@ -2763,9 +2766,14 @@ type tcustomedit=class(TCustomControl)
end
function GetPreferredSize(w,h);override;
begin
w := Width;
ft := Font;
h := ft.Height+5;
if not ft then return ;
if ongetpreferredsize then
begin
return class(tcontrol).GetPreferredSize(w,h);
end
w := Width;
h := ft.Height+5;
end
function ContextMenu(o,e);override;
begin
@@ -3088,13 +3096,11 @@ type tthreeEntry=class(TCustomControl)
function GetPreferredSize(w,h);override;
begin
ft := font;
if ft then
begin
fth := ft.Height;
ftw := ft.Width;
w := ftw*11+fth;
h := fth+4;
end
if not ft then return ;
fth := ft.Height;
ftw := ft.Width;
w := ftw*11+fth;
h := fth+4;
end
function paint();override;
begin
@@ -3120,6 +3126,7 @@ type tthreeEntry=class(TCustomControl)
end
function AdjustSize();override;
begin
if csLoading in ComponentState then return ;
if autosizing then return ;
if not HandleAllocated() then return ;
calcCtls();
@@ -3556,6 +3563,7 @@ type TCustomListBoxbase=class(TCustomScrollControl)
end
function AdjustSize();override;
begin
if csLoading in ComponentState then return ;
if not HandleAllocated() then return ;
UpDateScrollBar();
class(TWinControl).AdjustSize();
@@ -4401,6 +4409,11 @@ type TCustomComboBoxbase=class(TCustomControl)
function GetPreferredSize(w,h);override;
begin
class(tcontrol).GetPreferredSize(w,h);
if onGetPreferredSize then return ;
bs := BoundsRect;
cs := ClientRect;
dh := (bs[3]-bs[1])-(cs[3]-cs[1])+2;
h+=dh;
w := Width;
end
function Paint();override;
@@ -5217,6 +5230,7 @@ type TcustomToolBar=class(TCustomControl)
begin
ft := Font;
if not ft then return ;
if ongetpreferredsize then return class(tcontrol).GetPreferredSize(w,h);
ftw := ft.Width;
fth := ft.Height;
brec := BoundsRect;
@@ -5258,8 +5272,6 @@ type TcustomToolBar=class(TCustomControl)
h := fth+2+dh;
end
end;
return ;
end else
begin
imglst := ImageList; //图标
@@ -5291,7 +5303,6 @@ type TcustomToolBar=class(TCustomControl)
w+=dw;
h+=dh;
return ;
end
end
function MouseDown(o,e);override;
@@ -6075,6 +6086,11 @@ type TcustomStatusBar=class(TCustomControl)
function GetPreferredSize(w,h);override;
begin
class(tcontrol).GetPreferredSize(w,h);
if ongetpreferredsize then return ;
bs := BoundsRect;
cs := ClientRect;
dh := (bs[3]-bs[1])-(cs[3]-cs[1])+2;
h+=dh;
w := Width;
end
published
@@ -6473,6 +6489,11 @@ type TCustomSpinEdit = class(TCustomControl)
function GetPreferredSize(w,h);override;
begin
class(tcontrol).GetPreferredSize(w,h);
if ongetpreferredsize then return ;
bs := BoundsRect;
cs := ClientRect;
dh := (bs[3]-bs[1])-(cs[3]-cs[1]);
h+=dh;
w := Width;
end
function paint();override;
@@ -6566,19 +6587,20 @@ type tcustomgroupbox=class(TCustomControl)
/////////////////////////////////
end
function FontChanged(o);override;
begin
begin
ft := Font;
if ft then
begin
ftwidth := ft.Width;
ftheight := ft.Height;
inherited;
InvalidateRect(nil,false);
end
//doControlALign();
end
function AdjustSize();override;
begin
if csLoading in ComponentState then return ;
if autosizing then return ;
inherited;
doControlALign();
@@ -6985,19 +7007,6 @@ type tcustomipaddr = class(TCustomControl)
FPrev;
FNext;
static UnLocked;
{protected
function filterstring(c);override;
begin
s := text;
if s="0" and c="0" then return "";
s+=c;
if s then
begin
r := StrToIntDef(s,0);
if r<=FRange[1] then return c;
end
return "";
end }
end
public
function Create(AOwner);override;
@@ -7164,10 +7173,21 @@ type tcustomipaddr = class(TCustomControl)
function GetPreferredSize(w,h);override;
begin
ft := Font;
if not ft then return ;
if ongetpreferredsize then
begin
return class(tcontrol).GetPreferredSize(w,h);
end
ftw := ft.Width;
fth := ft.Height;
w := 21*ftw+2;
h := fth+5;
if FHasPort then w := 27*ftw;
else w := 20*ftw;
h := fth;//+3;
bs := BoundsRect;
cs := ClientRect;
dh := (bs[3]-bs[1])-(cs[3]-cs[1])+2;
h+=dh;
w+= (bs[2]-bs[0])-(cs[2]-cs[0])+2 ;
end
function Recycling();override;
begin
+382 -97
View File
@@ -117,7 +117,8 @@ uses utslvclauxiliary;
data array(x,y,z) 相对于坐标系的位置
tg_WinControl:绘图展示窗口对象,管理了一个 tg_figure 对象,在paint消息的时候构造tg_canvas 对象并调用tg_figrue的paint函数实现图形的绘制
其仅仅作为一个案例,用户可以按照其原理构造自己的画布对象,驱动绘制,得到图形
其仅仅作为一个案例,用户可以按照其原理构造自己的画布对象,驱动绘制,得到图形
tg_picture: 图片容器,可以将图片保存为png
消息对象
tg_evt 基类
@@ -145,6 +146,61 @@ uses utslvclauxiliary;
冒泡阶段,从目标对象向上传递到figure对象
}
{
//////////////////保存绘制的图片到png//////////////////////////
uses utvclgraphics;
fg := new tg_picture(800,800);
//////////设置坐标轴属性////////////////////////
axs := new tg_axes();
axs.box := false;
axs.figure := fg;
axs.title.text := "hello pie ";
axs.axises(1).visible:=false;
axs.axises(0).visible:= false;
axs.data_bounds(0) := array(-0.1,2.1);
axs.data_bounds(1) := array(-0.1,2.1);
axs.data_bounds(2) := array(-0.5,0.5);
args := array(
(pi()/4,pi()/3,0x0000ff),
(pi()/3,pi()/2,0x00ff00),
(pi()/2,pi()*3/2,0xff0000),
(pi()*3/2,pi()*9/4,0xff00ff)
);
prominentidx := 0; //凸显的块
prominentrate := 0.1; //凸显的块
for i,v in args do
begin
line := new tg_Polyline();
line.polyline_style := line.tgc_LS_filled;
line.closed := true;
c := (i=2)?1.1:1;
line.graph_data := 1+get_pie_lines(v[0],v[1],i=prominentidx,prominentrate);
line.lineinfo.bkcolor := v[2];
line.parent := axs;
end
fg.save_png(%% D:\test\ppt2.png%%); //保存
function get_pie_lines(arg1,arg2,prominent,prominentrate);
begin
stp := pi()/180;
d := 1;
r := array();
r[0] := array(0,0);
idx := 1;
for i:= arg1+(prominent?stp:0) to arg2-(prominent?stp:0) step stp do
begin
r[idx++] := array(sin(i),cos(i));
end
r[idx] :=array(0,0);
if prominent then
begin
rx := r[integer(idx/2)]*prominentrate;
for i := 0 to idx do
begin
r[i]+=rx;
end
end
return r;
end
//////////////////线图范例//////////////////////////
uses tslvcl,utvclgraphics;
app := initializeapplication();
@@ -441,8 +497,7 @@ type tfm = class(tvcform)
gtx.onhit_at := function(o,d)begin
x := d["cvsx"];
y := d["cvsy"];
rgn := o.ExecuteCommand("text_rgn");
return rgn and point_in_rgn(array(x,y),rgn);
return o.ExecuteCommand("point_in_text",array(x,y));
end
gtx.lineinfo.bkcolor := 0x00ff00;
gtx.parent :=line;
@@ -489,13 +544,9 @@ type tfm = class(tvcform)
line.onhit_at := function(o,d)begin
x := d["cvsx"];
y := d["cvsy"];
for i,v in o.ExecuteCommand("points_in_canvas") do
begin
if abs(v[0]-x)<10 and abs(v[1]-y)<10 then
begin
return true;
end
end
r := o.ExecuteCommand("hit_point",array(x,y));
fhitidx := r;
return r>=0;
end
line.addEventListener("mouse_out",function(e)begin
if e.eventPhase<>2 then return ;
@@ -508,16 +559,14 @@ type tfm = class(tvcform)
e.stoppropagation();
x := e.cvsx;
y := e.cvsy;
for i,v in e.target.ExecuteCommand("points_in_canvas") do
begin
if abs(v[0]-x)<10 and abs(v[1]-y)<10 then
begin
fmovetip.Visible := true;
return fmovetip.data_idx := i;
end
end
if fhitidx>=0 then
begin
fmovetip.Visible := true;
return fmovetip.data_idx := fhitidx;
end else fmovetip.Visible := false;
end,true);
end
fhitidx;
fdragtext;
ftextinitpos;
fmousedownpos;
@@ -526,17 +575,44 @@ type tfm = class(tvcform)
fg;
end
}
function point_in_rgn(p,rgn_); //判断点是否在区域中
function point_in_rgn(p,rgn_,method); //判断点是否在区域中
function graph_paint_lines(cvs,linestyle,xys,closed,ifo); //根据给定点绘制线
function graph_paint_points(mk,cvs,xys); //根据点信息绘制点
function graph_paint_boolen_value(n,v);
function graph_paint_rec_to_points(rec);
type tg_WinControl = class(tcustomcontrol,tg_const) //绘图窗口
function r_2_a(arg);
function a_2_r(arg);
function d2angle(v1,v2);
type tg_picture = class(tcustommemcanvas,tg_figure_container) //绘图对象
uses utslvclgdi;
function create(w,h);
begin
class(tcustommemcanvas).create(w,h);
class(tg_figure_container).create();
frect := array(0,0,w,h);
ffigure.rec_getter := function()begin
return frect;
end
end
function save_png(fn);
begin
paint();
savepng(fn);
end
private
frect;
function paint(); //绘制
begin
brush.color := 0xffffff;
FillRect(frect);
ffigure.paint_pre(self);
end
end
type tg_WinControl = class(tcustomcontrol,tg_figure_container) //绘图窗口
function create(AOwner);
begin
inherited;
ffigure := new tg_figure();
class(tcustomcontrol).create(AOwner);
class(tg_figure_container).create();
fg_timer := new unit(utslvclstdctl).tcustomtimer(self);
fg_timer.Interval := 300;
fg_timer.Ontimer := thisfunction(figure_need_fresh);
@@ -548,19 +624,26 @@ type tg_WinControl = class(tcustomcontrol,tg_const) //
end
function flushfigure();
begin
if not ffigureprepared then return ;
if f_validate_doing then return ;
if not HandleAllocated() then return ;
f_validate_doing := true;
if not HandleAllocated() then return ;
if not ffigureprepared then
begin
return ;
end
if f_validate_doing then
begin
return ;
end
fg_timer.start();
end
function paint();override; //绘制
begin
fg_timer.stop();
fg_timer.stop();
cvs := canvas;
f_validate_doing := true;
ffigureprepared := false;
ffigure.paint_pre(cvs);
ffigureprepared := true;
ffigureprepared := true;
f_validate_doing := false;
end
function DestroyHandle();override;
begin
@@ -619,14 +702,14 @@ type tg_WinControl = class(tcustomcontrol,tg_const) //
ffigure:=nil;
inherited;
end
property figure read ffigure;
private
function figure_need_fresh(o,e); //定时刷新
begin
o.stop();
if not ffigureprepared then return ; //没有准备好
if not ffigureprepared then return ; //没有准备好
if f_validate_doing then return;
InvalidateRect(nil,false);
f_validate_doing := false;
end
function e_2_array(e,tp);
begin
@@ -646,11 +729,19 @@ type tg_WinControl = class(tcustomcontrol,tg_const) //
end
private
fmovecnt;
ffigure;
fg_timer;
f_validate_doing;
ffigureprepared;
end
type tg_figure_container = class(tg_const) //figure的容器
function create();
begin
ffigure := new tg_figure();
end
property figure read ffigure;
protected
ffigure;
end
type tg_figure = class(tg_evet_conainter) //绘图容器
function create();
begin
@@ -868,6 +959,8 @@ type tg_figure = class(tg_evet_conainter) //
evt := new tg_evt_mouse(evt_mouse_in,d); //处理mouse in
dispatchEvent(evt,nds);
end
end else
begin
end
end
end
@@ -1173,8 +1266,8 @@ type tg_axes = class(tg_base) //
end
function create(pms);
begin
inherited;
f_changed := 0;
inherited;
ftheta := 0;
falpha := 0;
flines_index := array(
@@ -1811,6 +1904,7 @@ type tg_axes = class(tg_base) //
tp.del_axes(self(true));
fwilldelfigure := nil;
end
if (v is class(tg_figure_container)) then return SetFigure(v.figure);
if v is class(tg_figure) then //添加
begin
fwilladdfigure := v;
@@ -2257,7 +2351,7 @@ type tg_canvas = class(TcustomCanvas) //
function destroy();
begin
Handle := 0;
faxesrgn := nil;
faxesrgn := nil;
end
property axesvector read faxesvector write set_clip_vector;
property axesrec read FaxesRec write set_clip_rect;
@@ -2271,7 +2365,7 @@ type tg_canvas = class(TcustomCanvas) //
function set_clip_rect(rec);
begin
FaxesRec := rec;
set_clip_vector( rec_to_points(rec));
//set_clip_vector( rec_to_points(rec));
end
function set_clip_vector(v);
begin
@@ -2314,7 +2408,7 @@ type tg_axis_main = class(tg_axis) //
private
[weakref] faxes;
end
type tg_label_axis = class(tg_label) //坐标轴标签
type tg_label_axis = class(tg_base) //坐标轴标签
public
function create(pms);
begin
@@ -2922,6 +3016,7 @@ type tg_text = class(tg_base)
function create(pms);
begin
inherited;
ftextalign := 1;
clip_state := tgc_off;
ftext := array();
fdata := array();
@@ -2944,7 +3039,7 @@ type tg_text = class(tg_base)
end
else cvs.axesunclip();
get_text_size(w,h,hi);
set_lineinfo_to_canvas(cvs);
modify_text_pos(x,y,w,h,ftextalign);
FPaintrect := array(x,y,x+w,y+h);
Frgnpoints := rec_to_points(FPaintrect)[0:3];
if ffont_angle<>0 then
@@ -2954,7 +3049,8 @@ type tg_text = class(tg_base)
rgn_points_trans(Frgnpoints,-ffont_angle);
x := 0;
y := 0;
end
end
set_lineinfo_to_canvas(cvs);
if line_mode=tgc_on then
begin
rc := array(x,y,x+w,y+h);
@@ -2973,6 +3069,7 @@ type tg_text = class(tg_base)
case cmd of
"text_rec": return (visible=tgc_on)? FPaintrect:nil;
"text_rgn": return (visible=tgc_on)? Frgnpoints:nil; //区域
"point_in_text": return (visible=tgc_on and Frgnpoints)? point_in_rgn(p,Frgnpoints):false; //区域
end ;
return inherited;
end
@@ -2980,13 +3077,23 @@ type tg_text = class(tg_base)
property text read ftext write set_text; //一维字符串数组
property data read fdata write set_data; //位置 x.y
property font_angle read ffont_angle write set_font_angle; //角度
property textalign read ftextalign write set_textalign;
private
FPaintrect;
Frgnpoints;
ftext;
fdata;
ffont_angle;
ftextalign;
private
function set_textalign(v);
begin
if v<>ftextalign and ( v in (1->9)) then
begin
ftextalign := v;
prop_changed("textalign",v);
end
end
function get_text_size(w,h,hi);
begin
fw := fontinfo.size;
@@ -3038,6 +3145,7 @@ type tg_label =class(tg_base) //
function create(pms);
begin
inherited;
ftextalign := 1;
clip_state := tgc_off;
ftext := false;
flocation := tgc_by_coordinates;
@@ -3072,7 +3180,47 @@ type tg_label =class(tg_base) //
end
end
txtw := length(ftext)*fontinfo.size;
rec := array(x_,y_,x_+txtw,y_+fontinfo.size);
txth := fontinfo.size;
modify_text_pos(x_,y_,txtw,txth,ftextalign);
case ftextalign of
2:
begin
x_ := x_-txtw/2;
end
3:
begin
x_ := x_-txtw;
end
4:
begin
y_ := y_-txth/2;
end
5:
begin
x_ := x_-txtw/2;
y_ := y_-txth/2;
end
6:
begin
x_ := x_-txtw;
y_ := y_-txth/2;
end
7:
begin
y_ := y_-txth;
end
8:
begin
x_ := x_-txtw/2;
y_ := y_-txth;
end
9:
begin
x_ := x_-txtw;
y_ := y_-txth;
end
end;
rec := array(x_,y_,x_+txtw,y_+txth);
flabel_rgn := rec_to_points(rec)[0:3];
if ffont_angle<>0 then
begin
@@ -3102,6 +3250,7 @@ type tg_label =class(tg_base) //
return (not p) or (p is class(tg_axis));
end
published
property textalign read ftextalign write set_textalign;
property text read ftext write set_text;//= ""
property position read fposition write set_positon;//[-27.697388,-1.7130177]
property location read flocation write Set_location;
@@ -3118,6 +3267,7 @@ type tg_label =class(tg_base) //
//fractional_font ;//= "off"
//font_angle ;//= 90
private
ftextalign;
flabel_rgn;
flocation;
ftext;
@@ -3127,6 +3277,14 @@ type tg_label =class(tg_base) //
fauto_position;
fauto_rotation;
private
function set_textalign(v);
begin
if v<>ftextalign and ( v in (1->9)) then
begin
ftextalign := v;
prop_changed("textalign",v);
end
end
function Set_location(v);
begin
if flocation<>v and (v in array(tgc_by_axes,tgc_by_coordinates)) then
@@ -3217,7 +3375,12 @@ type tg_tips = class(tg_base) //
f_ps := nil;
prop_changed("fdata_idx",pm);
end
"tips_rec": return (visible=tgc_on)?FPaintrect:nil; //区域
"tips_rec": return (visible=tgc_on )?FPaintrect:nil; //区域
"hit_tip":
begin
if (visible<>tgc_on) then return nil;
return pointinrect(pm,FPaintrect);
end
end
end
function paint(cvs);override;
@@ -3251,7 +3414,7 @@ type tg_tips = class(tg_base) //
ws := max(ws,length(v)*w+w);
hs[i] := h+4;
end
zoom_to_xyz(d[0],d[1],z,x_,y_);
zoom_to_xyz(f_ps[0],f_ps[1],z,x_,y_);
sz := array(ws,sum(hs));
if mark_mode = tgc_on then
begin
@@ -3275,10 +3438,8 @@ type tg_tips = class(tg_base) //
cvs.draw_rect.rect(rec).draw();
end
b_x := rec[0];
b_y := rec[1];
set_fontinfo_to_canvas(cvs);
b_y := rec[1];
set_fontinfo_to_canvas(cvs);
for i,v in ss do
begin
rci := array(b_x,b_y,b_x+ws,b_y+hs[i]);
@@ -3560,6 +3721,16 @@ type tg_legend = class(tg_base) //ͼ
function executecommand(cmd,p);override;
begin
case cmd of
"hit_legend":
begin
if (visible<>tgc_on) then return -1;
x := p[0];y := p[1];
for i,v in flegend_sub_recs do
begin
if pointinrect(p,v) then return i;
end
return -1;
end
"legend_rec":return (visible=tgc_on)? flegend_rec:nil; //整个图例区域
"legend_sub_recs":return (visible=tgc_on)? flegend_sub_recs:nil; //各个图像的区域
end
@@ -3643,22 +3814,14 @@ type tg_legend = class(tg_base) //ͼ
prop_changed("postion",v);
end
end
function set_text(s);
function set_text(s); //图例字符串设置
begin
idx := 0;
flg := false;
if not ifarray(s) then return ;
for i,v in s do
begin
if not ifstring(v) then continue;
if v<>ftext[idx] then
begin
ftext[idx] := v;
flg++;
end
idx++;
end
if flg then prop_changed("text",s);
if ftext=s then return ;
ftext := s;
prop_changed("text",s);
end
function set_links(vs); //关联图
begin
@@ -3762,7 +3925,7 @@ type tg_Polyline = class(tg_graph) //
line_mode := tgc_on;
mark_mode := tgc_off;
fpolyline_style := tgc_LS_interpolated;// interpolated,staircase,barplot,arrowed,filled,bar
fbar_width := 0;
fbar_width := 0.3;
fdata_bounds := array((0,1),(0,1),(0,1));
end
function get_data_bounds();override; //数据边界
@@ -3774,35 +3937,36 @@ type tg_Polyline = class(tg_graph) //
if tgc_on<> visible then return ;
bx := axes.zoom_box;
tempbarw := 0;
z0 := bx[2,0];
fface_rgn := array();
if clip_state=tgc_on then
begin
//cvs.axesclip();
pts := array();
//cvs.axesclip();
fface_rgn := array();
for i,v in rec_to_points( array(bx[0,0],bx[1,0],bx[0,1],bx[1,1])) do
begin
zoom_to_xyz(v[0],v[1],bx[2,0],x,y);
pts[i] := array(x,y);
zoom_to_xyz(v[0],v[1],z0,x,y);
fface_rgn[i] := array(x,y);
end
cvs.clip_rgn(pts);
cvs.clip_rgn(fface_rgn);
end else
begin
cvs.axesunclip();
end
xys := array();
set_lineinfo_to_canvas(cvs);
ys := array();
for i,v in fgraph_data do
begin
if not zoom_to_xyz(v[0],v[1],bx[2,0],x,y) then return ;
if not zoom_to_xyz(v[0],v[1],z0,x,y) then return ;
if not(tempbarw) and fbar_width>0 then ////////处理bar的宽度///////
begin
zoom_to_xyz((v[0]+fbar_width/2),v[1],bx[2,0],xtemp,ytemp);
b := get_abs_barwidth();
zoom_to_xyz((v[0]+b/2),v[1],z0,xtemp,ytemp);
xtemp-=x;
ytemp-=y;
tempbarw := array();
tempbarw[0] := fbar_width*(xtemp)/(abs(xtemp)+abs(ytemp));
tempbarw[1] := fbar_width*(ytemp)/(abs(xtemp)+abs(ytemp));
tempbarw[0] := b*(xtemp)/(abs(xtemp)+abs(ytemp));
tempbarw[1] := b*(ytemp)/(abs(xtemp)+abs(ytemp));
end
xys[i] := array(integer(x),integer(y));
case fpolyline_style of
@@ -3814,8 +3978,10 @@ type tg_Polyline = class(tg_graph) //
end;
end
fline_points_in_canvas := xys;
//zoom_to_xyz(0,0,0,x,y);
paint_lines(cvs,fpolyline_style,xys,fclosed,array("line_mode":line_mode,"bar_width":tempbarw,"color":lineinfo.color,"bkcolor":lineinfo.bkcolor,"xy0":ys));
pinfo := array("line_mode":line_mode,"bar_width":tempbarw,"color":lineinfo.color,"bkcolor":lineinfo.bkcolor,"xy0":ys,"bar_rgns",array());
set_lineinfo_to_canvas(cvs);
paint_lines(cvs,fpolyline_style,xys,fclosed,pinfo);
fline_bar_rgn := pinfo["bar_rgns"];
mk := markinfo.clone();
if mark_mode=tgc_on and mk.size>2 then
begin
@@ -3826,7 +3992,29 @@ type tg_Polyline = class(tg_graph) //
function executecommand(cmd,p);override;
begin
case cmd of
"hit_point":
begin
if not(fface_rgn and point_in_rgn(p,fface_rgn)) then return -1;
case fpolyline_style of
tgc_LS_bar:
begin
for i,v in fline_bar_rgn do
begin
if point_in_rgn(p,v) then return i;
end
end else
begin
sz := markinfo.size+5;
for i,v in fline_points_in_canvas do
begin
if sqrt(sum((p-v)^2))<sz then return i;
end
end
end;
return -1;
end
"points_in_canvas":return (visible=tgc_on)? fline_points_in_canvas:array(); //数据散点
"points_in_range":return (visible=tgc_on)? point_in_rgn(p,fline_points_in_canvas):false;
end;
return inherited;
end
@@ -3847,7 +4035,7 @@ type tg_Polyline = class(tg_graph) //
dis := ceil((rec[2]-rec[0])/5);
xys := array((rec[0]+dis,y0),(rec[0]+4*dis,y0));
set_lineinfo_to_canvas(cvs);
paint_lines(cvs,tgc_LS_interpolated,xys,0,array("line_mode":line_mode,"bar_width":array(fbar_width,0),"color":lineinfo.color,"bkcolor":lineinfo.bkcolor));
paint_lines(cvs,tgc_LS_interpolated,xys,0,array("line_mode":line_mode,"bar_width":array(get_abs_barwidth(),0),"color":lineinfo.color,"bkcolor":lineinfo.bkcolor));
mk := markinfo.clone();
if mark_mode=tgc_on and mk.size>2 then
begin
@@ -3857,9 +4045,11 @@ type tg_Polyline = class(tg_graph) //
end
property closed read fclosed write set_line_closed;//= "off" 封闭
property polyline_style read fpolyline_style write set_polyline_style;//= "0" 线型
property bar_width read fbar_width write fbar_width;//= "0" 柱状宽度
property bar_width read fbar_width write set_bar_width;//= "0" 柱状宽度
private
fline_points_in_canvas;
fline_bar_rgn;
fface_rgn;
fdata_bounds;
fclosed;
fforeground;
@@ -3899,6 +4089,26 @@ type tg_Polyline = class(tg_graph) //
end
end
private
function get_abs_barwidth();//获得
begin
if fbar_width>0 and fbar_width<=1 then
begin
dx := (fdata_bounds[0,1]-fdata_bounds[0,0])/(length(fgraph_data)-1);
if zoom_to_xyz(0,0,nil,x1,y1) and zoom_to_xyz(dx,0,nil,x2,y2) then
begin
return (abs(x1-x2)+abs(y1-y2))*fbar_width;
end
end
return fbar_width;
end
function set_bar_width(v);
begin
if v<>fbar_width and v>0 then
begin
fbar_width := v;
prop_changed("bar_width",nv);
end
end
function set_line_closed(v);
begin
if not tg_boolen_value(v,nv) then return ;
@@ -3958,7 +4168,7 @@ type tg_line_info = class(tg_const) //
end
"width","size":
begin
if FWidth<>v and ifnumber(v) then
if FWidth<>v and ifnumber(v) and (v>=0) then
begin
FWidth := v;
if fonwer then fonwer.invalidate();
@@ -3974,13 +4184,12 @@ type tg_line_info = class(tg_const) //
end
"bkcolor":
begin
if fbkcolor<>v and ifnumber(v) then
if fbkcolor<>v and (ifnumber(v) or ifnil(v)) then //设置颜色
begin
fbkcolor := v;
if fonwer then fonwer.invalidate();
end
end
end
end;
end
[weakref]fonwer;
@@ -4027,7 +4236,7 @@ type tg_font_info = class(tg_const) //
end
"size":
begin
if fsize<>v and ifnumber(v) then
if fsize<>v and ifnumber(v) and (v>5) then
begin
fsize := v;
if fonwer then fonwer.invalidate();
@@ -4043,7 +4252,7 @@ type tg_font_info = class(tg_const) //
end
"bkcolor":
begin
if fbackground<>v and ifnumber(v) then
if fbackground<>v and (ifnumber(v) or ifnil(v)) then
begin
fbackground := v;
if fonwer then fonwer.invalidate();
@@ -4114,7 +4323,7 @@ type tg_mark_info = class(tg_const) //
end
"bkcolor":
begin
if fbackground<>v and ifnumber(v) then
if fbackground<>v and (ifnumber(v) or ifnil(v)) then
begin
fbackground := v;
if fonwer then fonwer.invalidate();
@@ -4228,7 +4437,7 @@ type tg_base = class(TNode,tg_evet_conainter) //
bcl := li.bkcolor;
if ifnumber(bcl) then
begin
cvs.brush.color := li.bkcolor;
cvs.brush.color := bcl;
cvs.brush.Style := tgc_BS_SOLID;
end
else
@@ -4733,22 +4942,27 @@ begin
begin
b_w_x := integer(ifo["bar_width"][0]/2);
b_w_y := integer(ifo["bar_width"][1]/2);
cvs.brush.color := ifo["bkcolor"];
//cvs.brush.color := ifo["bkcolor"];
wflg := (abs(b_w_x)+abs(b_w_y))>0.1;
bar_rgns := array();
for i,v in xys do
begin
if b_w_x>=1 or b_w_y>1 then
if wflg then
begin
v1 := array(v[0]-b_w_x,v[1]-b_w_y);
v2 := array(v[0]+b_w_x,v[1]+b_w_y);
v3 := array(ifo["xy0",i,0]+b_w_x,ifo["xy0",i,1]+b_w_y);
v4 := array(ifo["xy0",i,0]-b_w_x,ifo["xy0",i,1]-b_w_y);
cvs.draw_polygon().points(array(v1,v2,v3,v4)).draw();
v4 := array(ifo["xy0",i,0]-b_w_x,ifo["xy0",i,1]-b_w_y);
barrec := array(v1,v2,v3,v4);
bar_rgns[i] := barrec;
cvs.draw_polygon().points(barrec).draw();
end else
begin
cvs.moveto(array(v[0],v[1]));
cvs.lineto(array(ifo["xy0",i,0],ifo["xy0",i,1]));
end
end
ifo["bar_rgns"] := bar_rgns;
paint_lines(cvs,o.tgc_LS_interpolated,xys,cls,ifo);
end
o.tgc_LS_arrowed:
@@ -4775,15 +4989,14 @@ begin
end
end
o.tgc_LS_filled:
begin
begin
if cls=o.tgc_on then
begin
cvs.brush.color := ifo["bkcolor"];
//cvs.brush.color := ifo["bkcolor"];
cvs.draw_polygon().points(xys).draw();
end else
begin
cvs.brush.color := ifo["color"];
//cvs.brush.color := ifo["color"];
for i,v in xys do
begin
if i=0 then continue;
@@ -5025,11 +5238,56 @@ begin
if vi is class(tg_graph_base) then
begin
bds := vi.get_data_bounds();
mg_bds(bds,d);
if i=0 then
begin
d := bds;
end else
mg_bds(bds,d);
end
end
return d;
end
function modify_text_pos(x_,y_,txtw,txth,al);
begin
case al of
2:
begin
x_ := x_-txtw/2;
end
3:
begin
x_ := x_-txtw;
end
4:
begin
y_ := y_-txth/2;
end
5:
begin
x_ := x_-txtw/2;
y_ := y_-txth/2;
end
6:
begin
x_ := x_-txtw;
y_ := y_-txth/2;
end
7:
begin
y_ := y_-txth;
end
8:
begin
x_ := x_-txtw/2;
y_ := y_-txth;
end
9:
begin
x_ := x_-txtw;
y_ := y_-txth;
end
end;
end
function get_rect_at_corner(x,y,w,h,itv,flg,mvx,mvy); //计算围绕点的区域位置
begin
//0左上 ,1右上 2 右下 3 左下
@@ -5106,7 +5364,10 @@ begin
end
function d2angle(v1,v2); //角度计算
begin
return arccos(sum(v1*v2)/vectorsize(v1)/vectorsize(v2));
r := arccos(sum(v1*v2)/vectorsize(v1)/vectorsize(v2));
return r;
if r>0 or r<0 then return r;
return 0;
end
function vectorsize(v); //向量长度
begin
@@ -5116,27 +5377,51 @@ function rec_to_points(rec);
begin
return array(rec[array(0,1)],rec[array(2,1)],rec[array(2,3)],rec[array(0,3)],rec[array(0,1)]);
end
function point_in_rgn(p,rgn_); //判断点是否在区域中
function point_in_rgn(p,rgn_,method); //夹角法
begin
if (method = 1) or ifnil(method) then return point_in_polygon(p, rgn_);
arg := 0;
rgn := rgn_ union array(rgn_[0]);
for i := 1 to length(rgn)-1 do
len := length(rgn);
if len<4 then return 0;
for i := 1 to len-1 do
begin
p1 := rgn[i-1];
p2 := rgn[i];
v1 := array(p1[0]-p[0],p1[1]-p[1]);
v2 := array(p2[0]-p[0],p2[1]-p[1]);
argi := d2angle(v1,v2);
arg+=argi;
if argi>0 or argi<0 then arg+=argi;
end
return (abs(arg/2-pi())<0.01);
end
function point_in_polygon(point, polygon);//射线法
begin
x0 := point[0];
y0 := point[1];
ct := 0;
len := length(polygon)-1;
if len<3 then return 0;
for i ,v in polygon do
begin
x1 := v[0];
y1 := v[1];
if i=len then v2 := polygon[0];
else v2 := polygon[i+1];
x2 := v2[0];
y2 := v2[1];
if ((y1 > y0) <> (y2 > y0)) and x0 < ((x2 - x1) * (y0 - y1) / (y2 - y1) + x1) then ct += 1;
end
return (ct % 2) =1;
end
function rgn_points_trans(pts,ag);
begin
x := pts[0,0];
y := pts[0,1];
for i := 1 to length(pts)-1 do
begin
p_trans(pts[i,0]-pts[0,0],pts[i,1]-pts[0,1],ag,px,py);
pts[i] := array(pts[0,0]+px,pts[0,1]+py);
p_trans(pts[i,0]-x,pts[i,1]-y,ag,px,py);
pts[i] := array(x+px,y+py);
end
end
function tg_get_true_idx(idx);
File diff suppressed because it is too large Load Diff