关于TSP的sealine算法与角谷猜想(2026-04-25)
1)TSP的sealine算法已基本完成代码,测试表明,可能点数越多越趋于精确解,原本来于想法:真空包装,真空包装塑料薄膜,中间抽空气,内陷,被内部质点顶点顶住,这是立体三维,再降维成二维平面时,包装塑料薄膜变换成橡皮筋。实际上,写代码已经最简单实现功能,但达不到模拟模型的理想状态,这是一个可以发展的方向乎,暂称为,量子潮汐涨落模拟-真空包装-塑料薄膜-橡皮筋-海岸线模型猜想,简称sealine算法/猜想,只是实现最简单代码乎。。。
- 角谷猜想熵增模拟相似,先连续1称为I,连续0称为O,字母IO代替数字10,然后边界处开始模糊光栅衍射,连续1连续0递减,最后10相邻,即由IO相邻变成10相邻。
2026-04-25今日很不容易,忍住疲劳,终于,修正了原有的sealine算法的bug,测试下,比较满意了。
测试表明,肯定不是最优解,最优解目前只有动态规划或穷举算法,暂无解。
传统近似算法,个人目前认为,可能模拟退火算法是最好的,于是对比。
原本认为,sealine算法,点数少时不及传统近似算法,设想点数越多越趋于最优解,这个估计可以这样认为,当点数越多时,点的分布就会象晶体一样有序,一个紧挨一个,象标准矩形,坐标轴坐标点一样,于是测试。
发现,
1)当坐标点是十分规则的矩形分布坐标轴一样整点时,sealine算法目前不及模拟退火,就算点数从100到500都是一样
SQLQuery1.FieldByName('px').AsInteger := 100 + (100 * (i - 1) mod 1000);
SQLQuery1.FieldByName('py').AsInteger := 100 + 100 * (100 * (i - 1) div 1000);
2)当坐标点是随机分布,sealine算法目前自认为确实在100点,到500点,比模拟退火效果要好不少,高于500点时,个人PC电脑硬件问题,不理了。
SQLQuery1.FieldByName('px').AsInteger := Random(1000);//100 + I * 10;
SQLQuery1.FieldByName('py').AsInteger := Random(1000);//100 + I * 10;
3)当坐标点是大体规则矩形加上少量随机分布,sealine算法目前仍然自认为确实在100点,到500点,比模拟退火效果要好不少,高于500点时,个人PC电脑硬件问题,不理了。
SQLQuery1.FieldByName('px').AsInteger :=100 + (100 * (i - 1) mod 1000) + Random(20);
SQLQuery1.FieldByName('py').AsInteger :=100 + 100 * (100 * (i - 1) div 1000) + Random(20);
sealine算法,目前不想理了,暂如是,停鞍稍驻初程,写代码象古代骑马驿站赶路,太急不好,疲劳不好。。。。。。。


sealine算法,目前不想理了,暂如是,停鞍稍驻初程,写代码象古代骑马驿站赶路,太急不好,疲劳不好。。。。。。。
TSP_ubuntu_Lazarus源代码=033=sealine=粗略已处理四正四隅垂直和水平.zip
(1) https://github.com/aMeTooFor/TSP/
(2) https://blog.csdn.net/e271828/article/details/160509634?spm=1011.2124.3001.6209
====================================
SeaLine算法的思考进展
2026-03-31
1)昨天我测试了一下,当sealine算法逐层法只有一层时,测试表明,可能正是最优解,但未获严格证明
2)昨天我又测试一下,将sealine算法选逐层法再逐点法相结合时,如果第二层只有一个点,共只有两层,测试表明,可能也是最优解,但未证明
3)昨天我又设想,将逐点法,由原来的最小距离/最大夹角/最小面积,改成了,最小边长,min(ac+bc-ab),测试表明,结果与原有的模拟退火相近似,也是近似解,但比原来的改进了许多。
4)我又测试下,逐层法后再逐点法,未写代码,三重循环还是二重循环,疲劳分不清,暂不写代码,等不疲劳分清楚再说
5)不写新代码,原有的测试,逐层法后再逐点法,以二层测试,有时相差不远,有时相差远,可能与第二层点的分布有关。可能是一种趋近近似算法。也可能要以改良成精确最优解,只是目前做不到。
6)TSP的穷举法算法复杂度或为O(n!)?今如果转化为sealine逐层法n=L=L0+L1+L2+...+Li+...+Ln,是不是每层都要全排序呢?O(L1!+L2!+...+Li!+L...+Ln!)如果这样,也没甚用了,因为,动态规划法也是仅有O(n*2^n)和O(n^2*2n)。转化为,每层逐点时,要按原来的同心圆的顺序,不可乱来,分顺时针和逆时针,所以,可能sealine逐层且逐点法的复杂度为线性的O(3n+1),是有可能的。且不断逼近最优解,如果想下就可以了。。。。
===================================
TSP海岸线SeaLine算法的逐层法/逐点法(续)
三界火宅人 2026-03-26
假设TSP的海岸线sealine算法逐层产生同心圆的线圈所在点集为L0,L1,L2...Li,...Ln,如果用递增方式,由集合前段L0-->L0+L1-->L0+L1+L2-->L0+L1+...Li,这样来求TSP的精确解,会不会有简易算法,比直接全集L的TSP组合算法要简单?
1)若仅一层L=L0,sealine算法是不是最优解呢?
2)若仅两层L=L0+L1,是否存在简易算法,使得由L0-->L0+L1计算TSP最优解比直接L要简易得多呢?
3)如果上面1)和2)成立,根据数学归纳法,P=NP仍然有可能成立的乎。一生二,二生三,三生万物者,数学归纳法乎。之乎者也,知苦这也。
4)由第一层向第二层推进,再分解分析降解为第一层内部加多一个点乎,这更加简化,算法如何?如果新点近边靠边圈,可能真的局部调下即成乎,如果新点近中心,可能大变, 不是这么简化的?P,线性乎,NP,级数指数乎,仍是未知的。
5)角谷猜想的熵增定律的映像,仍然可能成立乎
6)代数数理(辟支?知乎)与几何直观(声闻?福乎)不可能相差太远乎,自然数平方的倒数和,欧拉用级数解,现代化为几何直观圆,总有几何对应代数乎,素数对应几何上啥呢?
=============================================================
关于TSP的海岸线猜想:SeaLine算法的逐层法(不同于逐点法)
三界火宅人 2026-03-25
经过两天的不充分休息,疲劳暂解,又开始强迫症式地新思想了,忽想到,如果海浪线不是每次一点点地强逼进,不理什么最近距离或最大夹角或最小面积,改用同心圆的方式,一线线地强逼进,最后再连通各个同心圆,这算法可行否?
1)为了一个想法,又开始焦虑不安了,必要调试出个结果才安心也,心无奎碍,无挂疑故,才可以安心休息也。
于是,又是上机调试,又写自定义函数,一个数组下标出错,也找很久,当前下标是curA还是i,自已易搞混,原先正常的函数isCross或ifCross,为啥又出错了,深入内部代码调试一番,这又累呀。一大早起床,啥也不干,就开机,没有报酬的,白干的,就为了一个想法,一个知字乎,为了讨个说法乎?
2)首先得到最外层的围城的围线算法,以前是一个点一个点地推进,现在改了,把围城推倒,相当于重新造一个围墙,把原先围城的点暂时不要。
3)就这递归,叠代,一线一线地推进,产生同心圆,最后连通这些同心圆,可行不?
结果,可行,但是,仍然不是最优解,不过没有细长深长的线了,比较钝角了。
没想到,不许相交,从这点出发的SeaLine算法,的确可行实现了,但离最优解差得远,不及有些相交线的组合算法,就这样,暂时算(蒜子)了,V速退
===============================================
function TMain.sealine000(minx, miny, maxx, maxy: integer): integer;
var
i: integer; //memo_seaLine
curp, curp0: integer;//TPoint;
pline: TlinePoint;
pcode1, pcode2: string;
pcode1Shape, pcode2Shape: tshape;
pcode1Pointer, pcode2Pointer: tpoint;
path, ss: string;
minpx, minpy, maxpx, maxpy: integer;
sortlist, floorLine: TStringList;
begin
sortlist := TStringList.Create;
floorLine := TStringList.Create;
sortlist.Clear;
floorLine.Clear;
//////////////////////////////////////四正 子午卯酉
//minpx,minpy,maxpx,maxpy:integer;
minpx := TPointLine(PointListminx).px;
minpy := TPointLine(PointListminy).py;
maxpx := TPointLine(PointListmaxx).px;
maxpy := TPointLine(PointListmaxy).py;
///#####################################
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
//for i := PointList.Count - 1 downto 0 do
begin
//if TPointLine(PointListi).floor<>-123 then
if (TPointLine(PointListi).px = TPointLine(PointListminx).px) then
// if (TPointLine(PointListi).py <TPointLine(PointListminx).py) then
begin
// minx:=i;
// TPointLine(PointListi).floor:=-123;
//sortlist.add(inttostr(TPointLine(PointListi).py)+' '+TPointLine(PointListi).pcode);
sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).py), 10) +
' ' + IntToStr(i));
application.ProcessMessages;
end;
end;
//ss:=sortlist.text;
sortlist.sort;
//ss:=sortlist.text;
//for i := 0 to sortlist.Count - 1 do
for i := sortlist.Count - 1 downto 0 do
floorLine.add(trim(rightstr(sortlisti, 10)));
//四正:酉正,从酉初到酉末
ss := floorLine.Text;
if sortlist.Count > 0 then
minx := StrToInt(trim(rightstr(sortlist0, 10))); //酉时末,顶上
///#####################################
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
begin
if (TPointLine(PointListi).py = TPointLine(PointListminy).py) then
begin
sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).px), 10) +
' ' + IntToStr(i));
application.ProcessMessages;
end;
end;
sortlist.sort;
if sortlist.Count > 0 then
miny := StrToInt(trim(rightstr(sortlistsortlist.Count - 1, 10)));//子时初
application.ProcessMessages;
curp := minx;
curp0 := -1;
path := '';
while curp0 <> curp do
//八极之四隅之亥,从酉末到子初也
begin
//if curp<>-1 then
application.ProcessMessages;
curp0 := curp;
for i := 0 to PointList.Count - 1 do
begin
if (TPointLine(PointListi).px > TPointLine(PointListminy).px) then
continue;
if (TPointLine(PointListi).py > TPointLine(PointListcurp0).py) then
continue;
if (TPointLine(PointListi).px = TPointLine(PointListminy).px) then
continue;
if (TPointLine(PointListi).py = TPointLine(PointListcurp0).py) then
continue;
if (i = curp0) then
begin
//curp := i;
continue;
end;
if (curp0 <> curp) then
begin
if ((TPointLine(PointListi).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListi).px - TPointLine(PointListcurp0).px)) <
((TPointLine(PointListcurp).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListcurp).px - TPointLine(PointListcurp0).px)) then
begin
curp := i;
end;
end
else
curp := i;
end;
if curp0 <> curp then
begin
if floorLine.IndexOf(IntToStr(curp0)) <= -1 then
floorLine.add(IntToStr(curp0));
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
floorLine.add(IntToStr(curp));
//linelist.Add(pline);
end;
end;
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
floorLine.add(IntToStr(curp));
//if floorLine.IndexOf(IntToStr(miny)) <= -1 then
// floorLine.add(IntToStr(miny));
// linelist.Add(pline);
// memo_seaLine.Lines.Add('1:' + path);
application.ProcessMessages;
///////////////////////////////////////////////////////////////////
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
begin
if (TPointLine(PointListi).py = TPointLine(PointListminy).py) then
begin
sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).px), 10) +
' ' + IntToStr(i));
application.ProcessMessages;
end;
end;
sortlist.sort;
for i := 0 to sortlist.Count - 1 do
// for i := sortlist.Count - 1 downto 0 do
floorLine.add(trim(rightstr(sortlisti, 10)));//四正:子正,从子初到子末
// miny := StrToInt(sortlist0);
// if floorLine.IndexOf(IntToStr(miny)) <= -1 then
// floorLine.add(IntToStr(miny));
if sortlist.Count > 0 then
miny := StrToInt(trim(rightstr(sortlistsortlist.Count - 1, 10)));
//子时末,右侧
///#####################################
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
begin
if (TPointLine(PointListi).px = TPointLine(PointListmaxx).px) then
begin
sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).py), 10) +
' ' + IntToStr(i));
application.ProcessMessages;
end;
end;
sortlist.sort;
if sortlist.Count > 0 then
//maxx := StrToInt(trim(rightstr(sortlistsortlist.Count - 1, 10)));//卯时初
maxx := StrToInt(trim(rightstr(sortlist0, 10)));//卯时初
//////////////////////////////////////
application.ProcessMessages;
curp := miny;
curp0 := -1;
path := '';
while curp0 <> curp do //八极之四隅之寅,从子末到卯初
begin
application.ProcessMessages;
curp0 := curp;
for i := 0 to PointList.Count - 1 do
begin
if (TPointLine(PointListi).px < TPointLine(PointListcurp0).px) then
continue;
if (TPointLine(PointListi).py > TPointLine(PointListmaxx).py) then
continue;
if (TPointLine(PointListi).px = TPointLine(PointListmaxx).px) then
continue;
if (TPointLine(PointListi).py = TPointLine(PointListcurp0).py) then
continue;
if (i = curp0) then
begin
continue;
end;
if (curp0 <> curp) then
begin
if ((TPointLine(PointListi).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListi).px - TPointLine(PointListcurp0).px)) <
((TPointLine(PointListcurp).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListcurp).px - TPointLine(PointListcurp0).px)) then
begin
curp := i;
end;
end
else
curp := i;
end;
if curp0 <> curp then
begin
if floorLine.IndexOf(IntToStr(curp0)) <= -1 then
floorLine.add(IntToStr(curp0));
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
floorLine.add(IntToStr(curp));
end;
end;
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
floorLine.add(IntToStr(curp));
// if floorLine.IndexOf(IntToStr(maxx)) <= -1 then
// floorLine.add(IntToStr(maxx));
//path := path + '-->' + pcode2;
// memo_seaLine.Lines.Add('2:' + path);
application.ProcessMessages;
///////////////////////////////////////////////////////////////////
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
begin
if (TPointLine(PointListi).px = TPointLine(PointListmaxx).px) then
begin
sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).py), 10) +
' ' + IntToStr(i));
application.ProcessMessages;
end;
end;
sortlist.sort;
for i := 0 to sortlist.Count - 1 do
// for i := sortlist.Count - 1 downto 0 do
floorLine.add(trim(rightstr(sortlisti, 10)));//四正:卯正,从卯初到卯末
// maxx := StrToInt(sortlist0);
// if floorLine.IndexOf(IntToStr(maxx)) <= -1 then
// floorLine.add(IntToStr(maxx));
if sortlist.Count > 0 then
maxx := StrToInt(trim(rightstr(sortlistsortlist.Count - 1, 10)));
//卯时末,右底
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
begin
if (TPointLine(PointListi).py = TPointLine(PointListmaxy).py) then
begin
sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).px), 10) +
' ' + IntToStr(i));
application.ProcessMessages;
end;
end;
sortlist.sort;
ss := sortlist.Text;
if sortlist.Count > 0 then
maxy := StrToInt(trim(rightstr(sortlistsortlist.Count - 1, 10)));//午时初
//////////////////////////////////////
ss := floorLine.Text;
application.ProcessMessages;
curp := maxx;
curp0 := -1;
path := '';
while curp0 <> curp do//八极之四隅之巳,从卯末到午初
begin
application.ProcessMessages;
curp0 := curp;
//for i := 0 to PointList.Count - 1 do
for i := PointList.Count - 1 downto 0 do
begin
if (TPointLine(PointListi).px < TPointLine(PointListmaxy).px) then
continue;
if (TPointLine(PointListi).py < TPointLine(PointListcurp0).py) then
continue;
if (TPointLine(PointListi).px = TPointLine(PointListcurp0).px) then
continue;
if (TPointLine(PointListi).py = TPointLine(PointListmaxy).py) then
continue;
if (i = curp0) then
begin
continue;
end;
if (curp0 <> curp) then
begin
if ((TPointLine(PointListi).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListi).px - TPointLine(PointListcurp0).px)) <
((TPointLine(PointListcurp).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListcurp).px - TPointLine(PointListcurp0).px)) then
begin
curp := i;
end;
end
else
curp := i;
end;
if curp0 <> curp then
begin
if floorLine.IndexOf(IntToStr(curp0)) <= -1 then
floorLine.add(IntToStr(curp0));
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
floorLine.add(IntToStr(curp));
end;
end;
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
floorLine.add(IntToStr(curp));
//if floorLine.IndexOf(IntToStr(maxy)) <= -1 then
// floorLine.add(IntToStr(maxy));
//path := path + '-->' + pcode2;
//memo_seaLine.Lines.Add('3:' + path);
application.ProcessMessages;
//////////////////////////////////////
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
begin
if (TPointLine(PointListi).py = TPointLine(PointListmaxy).py) then
begin
sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).px), 10) +
' ' + IntToStr(i));
application.ProcessMessages;
end;
end;
sortlist.sort;
//for i := 0 to sortlist.Count - 1 do
for i := sortlist.Count - 1 downto 0 do
floorLine.add(trim(rightstr(sortlisti, 10)));//四正之午正(含午初)
// maxy := StrToInt(sortlist0);
// if floorLine.IndexOf(IntToStr(maxy)) <= -1 then
// floorLine.add(IntToStr(maxy));
if sortlist.Count > 0 then
maxy := StrToInt(trim(rightstr(sortlist0, 10)));//午末
ss := floorLine.Text;
application.ProcessMessages;
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
begin
if (TPointLine(PointListi).px = TPointLine(PointListminx).px) then
begin
sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).py), 10) +
' ' + IntToStr(i));
application.ProcessMessages;
end;
end;
sortlist.sort;
if sortlist.Count > 0 then
minx := StrToInt(trim(rightstr(sortlistsortlist.Count - 1, 10)));//酉之初
ss := floorLine.Text;
application.ProcessMessages;
//////////////////////////////////////
application.ProcessMessages;
curp := maxy;
curp0 := -1;
path := '';
while curp0 <> curp do//午末与酉初之间的四隅之申
begin
application.ProcessMessages;
curp0 := curp;
//for i := 0 to PointList.Count - 1 do
for i := PointList.Count - 1 downto 0 do
begin
if (TPointLine(PointListi).px > TPointLine(PointListcurp0).px) then
continue;
if (TPointLine(PointListi).py < TPointLine(PointListminx).py) then
continue;
if (TPointLine(PointListi).px = TPointLine(PointListcurp0).px) then
continue;
if (TPointLine(PointListi).py = TPointLine(PointListminx).py) then
continue;
if (i = curp0) then
begin
continue;
end;
if (curp0 <> curp) then
begin
if ((TPointLine(PointListi).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListi).px - TPointLine(PointListcurp0).px)) <
((TPointLine(PointListcurp).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListcurp).px - TPointLine(PointListcurp0).px)) then
begin
curp := i;
end;
end
else
curp := i;
end;
if curp0 <> curp then
begin
if floorLine.IndexOf(IntToStr(curp0)) <= -1 then
floorLine.add(IntToStr(curp0));
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
floorLine.add(IntToStr(curp));
end;
end;
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
floorLine.add(IntToStr(curp));
// if floorLine.IndexOf(IntToStr(minx)) <= -1 then
// floorLine.add(IntToStr(minx));
// memo_seaLine.Lines.Add('4:' + path);
application.ProcessMessages;
//////////////////////////////////////
ss := floorLine.Text;
path := '';
for i := 0 to floorLine.Count - 1 do
begin
TPointLine(PointListStrToInt(floorLine\[i mod floorLine.Count)]).floor := 0;
pline := TlinePoint.Create(nil);
pcode1 := pcodesStrToInt(floorLine\[i mod floorLine.Count)];
pcode2 := pcodesStrToInt(floorLine\[(i + 1) mod floorLine.Count)];
pcode1Shape := getpcode(pcode1);
pcode2Shape := getpcode(pcode2);
pcode1Pointer.x := pcode1Shape.Left + (pcode1Shape.Width div 2);
pcode1Pointer.y := pcode1Shape.top + (pcode1Shape.Height div 2);
pcode2Pointer.x := pcode2Shape.Left + (pcode2Shape.Width div 2);
pcode2Pointer.y := pcode2Shape.top + (pcode2Shape.Height div 2);
//self.Image1.Canvas.Line(pcode1Pointer,pcode2Pointer);
if ResultPathEdgesRed.IndexOf(pcode1 + pcode2) >= 0 then
begin
ScrollBox1.Canvas.pen.color := clHighlight;//clred;
ScrollBox1.Canvas.pen.Width := 4;
end
else
begin
ScrollBox1.Canvas.pen.color := clgrayText;
ScrollBox1.Canvas.pen.Width := 2;
end;
self.ScrollBox1.Canvas.Line(pcode1Pointer, pcode2Pointer); //ok
application.ProcessMessages;
pline.beginPcode := pcode1;
pline.endPcode := pcode2;
pline.beginPoint := pcode1Pointer;
pline.endPoint := pcode2Pointer;
pline.floor := 0; ///想不到,后来修改时,少加这句,就难找不易
linelist.Add(pline);
if pos('-->' + pcode1, path) <= 0 then
path := path + '-->' + pcode1;
if pos('-->' + pcode2, path) <= 0 then
path := path + '-->' + pcode2;
end;
memo_seaLine.Lines.Add(path);
sortlist.Free;
floorLine.Free;
///////////////////////////////////////////////////////////////////
//refreshFromLineList(nil);
end;
=====================
procedure TMain.btn_seaLineFloorPointClick(Sender: TObject);
var
i, j, k, jj, jjj, ij, ik, lmn: integer; //memo_seaLine
minx0, miny0, maxx0, maxy0: integer;//TPoint;
pline, ppline: TlinePoint;
minH, curminH, onelong, alllong: double;
cc: integer;
ss: string;
tempLineList: TFPList;//TPointerList;//TList; // TlinePoint
storeyLineList: array of TStringList;//TPointerList;//TList; // TlinePoint
function PPLong(a, b: Tpoint): double;
begin
Result := 0.0;
Result := sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
end;
function wlog(w: string): integer;
begin
Result := 1;
cc := citycount;
//cc:=9;
//cc:=9;
if (ik > (cc - 2)) then
//if (iii>(7)) then
memo_seaLine.Lines.Add(w);
end;
function sealineLayer(minx, miny, maxx, maxy: integer): integer;
var
i, j, curTOPstorey: integer; //memo_seaLine
curp, curp0, tempnextp: integer;//TPoint;
pline: TlinePoint;
pcode1, pcode2: string;
pcode1Shape, pcode2Shape: tshape;
pcode1Pointer, pcode2Pointer: tpoint;
path, ss: string;
minpx, minpy, maxpx, maxpy: integer;
sortlist, floorLine: TStringList;
begin
sortlist := TStringList.Create;
floorLine := TStringList.Create;
sortlist.Clear;
floorLine.Clear;
////////////////////////////////////// 四正 子午卯酉
//minpx,minpy,maxpx,maxpy:integer;
minpx := TPointLine(PointListminx).px;
minpy := TPointLine(PointListminy).py;
maxpx := TPointLine(PointListmaxx).px;
maxpy := TPointLine(PointListmaxy).py;
///#####################################
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
if TPointLine(PointListi).floor = -1 then
break;
minx := i;//TPoint(PointList0);
miny := minx;
maxx := minx;
maxy := minx;
for i := 0 to PointList.Count - 1 do
// PointList: TFPList;//TPointerList;//TList; //TPointline
if TPointLine(PointListi).floor = -1 then
begin
// ss:= TPointLine(PointListi).pcode;
if TPointLine(PointListi).pcode = 'P9' then
application.ProcessMessages;
if (TPointLine(PointListi).px < TPointLine(PointListminx).px) then
minx := i;// TPoint(PointListi);
if (TPointLine(PointListi).py < TPointLine(PointListminy).py) then
miny := i;// TPoint(PointListi);
if (TPointLine(PointListi).px > TPointLine(PointListmaxx).px) then
maxx := i;// TPoint(PointListi);
if (TPointLine(PointListi).py > TPointLine(PointListmaxy).py) then
maxy := i;// TPoint(PointListi);
end;
memo_seaLine.Lines.Add('第' + IntToStr(length(storeyLineList) + 1) +
'层围城线围墙:');
memo_seaLine.Lines.Add('minx=' + pcodesminx);
memo_seaLine.Lines.Add('miny=' + pcodesminy);
memo_seaLine.Lines.Add('maxx=' + pcodesmaxx);
memo_seaLine.Lines.Add('maxy=' + pcodesmaxy);
application.ProcessMessages;
//tempLineList:=TFPList.Create;//TPointerList;//TList; // TlinePoint
curTOPstorey := length(storeyLineList);
setlength(storeyLineList, curTOPstorey + 1);
storeyLineListcurTOPstorey := TStringList.Create;
////////////////////////////////////// 四正 子午卯酉
//minpx,minpy,maxpx,maxpy:integer;
minpx := TPointLine(PointListminx).px;
minpy := TPointLine(PointListminy).py;
maxpx := TPointLine(PointListmaxx).px;
maxpy := TPointLine(PointListmaxy).py;
///#####################################
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
//for i := PointList.Count - 1 downto 0 do
begin
if TPointLine(PointListi).floor = -1 then
if (TPointLine(PointListi).px = TPointLine(PointListminx).px) then
begin
//TPointLine(PointListi).floor := curTOPstorey;
//sortlist.add(inttostr(TPointLine(PointListi).py)+' '+TPointLine(PointListi).pcode);
sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).py),
-
- ' ' + IntToStr(i));
end;
end;
//ss:=sortlist.text;
sortlist.sort;
//ss:=sortlist.text;
//for i := 0 to sortlist.Count - 1 do
for i := sortlist.Count - 1 downto 0 do
begin
floorLine.add(trim(rightstr(sortlisti, 10)));
//四正:酉正,从酉初到酉末
TPointLine(PointListStrToInt(trim(rightstr(sortlist\[i, 10)))]).floor :=
curTOPstorey;
end;
ss := floorLine.Text;
if sortlist.Count > 0 then
minx := StrToInt(trim(rightstr(sortlist0, 10))); //酉时末,顶上
///#####################################
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
begin
if TPointLine(PointListi).floor = -1 then
if (TPointLine(PointListi).py = TPointLine(PointListminy).py) then
begin
sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).px),
-
- ' ' + IntToStr(i));
end;
end;
sortlist.sort;
if sortlist.Count > 0 then
miny := StrToInt(trim(rightstr(sortlistsortlist.Count - 1, 10)));//子时初
application.ProcessMessages;
curp := minx;
curp0 := -1;
path := '';
while curp0 <> curp do //八极之四隅之亥,从酉末到子初也
begin
application.ProcessMessages;
//if curp<>-1 then
curp0 := curp;
for i := 0 to PointList.Count - 1 do
if TPointLine(PointListi).floor = -1 then
begin
if (TPointLine(PointListi).px > TPointLine(PointListminy).px) then
continue;
if (TPointLine(PointListi).py > TPointLine(PointListcurp0).py) then
continue;
if (TPointLine(PointListi).px = TPointLine(PointListminy).px) then
continue;
if (TPointLine(PointListi).py = TPointLine(PointListcurp0).py) then
continue;
if (i = curp0) then
begin
//curp := i;
continue;
end;
if (curp0 <> curp) then
begin
if ((TPointLine(PointListi).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListi).px - TPointLine(PointListcurp0).px)) <
((TPointLine(PointListcurp).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListcurp).px - TPointLine(PointListcurp0).px)) then
begin
curp := i;
end;
end
else
curp := i;
end;
if curp0 <> curp then
begin
if floorLine.IndexOf(IntToStr(curp0)) <= -1 then
begin
floorLine.add(IntToStr(curp0));
TPointLine(pointlistcurp0).floor := curTOPstorey;
end;
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
begin
floorLine.add(IntToStr(curp));
TPointLine(pointlistcurp).floor := curTOPstorey;
end;
end;
end;
if miny <> curp then
begin
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
begin
floorLine.add(IntToStr(curp));
TPointLine(pointlistcurp).floor := curTOPstorey;
end;
end;
//TPointLine(pointlistminy).floor := curTOPstorey;
//memo_seaLine.Lines.Add('1:' + path);
ss := floorLine.Text;
application.ProcessMessages;
///////////////////////////////////////////////////////////////////
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
begin
if TPointLine(PointListi).floor = -1 then
if (TPointLine(PointListi).py = TPointLine(PointListminy).py) then
begin
sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).px),
-
- ' ' + IntToStr(i));
end;
end;
sortlist.sort;
for i := 0 to sortlist.Count - 1 do
// for i := sortlist.Count - 1 downto 0 do
begin
floorLine.add(trim(rightstr(sortlisti, 10)));
//四正:子正,从子初到子末
TPointLine(PointListStrToInt(trim(rightstr(sortlist\[i, 10)))]).floor :=
curTOPstorey;
end;
// miny := StrToInt(sortlist0);
// if floorLine.IndexOf(IntToStr(miny)) <= -1 then
// floorLine.add(IntToStr(miny));
ss := sortlist.Text;
if sortlist.Count > 0 then
miny := StrToInt(trim(rightstr(sortlistsortlist.Count - 1, 10)));
//子时末,右侧
///#####################################
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
begin
if TPointLine(PointListi).floor = -1 then
if (TPointLine(PointListi).px = TPointLine(PointListmaxx).px) then
begin
sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).py),
-
- ' ' + IntToStr(i));
end;
end;
sortlist.sort;
if sortlist.Count > 0 then
// maxx := StrToInt(trim(rightstr(sortlistsortlist.Count - 1, 10)));//卯时初
maxx := StrToInt(trim(rightstr(sortlist0, 10)));//卯时初
//////////////////////////////////////
application.ProcessMessages;
curp := miny;
curp0 := -1;
path := '';
while curp0 <> curp do //八极之四隅之寅,从子末到卯初
begin
application.ProcessMessages;
curp0 := curp;
for i := 0 to PointList.Count - 1 do
if TPointLine(PointListi).floor = -1 then
begin
if (TPointLine(PointListi).px < TPointLine(PointListcurp0).px) then
continue;
if (TPointLine(PointListi).py > TPointLine(PointListmaxx).py) then
continue;
if (TPointLine(PointListi).px = TPointLine(PointListmaxx).px) then
continue;
if (TPointLine(PointListi).py = TPointLine(PointListcurp0).py) then
continue;
if (i = curp0) then
begin
continue;
end;
if (curp0 <> curp) then
begin
if ((TPointLine(PointListi).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListi).px - TPointLine(PointListcurp0).px)) <
((TPointLine(PointListcurp).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListcurp).px - TPointLine(PointListcurp0).px)) then
begin
curp := i;
end;
end
else
curp := i;
end;
if curp0 <> curp then
begin
if floorLine.IndexOf(IntToStr(curp0)) <= -1 then
begin
floorLine.add(IntToStr(curp0));
TPointLine(pointlistcurp0).floor := curTOPstorey;
end;
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
begin
floorLine.add(IntToStr(curp));
TPointLine(pointlistcurp).floor := curTOPstorey;
end;
end;
end;
if maxx <> curp then
begin
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
begin
floorLine.add(IntToStr(curp));
TPointLine(pointlistcurp).floor := curTOPstorey;
end;
end;
// memo_seaLine.Lines.Add('2:' + path);
ss := floorLine.Text;
application.ProcessMessages;
////////////////////////////////////////////////////////////////////
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
begin
if TPointLine(PointListi).floor = -1 then
if (TPointLine(PointListi).px = TPointLine(PointListmaxx).px) then
begin
sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).py),
-
- ' ' + IntToStr(i));
end;
end;
sortlist.sort;
for i := 0 to sortlist.Count - 1 do
// for i := sortlist.Count - 1 downto 0 do
begin
floorLine.add(trim(rightstr(sortlisti, 10)));
//四正:卯正,从卯初到卯末
TPointLine(PointListStrToInt(trim(rightstr(sortlist\[i, 10)))]).floor :=
curTOPstorey;
end;
// maxx := StrToInt(sortlist0);
// if floorLine.IndexOf(IntToStr(maxx)) <= -1 then
// floorLine.add(IntToStr(maxx));
if sortlist.Count > 0 then
maxx := StrToInt(trim(rightstr(sortlistsortlist.Count - 1, 10)));
//卯时末,右底
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
begin
if TPointLine(PointListi).floor = -1 then
if (TPointLine(PointListi).py = TPointLine(PointListmaxy).py) then
begin
sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).px),
-
- ' ' + IntToStr(i));
end;
end;
sortlist.sort;
ss := sortlist.Text;
if sortlist.Count > 0 then
maxy := StrToInt(trim(rightstr(sortlistsortlist.Count - 1, 10)));//午时初
///#####################################
ss := floorLine.Text;
application.ProcessMessages;
curp := maxx;
curp0 := -1;
path := '';
while curp0 <> curp do//八极之四隅之巳,从卯末到午初
begin
application.ProcessMessages;
curp0 := curp;
//for i := 0 to PointList.Count - 1 do
for i := PointList.Count - 1 downto 0 do
if TPointLine(PointListi).floor = -1 then
begin
if (TPointLine(PointListi).px < TPointLine(PointListmaxy).px) then
continue;
if (TPointLine(PointListi).py < TPointLine(PointListcurp0).py) then
continue;
if (TPointLine(PointListi).px = TPointLine(PointListcurp0).px) then
continue;
if (TPointLine(PointListi).py = TPointLine(PointListmaxy).py) then
continue;
if (i = curp0) then
begin
continue;
end;
if (curp0 <> curp) then
begin
if ((TPointLine(PointListi).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListi).px - TPointLine(PointListcurp0).px)) <
((TPointLine(PointListcurp).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListcurp).px - TPointLine(PointListcurp0).px)) then
begin
curp := i;
end;
end
else
curp := i;
end;
if curp0 <> curp then
begin
if floorLine.IndexOf(IntToStr(curp0)) <= -1 then
begin
floorLine.add(IntToStr(curp0));
TPointLine(pointlistcurp0).floor := curTOPstorey;
end;
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
begin
floorLine.add(IntToStr(curp));
TPointLine(pointlistcurp).floor := curTOPstorey;
end;
ss := floorLine.Text;
end;
end;
if maxy <> curp then
begin
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
begin
floorLine.add(IntToStr(curp));
TPointLine(pointlistcurp).floor := curTOPstorey;
end;
end;
// memo_seaLine.Lines.Add('3:' + path);
ss := floorLine.Text;
application.ProcessMessages;
//////////////////////////////////////
sortlist.Clear;
for i := 0 to PointList.Count - 1 do
begin
if TPointLine(PointListi).floor = -1 then
if (TPointLine(PointListi).py = TPointLine(PointListmaxy).py) then
begin
sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).px),
-
- ' ' + IntToStr(i));
end;
end;
sortlist.sort;
//for i := 0 to sortlist.Count - 1 do
for i := sortlist.Count - 1 downto 0 do
begin
floorLine.add(trim(rightstr(sortlisti, 10))); //四正之午正(含午初)
TPointLine(PointListStrToInt(trim(rightstr(sortlist\[i, 10)))]).floor :=
curTOPstorey;
end;
if sortlist.Count > 0 then
maxy := StrToInt(trim(rightstr(sortlist0, 10)));//午末
ss := floorLine.Text;
application.ProcessMessages;
//for i := 0 to PointList.Count - 1 do
//begin
// if TPointLine(PointListi).floor = -1 then //这里又产生BUG,如果为floor = -1,则没有数据,下标-1报错
// if (TPointLine(PointListi).px = TPointLine(PointListminx).px) then
// begin
// sortlist.add(rightstr('0000000000' + IntToStr(TPointLine(PointListi).py), 10) +
// ' ' + IntToStr(i));
// end;
//end;
// minx := StrToInt(trim(rightstr(sortlistsortlist.Count - 1, 10)));//酉之初
minx := StrToInt(floorLine0);//酉之初
//////////////////////////////////////
application.ProcessMessages;
curp := maxy;
curp0 := -1;
path := '';
while curp0 <> curp do//午末与酉初之间的四隅之申
begin
application.ProcessMessages;
curp0 := curp;
//for i := 0 to PointList.Count - 1 do
for i := PointList.Count - 1 downto 0 do
if TPointLine(PointListi).floor = -1 then
begin
if (TPointLine(PointListi).px > TPointLine(PointListcurp0).px) then
continue;
if (TPointLine(PointListi).px = TPointLine(PointListcurp0).px) then
continue;
if (TPointLine(PointListi).py < TPointLine(PointListminx).py) then
continue;
if (TPointLine(PointListi).py = TPointLine(PointListminx).py) then
continue;
if (i = curp0) then
begin
continue;
end;
if (curp0 <> curp) then
begin
if ((TPointLine(PointListi).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListi).px - TPointLine(PointListcurp0).px)) <
((TPointLine(PointListcurp).py - TPointLine(PointListcurp0).py) /
(TPointLine(PointListcurp).px - TPointLine(PointListcurp0).px)) then
begin
curp := i;
if TPointLine(PointListi).pcode = 'P9' then
application.ProcessMessages;
end;
end
else
begin
curp := i;
end;
end;
if curp0 <> curp then
begin
if floorLine.IndexOf(IntToStr(curp0)) <= -1 then
begin
floorLine.add(IntToStr(curp0));
TPointLine(pointlistcurp0).floor := curTOPstorey;
end;
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
begin
floorLine.add(IntToStr(curp));
TPointLine(pointlistcurp).floor := curTOPstorey;
end;
end;
end;
if minx <> curp then
begin
if floorLine.IndexOf(IntToStr(curp)) <= -1 then
begin
floorLine.add(IntToStr(curp));
TPointLine(pointlistcurp).floor := curTOPstorey;
end;
end;
// memo_seaLine.Lines.Add('4:' + path);
application.ProcessMessages;
//////////////////////////////////////
TPointLine(pointlistminy).floor := curTOPstorey;
TPointLine(pointlistmaxx).floor := curTOPstorey;
TPointLine(pointlistmaxy).floor := curTOPstorey;
TPointLine(pointlistminx).floor := curTOPstorey;
if storeyLineListcurTOPstorey.Count = 0 then
//这是仅剩下最后一点圆心的情况
begin
//ss := TPointLine(pointlistminx).Pcode;
//storeyLineListcurTOPstorey.add(ss);
//storeyLineListcurTOPstorey.add(ss);
end;
///////////////////////////////////////////////////////////////////
ss := floorLine.Text;
path := '';
for i := 0 to floorLine.Count - 1 do
begin
pline := TlinePoint.Create(nil);
pcode1 := pcodesStrToInt(floorLine\[i mod floorLine.Count)];
pcode2 := pcodesStrToInt(floorLine\[(i + 1) mod floorLine.Count)];
pcode1Shape := getpcode(pcode1);
pcode2Shape := getpcode(pcode2);
pcode1Pointer.x := pcode1Shape.Left + (pcode1Shape.Width div 2);
pcode1Pointer.y := pcode1Shape.top + (pcode1Shape.Height div 2);
pcode2Pointer.x := pcode2Shape.Left + (pcode2Shape.Width div 2);
pcode2Pointer.y := pcode2Shape.top + (pcode2Shape.Height div 2);
if ResultPathEdgesRed.IndexOf(pcode1 + pcode2) >= 0 then
begin
ScrollBox1.Canvas.pen.color := clHighlight;//clred;
ScrollBox1.Canvas.pen.Width := 4;
end
else
begin
ScrollBox1.Canvas.pen.color := clgrayText;
ScrollBox1.Canvas.pen.Width := 2;
end;
self.ScrollBox1.Canvas.Line(pcode1Pointer, pcode2Pointer); //ok
pline.beginPcode := pcode1;
pline.endPcode := pcode2;
pline.beginPoint := pcode1Pointer;
pline.endPoint := pcode2Pointer;
pline.floor := curTOPstorey;
///想不到,后来修改时,少加这句,就难找不易
linelist.Add(pline);
if pos('-->' + pcode1, path) <= 0 then
path := path + '-->' + pcode1;
if pos('-->' + pcode2, path) <= 0 then
path := path + '-->' + pcode2;
TPointLine(pointlistStrToInt(floorLine\[i mod floorLine.Count)]).floor :=
curTOPstorey;
if storeyLineListcurTOPstorey.IndexOf(
TPointLine(pointlistStrToInt(floorLine\[i mod floorLine.Count)]).Pcode) <=
-1 then
storeyLineListcurTOPstorey.add(
TPointLine(pointlistStrToInt(floorLine\[i mod floorLine.Count)]).Pcode);
end;
storeyLineListcurTOPstorey.add(
TPointLine(pointlistStrToInt(floorLine\[0)]).Pcode);
memo_seaLine.Lines.Add(path);
sortlist.Free;
floorLine.Free;
///////////////////////////////////////////////////////////////////
//refreshFromLineList(nil);
end;
begin
memo_seaLine.Lines.Clear;
pcodeAndPointLineListFromSQL;
for i := 1 to PointList.Count - 1 do
TPointLine(PointListi).floor := -1;
for i := 1 to lineList.Count - 1 do
TLinePoint(lineListi).floor := -1;
minx0 := 0;//TPoint(PointList0);
miny0 := minx0;
maxx0 := minx0;
maxy0 := minx0;
for i := 1 to PointList.Count - 1 do
// PointList: TFPList;//TPointerList;//TList; //TPointline
begin
if (TPointLine(PointListi).px < TPointLine(PointListminx0).px) then
minx0 := i;// TPoint(PointListi);
if (TPointLine(PointListi).py < TPointLine(PointListminy0).py) then
miny0 := i;// TPoint(PointListi);
if (TPointLine(PointListi).px > TPointLine(PointListmaxx0).px) then
maxx0 := i;// TPoint(PointListi);
if (TPointLine(PointListi).py > TPointLine(PointListmaxy0).py) then
maxy0 := i;// TPoint(PointListi);
end;
memo_seaLine.Lines.Add('minx=' + pcodesminx0);
memo_seaLine.Lines.Add('miny=' + pcodesminy0);
memo_seaLine.Lines.Add('maxx=' + pcodesmaxx0);
memo_seaLine.Lines.Add('maxy=' + pcodesmaxy0);
application.ProcessMessages;
memo_seaLine.Lines.Add('最外层围城线围墙:');
for i := lineList.Count - 1 downto 0 do
begin
try
//if tobject(shapeList.Itemsi) is TlinePoint then
if lineList.Itemsi <> nil then
begin
TlinePoint(lineList.Itemsi).Free;
lineList.Itemsi := nil;
lineList.Count := lineList.Count - 1;
application.ProcessMessages;
end;
except
end;
application.ProcessMessages;
end;
lineList.Clear;
for i := TPsubpPointList.Count - 1 downto 0 do
begin
try
if (TPsubpPointList.Itemsi) <> nil then
begin
TPsubpPoint(TPsubpPointList.Itemsi).Free;
TPsubpPointList.Itemsi := nil;
TPsubpPointList.Count := TPsubpPointList.Count - 1;
application.ProcessMessages;
end;
except
end;
application.ProcessMessages;
end;
TPsubpPointList.Clear;
image1.Refresh;
/////////////////////////////////////////////////////////////////
sealine000(minx0, miny0, maxx0, maxy0); //最外层,另外计算
// exit;
////////////////////////////////////////////////
setlength(storeyLineList, 1);
storeyLineList0 := TStringList.Create;
for i := 0 to linelist.Count - 1 do
begin
if storeyLineList0.IndexOf(TlinePoint(linelisti).beginPcode) <= -1 then
storeyLineList0.add(TlinePoint(linelisti).beginPcode);
if storeyLineList0.IndexOf(TlinePoint(linelisti).endPcode) <= -1 then
storeyLineList0.add(TlinePoint(linelisti).endPcode);
TlinePoint(linelisti).floor := 0;
// TPointLine(pointlistgetPcodeIndex(TlinePoint(linelist\[i).beginPcode)]).floor := 0 ;
// TPointLine(pointlistgetPcodeIndex(TlinePoint(linelist\[i).endPcode)]).floor := 0 ;
end;
// storeyLineList0.add(tstringlist(storeyLineList0)0);
ss := storeyLineList0.Text; //第一层,已是首尾相接
for i := 0 to storeyLineList0.Count - 1 do
begin
ss := (storeyLineList0i);
if ss = 'P1' then
application.ProcessMessages;
j := getPcodeIndex(ss);
TPointLine(pointlistj).floor := 0;
end;
TPointLine(pointlistminy0).floor := 0;
TPointLine(pointlistmaxx0).floor := 0;
TPointLine(pointlistmaxy0).floor := 0;
TPointLine(pointlistminx0).floor := 0;
/////////////////////////
i := 1;
while i > 0 do
begin
i := 0;
for j := 0 to pointlist.Count - 1 do
//pointlist所有点集,未分层的全点集
if TPointLine(pointlistj).floor = -1 then
I := i + 1;
if i = 1 then
application.ProcessMessages;
if i > 0 then
seaLineLayer(0, 0, 0, 0); //求出所有层
end;
////////////////////////
for i := 0 to length(storeyLineList) - 1 do //每一层点集
memo_seaLine.Lines.Add(IntToStr(i) + '=' + storeyLineListi.Text);
// exit;
for i := 0 to length(storeyLineList) - 2 do //每一层点集
//for i := 0 to length(storeyLineList) - 3 do //每一层点集 for test
begin
for k := 0 to storeyLineListi + 1.Count - 2 do
// if (TlinePoint(linelistj).floor = (i + 1)) then // j in high j要高层内层,k在低层外层
// if (TlinePoint(linelistk).floor = (i)) then // k out lower j要高层内层,k在低层外层
//if (TlinePoint(linelistk).floor <>-111) then
begin
for lmn := pointList.Count - 1 downto 0 do
if TPointLine(pointListlmn).pcode = ((storeyLineListi + 1)k) then
break;
if TPointLine(pointListlmn).floor = -111 then
continue;
ss := ((storeyLineListi + 1)k);
//if k = 3 then break;
//if k = 2 then
application.ProcessMessages;
ss := storeyLineListi.Text;
minH := 10000000;
ij := -1;
ik := -1;
jjj := -1;
for j := 0 to storeyLineListi.Count - 2 do
begin
curminH := (PPLong(fromPcodeGetPoint((storeyLineListi + 1)
k), fromPcodeGetPoint((storeyLineListi)j)) +
PPLong(fromPcodeGetPoint((storeyLineListi + 1)k),
fromPcodeGetPoint((storeyLineListi)(j + 1) mod storeyLineList\[i.Count])) -
PPLong(fromPcodeGetPoint((storeyLineListi)j), fromPcodeGetPoint(
(storeyLineListi)(j + 1) mod storeyLineList\[i.Count])));
if curminH < minH then
begin
minH := curminH;
ij := j; //ii j in high
ik := k; //iii k out lower
jjj := 1;
end;
end;
/////////////////////////////////////////
if jjj = 1 then
begin
pline := TlinePoint.Create(nil);
pline.beginPcode := ((storeyLineListi)ij);
pline.endPcode := ((storeyLineListi + 1)ik);
pline.beginPoint := fromPcodeGetPoint((storeyLineListi)ij);
pline.endPoint := fromPcodeGetPoint((storeyLineListi + 1)ik);
pline.floor := i;
linelist.Add(pline);
pline := TlinePoint.Create(nil);
pline.beginPcode := ((storeyLineListi)(ij + 1) mod storeyLineList\[i.Count]);
pline.endPcode := ((storeyLineListi + 1)ik);
pline.beginPoint := fromPcodeGetPoint((storeyLineListi)
(ij + 1) mod storeyLineList\[i.Count]);
pline.endPoint := fromPcodeGetPoint((storeyLineListi + 1)ik);
pline.floor := i;
linelist.Add(pline);
memo_seaLine.Lines.Add(((storeyLineListi)ij) +
((storeyLineListi + 1)ik) + '和' + ((storeyLineListi)
(ij + 1) mod storeyLineList\[i.Count]) + ((storeyLineListi + 1)
ik) + '替换' + ((storeyLineListi)ij) + ((storeyLineListi)
(ij + 1) mod storeyLineList\[i.Count]));
for jjj := lineList.Count - 1 downto 0 do
begin
if (TlinePoint(linelistjjj).beginPcode + TlinePoint(
linelistjjj).endPcode) = ((storeyLineListi)
ij) + ((storeyLineListi)(ij + 1) mod storeyLineList\[i.Count]) then
TlinePoint(linelistjjj).floor := -111;
if (TlinePoint(linelistjjj).endPcode + TlinePoint(
linelistjjj).beginPcode) = ((storeyLineListi)
ij) + ((storeyLineListi)(ij + 1) mod storeyLineList\[i.Count]) then
TlinePoint(linelistjjj).floor := -111;
end;
for jjj := pointList.Count - 1 downto 0 do
if TPointLine(pointListjjj).pcode = ((storeyLineListi + 1)ik) then
TPointLine(pointListjjj).floor := -111;
//tstringlist(storeyLineListi)ij+1.Delete;
//tstringlist(storeyLineListi)ij.Delete;
TStringList(storeyLineListi).insert(ij + 1,
TStringList(storeyLineListi + 1)ik);
end;
//if jjj = 2 then
begin
end;
end; //k
///////////////////////////////////////////
// for j := 0 to storeyLineListi+1.Count - 1 do
for j := lineList.Count - 1 downto 0 do
if TlinePoint(linelistj).floor = i + 1 then
TlinePoint(linelistj).floor := -111;
ss := TStringList(storeyLineListi + 1).Text;
TStringList(storeyLineListi + 1).Clear;
ss := TStringList(storeyLineListi).Text;
for j := 0 to TStringList(storeyLineListi).Count - 1 do
TStringList(storeyLineListi + 1).add(TStringList(storeyLineListi)j);
TStringList(storeyLineListi).Clear;
// TStringList(storeyLineListi + 1).Text:=TStringList(storeyLineListi).text;
// TStringList(storeyLineListi).Clear;
end; //i
//新线立即加上,原线标记下次删除之,下面的就是互换的代码,替代不能直接删除而已
tempLineList := TFPList.Create;
//P91P91:0 P1P1:0 P10P10:0 P100P100:0 如此造成统计点数出错的
for i := lineList.Count - 1 downto 0 do
if TlinePoint(linelisti).floor <> -111 then
if TlinePoint(linelisti).beginPcode = TlinePoint(linelisti).endPcode then
TlinePoint(linelisti).floor := -111;
//P91P91:0 P1P1:0 P10P10:0 P100P100:0 如此造成统计点数出错的
for i := lineList.Count - 1 downto 0 do
begin
try
if TlinePoint(linelisti).floor <> -111 then
begin
pline := TlinePoint.Create(nil);
pline.beginPcode := TlinePoint(linelisti).beginPcode;
pline.endPcode := TlinePoint(linelisti).endPcode;
pline.beginPoint := TlinePoint(linelisti).beginPoint;
pline.endPoint := TlinePoint(linelisti).endPoint;
pline.floor := TlinePoint(linelisti).floor;
tempLineList.Add(pline);
end;
except
end;
application.ProcessMessages;
end;
for i := lineList.Count - 1 downto 0 do
begin
try
// if TlinePoint(linelisti).floor<>-111 then
if lineList.Itemsi <> nil then
begin
TlinePoint(lineList.Itemsi).Free;
lineList.Itemsi := nil;
lineList.Count := lineList.Count - 1;
application.ProcessMessages;
end;
except
end;
application.ProcessMessages;
end;
lineList.Clear;
for i := tempLineList.Count - 1 downto 0 do
begin
try
// if TlinePoint(tempLineListi).floor<>-111 then
begin
pline := TlinePoint.Create(nil);
pline.beginPcode := TlinePoint(tempLineListi).beginPcode;
pline.endPcode := TlinePoint(tempLineListi).endPcode;
pline.beginPoint := TlinePoint(tempLineListi).beginPoint;
pline.endPoint := TlinePoint(tempLineListi).endPoint;
pline.floor := TlinePoint(tempLineListi).floor;
LineList.Add(pline);
end;
except
end;
application.ProcessMessages;
end;
for i := tempLineList.Count - 1 downto 0 do
begin
try
// if TlinePoint(linelisti).floor<>-111 then
if tempLineList.Itemsi <> nil then
begin
TlinePoint(tempLineList.Itemsi).Free;
tempLineList.Itemsi := nil;
tempLineList.Count := lineList.Count - 1;
application.ProcessMessages;
end;
except
end;
application.ProcessMessages;
end;
tempLineList.Clear;
tempLineList.Free;
for i := pointList.Count - 1 downto 0 do
TPointLine(pointListi).floor := -1;
onelong := 0.0;
alllong := 0.0;
//memo_seaLine.Lines.Add('总路径:总点数:' + IntToStr(lineList.Count));
//for i := lineList.Count - 1 downto 0 do
//for j := i-1 downto 0 do
//if TlinePoint(linelisti).beginPcode+TlinePoint(linelisti).endPcode=
//TlinePoint(linelistj).beginPcode+TlinePoint(linelistj).endPcode then
// TlinePoint(linelisti).floor:=-123;
// memo_seaLine.Lines.Add( TlinePoint(linelisti).beginPcode+TlinePoint(linelisti).endPcode);
memo_seaLine.Lines.Add('总路径:总点数:' + IntToStr(lineList.Count));
//P91P91:0 P1P1:0 P10P10:0 P100P100:0 如此造成统计点数出错的
for i := lineList.Count - 1 downto 0 do
begin
try
onelong := pplong(TlinePoint(linelisti).beginPoint, TlinePoint(
linelisti).endPoint);
memo_seaLine.Lines.Add(TlinePoint(linelisti).beginPcode +
TlinePoint(linelisti).endPcode + ':' + floattostr(onelong));
alllong := alllong + onelong;
TPointLine(pointListgetpcodeindex(TlinePoint(linelist\[i).beginPcode)]).floor
:= 1;
TPointLine(pointListgetpcodeindex(TlinePoint(linelist\[i).endPcode)]).floor := 1;
except
end;
application.ProcessMessages;
end;
memo_seaLine.Lines.Add('总路长:' + floattostr(alllong));
ss := '';
for i := pointList.Count - 1 downto 0 do
if TPointLine(pointListi).floor = -1 then
ss := ss + TPointLine(pointListi).pcode + ',';
if ss <> '' then
ShowMessage(ss + '这些点没有被处理');
//同心圆的中心点暂未处理,因为结果不理想,无兴趣理会
//sleepli(2);
//refreshFromLineList(nil);
refrash.Click;
//refreshClick(sender);
end;