![]() |
|
|
Курсовая работа: Градиентный метод первого порядкаbegin PP.X:=PP.X+dx; PP.Y:=PP.Y+dy end end; procedure TGraph.ChangeCurAndDrawContur(X,Y,GridDelta:integer;C:TCanvas;Dra wFirst,DrawSecond:boolean); var PP:PPoint; begin WasChanged:=true; // ChangedAfter:=true; if current.ceType<>stNONE then begin PP:=current.element; C.Brush.Style:=bsClear; C.Pen.Mode := pmNotXor; C.Pen.Color:=clBlack; C.Pen.Width:=1; if DrawFirst then C.Ellipse(PP.X-PointRadius,PP.Y- PointRadius,PP.X+PointRadius,PP.Y+PointRadius); if GridDelta>1 then begin PP.X:=round(X/GridDelta)*GridDelta; PP.Y:=round(Y/GridDelta)*GridDelta end else begin PP.X:=X; PP.Y:=Y end; if DrawSecond then C.Ellipse(PP.X-PointRadius,PP.Y- PointRadius,PP.X+PointRadius,PP.Y+PointRadius); C.Pen.Mode := pmCopy; C.Brush.Style:=bsSolid; end; end; procedure getArrowCoord(Fx,Fy,Tx,Ty:integer;R,Alpha:Integer;var Ar1X,Ar1Y,Ar2X,Ar2Y:integer); var CosV,SinV,D,CosAd2:extended; a,b,c,Descr:extended; y1,y2,x1,x2:extended; RCosAd2,RSinAd2:integer; begin D := sqrt((FX-TX)*(FX-TX)+(FY-TY)*(FY-TY)); if D<>0 then CosV := (FX-TX) / D else CosV:=0; if CosV = 0 then begin RCosAd2 := round(R*Cos(Pi*Alpha/360)); RSinAd2 := round(R*Sin(Pi*Alpha/360)); Ar1X := TX + RSinAd2; Ar2X := TX - RSinAd2; if TY>FY then Ar1Y := TY - RCosAd2 else Ar1Y := TY + RCosAd2; Ar2Y := Ar1Y; end else begin SinV := (FY-TY) / D; CosAd2 := Cos(Pi*Alpha/360); a:=1; b:=-2*CosAd2*SinV; c:=CosAd2*CosAd2-CosV*CosV; Descr := b*b - 4*a*c; y1 := (-b - sqrt(Descr))/(2*a); y2 := (-b + sqrt(Descr))/(2*a); x1 := (cosAd2 - sinV*y1) / cosV; x2 := (cosAd2 - sinV*y2) / cosV; Ar1X:=round(x1*R)+Tx; Ar2X:=round(x2*R)+Tx; Ar1Y:=round(y1*R)+Ty; Ar2Y:=round(y2*R)+Ty; end end; procedure TGraph.DrawConnections(C:TCanvas;minW,minH,maxW,maxH:integer); var i:integer; PC:PConnection; Ar1X,Ar1Y,Ar2X,Ar2Y:integer; Poly:array[0..2]of Windows.TPoint; D:extended; FX,FY,TX,TY:integer; s:string; W,H,X,Y:integer; begin C.Pen.Color := clBlue; for i:=0 to Connections.Count-1 do begin C.Brush.Color := clBlue; PC:=Connections[i]; if Selected.element = PC then C.Pen.Width:=2 else C.Pen.Width:=1; C.moveto(PC.fromPoint.X,PC.fromPoint.Y); C.lineto(PC.toPoint.X,PC.toPoint.Y); FX:=PC.fromPoint.X; FY:=PC.fromPoint.Y; TX:=PC.toPoint.X; TY:=PC.toPoint.Y; D := sqrt((FX-TX)*(FX-TX)+(FY-TY)*(FY-TY)); if D<>0 then begin TX := round( TX - PointRadius*(TX-FX)/D ); TY := round( TY - PointRadius*(TY-FY)/D ); end; getArrowCoord(FX,FY,TX,TY,10,45,Ar1X,Ar1Y,Ar2X,Ar2Y); // getArrowCoord(PC.fromPoint.X,PC.fromPoint.Y,PC.toPoint.X,PC.toPoint. Y,Poin tRadius,10,45,Ar1X,Ar1Y,Ar2X,Ar2Y); Poly[0].x := TX; Poly[0].y := TY; Poly[1].x := Ar1X; Poly[1].y := Ar1Y; Poly[2].x := Ar2X; Poly[2].y := Ar2Y; C.Polygon(Poly); s:=inttostr(PC.Value); H:=C.TextHeight('A'); W:=C.TextWidth(s); X:=round((FX+TX-W)/2)-3; Y:=round((FY+TY-H)/2)-1; C.Brush.Color := clWhite; C.Rectangle(X,Y,X+W+7,Y+H+2); C.Brush.style:=bsClear; C.TextOut(X+3,Y+1,s); C.Brush.style:=bsSolid; { C.moveto(Ar1X,Ar1Y); C.lineto(PC.toPoint.X,PC.toPoint.Y); C.moveto(Ar2X,Ar2Y); C.lineto(PC.toPoint.X,PC.toPoint.Y); } end end; procedure TGraph.DrawPoints(C:TCanvas;minW,minH,maxW,maxH:integer); var i:integer; PP:PPoint; H,W:integer; X1,X2,Y1,Y2:integer; s:string; begin C.Brush.Style := bsSolid; C.Brush.Color := clWhite; C.Pen.Color := clBlack; for i:=0 to Points.Count-1 do begin PP:=Points[i]; if Selected.element = PP then C.Pen.Width:=2 else C.Pen.Width:=1; // C.Ellipse(PP.X-PointRadius,PP.Y- PointRadius,PP.X+PointRadius,PP.Y+PointRadius+10); X1:=PP.X-PointRadius; Y1:=PP.Y-PointRadius; X2:=PP.X+PointRadius; Y2:=PP.Y+PointRadius; if(X1<maxW)and(Y2<=maxH)and(X2>minW)and(Y2>minH)then C.Ellipse(X1,Y1,X2,Y2); s:=inttostr(PP.Value); H:=C.TextHeight('A'); W:=C.TextWidth(s); C.TextOut(round(PP.X-W/2),round(PP.Y-H/2),s) end; C.Brush.Style := bsClear; C.Font.Color:=clBlack; C.Font.Style:=[fsBold]; for i:=0 to Points.Count-1 do begin PP:=Points[i]; s:=inttostr(PP.UIN); H:=C.TextHeight('A'); W:=C.TextWidth(s); C.TextOut(round(PP.X+PointRadius-W/2),PP.Y-PointRadius-H-1,s) end; C.Font.Style:=[]; C.Brush.Style := bsSolid; end; procedure TGraph.DrawGraph(C:TCanvas;minW,minH,maxW,maxH:integer); begin DrawConnections(C,minW,minH,maxW,maxH); DrawPoints(C,minW,minH,maxW,maxH); end; procedure TGraph.AddPoint(X,Y:integer;Value:integer); var PP:PPoint; begin WasChanged:=true; ChangedAfter:=true; MaxUIN:=MaxUIN+1; new(PP); PP.UIN:=MaxUIN; PP.X:=X; PP.Y:=Y; PP.Value:=Value; Points.Add(PP); end; function TGraph.CheckCicle(FP,TP:PPoint):boolean; var List : TList; PC:PConnection; CurP:PPoint; i:integer; begin Result:=true; List:= TList.create; List.add(TP); while List.Count<>0 do begin CurP:=List.first; List.delete(0); if CurP = FP then begin Result:=false; break end; for i:=0 to Connections.Count-1 do begin PC:=Connections[i]; if PC.fromPoint = CurP then List.Add(PC.toPoint) end end; List.clear; List.Destroy end; function TGraph.AddConnection(fromPoint,toPoint:PPoint;Value:integer):boolean; var PC:PConnection; begin if(fromPoint<>toPoint) and CheckCicle(fromPoint,toPoint) then begin WasChanged:=true; ChangedAfter:=true; new(PC); PC.fromPoint:=fromPoint; PC.toPoint:=toPoint; PC.Value:=Value; Connections.Add(PC); Result:=true end else Result:=false end; procedure TGraph.SaveToFile(filename:string); var f:file; PP:PPoint; PC:PConnection; i:integer; begin assign(f,filename); rewrite(f,1); BlockWrite(f,Points.Count,SizeOf(integer)); BlockWrite(f,Connections.Count,SizeOf(integer)); for i:=0 to Points.Count-1 do begin PP:=Points[i]; BlockWrite(f,PP,SizeOf(PP)); BlockWrite(f,PP^,SizeOf(PP^)); end; for i:=0 to Connections.Count-1 do begin PC:=Connections[i]; // BlockWrite(f,PC,SizeOf(PC)); BlockWrite(f,PC^,SizeOf(PC^)); end; close(f); end; procedure TGraph.OpenFromFile(filename:string); type PAddr = ^TAddr; TAddr = record Old,New:pointer; end; var f:file; Addresses:TList; PA:PAddr; PP:PPoint; PC:PConnection; p:pointer; i,NOP,NOC:integer; procedure SetNewAddr(iOld,iNew:pointer); var PA:PAddr; begin new(PA); PA.Old:=iOld; Pa.New:=iNew; Addresses.add(PA) end; function GetNewAddr(Old:pointer):pointer; var i:integer; begin Result:=nil; for i:=0 to Addresses.Count-1 do if PAddr(Addresses[i]).Old = Old then begin Result:=PAddr(Addresses[i]).New; Break end; end; begin MaxUIN:=0; Clear; WasChanged:=false; ChangedAfter:=false; Addresses:=TList.Create; assign(f,filename); reset(f,1); BlockRead(f,NOP,SizeOf(integer)); BlockRead(f,NOC,SizeOf(integer)); for i:=0 to NOP-1 do begin new(PP); BlockRead(f,p,SizeOf(p)); BlockRead(f,PP^,SizeOf(PP^)); Points.Add(PP); SetNewAddr(p,PP); If MaxUIN < PP.UIN then MaxUIN:=PP.UIN end; for i:=0 to NOC-1 do begin new(PC); BlockRead(f,PC^,SizeOf(PC^)); PC.toPoint:=GetNewAddr(PC.toPoint); PC.fromPoint:=GetNewAddr(PC.fromPoint); Connections.Add(PC); end; close(f); while Addresses.Count<>0 do begin PA:=Addresses.first; Addresses.Delete(0); dispose(PA); end; Addresses.Destroy end; function TGraph.IsChanged:boolean; begin Result:=WasChanged end; function TGraph.WasChangedAfter:boolean; begin Result:=ChangedAfter; ChangedAfter:=false; end; function TGraph.GetPointByID(ID:integer):PPoint; var PP:PPoint; i:integer; begin Result:=nil; for i:=0 to Points.Count-1 do begin PP:=Points[i]; if PP.UIN=ID then begin Result:=PP; break end; end; end; function TGraph.GetPoints:TList; begin Result:=Points end; function TGraph.GetConnections:TList; begin Result:=Connections end; procedure TGraph.ChangeValue(Elem:CurElement;Value:integer); begin if Elem.element<>nil then begin case Elem.ceType of stPOINT:PPoint(Elem.element).Value:=Value; stCON :PConnection(Elem.element).Value:=Value; end; WasChanged:=true; ChangedAfter:=true end end; // --- SubMerger --- // constructor TSubMerger.Create; begin Points := TList.Create; AllProcTasks := TList.Create; Procs:=TList.Create; Links:=TList.Create end; procedure TSubMerger.ClearProcs(FreeElements:boolean); var PPT:PProcTask; PH:PHolder; tmpPoint:pointer; List:TList; begin Selected:=nil; while Procs.Count<>0 do begin List:=Procs.first; Procs.delete(0); while List.Count<>0 do begin PPT:=List.first; List.delete(0); PH:=PPT.Prev; while PH<>nil do begin tmpPoint:=PH.Next; dispose(PH); PH:=tmpPoint end; PPT.Prev:=nil; PPT.MayBeAfter:=false; PPT.MayBeBefore:=false; if FreeElements then dispose(PPT); end; List.destroy; end; if FreeElements then AllProcTasks.clear; end; procedure TSubMerger.ClearLinks(FreeElements:boolean); var PLT:PLinkTask; List:TList; begin while Links.Count<>0 do begin List:=Links.first; Links.delete(0); while List.Count<>0 do begin PLT:=List.first; List.delete(0); PLT.PrevLink:=nil; PLT.PrevTask:=nil; if FreeElements then dispose(PLT); end; List.destroy; end; end; procedure TSubMerger.Clear; var PPP:PProcPoint; PPC:PProcCon; begin while Points.Count<>0 do begin PPP:=Points.first; Points.delete(0); while PPP.Prev<>nil do begin PPC:=PPP.Prev.Next; dispose(PPP.Prev); PPP.Prev:=PPC end; while PPP.Next<>nil do begin PPC:=PPP.Next.Next; dispose(PPP.Next); PPP.Next:=PPC end; dispose(PPP) end; ClearLinks(true); ClearProcs(true); AllProcTasks.Clear; { while FProcTasks.Count<>0 do begin PPT:=FProcTasks.first; FProcTasks.delete(0); dispose(PPT) end; while FLinkTasks.Count<>0 do begin PLT:=FLinkTasks.first; FLinkTasks.delete(0); dispose(PLT) end; } end; function TSubMerger.GetProcPointByUIN(UIN:integer):PProcPoint; var i:integer; begin Result:=nil; for i:=0 to Points.Count-1 do if PProcPoint(Points[i]).UIN = UIN then begin Result:=Points[i]; break end; end; function TSubMerger.GetProcTaskByUIN(UIN:integer):PProcTask; var i:integer; begin Result:=nil; for i:=0 to AllProcTasks.Count-1 do if PProcTask(AllProcTasks[i]).UIN = UIN then begin Result:=AllProcTasks[i]; break end; end; procedure TSubMerger.Init(GPoints,GConnections:TList); var i:integer; PP:PPoint; PC:PConnection; PPP:PProcPoint; PPC:PProcCon; begin Clear; for i:=0 to GPoints.Count-1 do begin PP:=GPoints[i]; new(PPP); PPP.UIN := PP.Uin; PPP.Value := PP.Value; PPP.UBorder:=0; PPP.DBorder:=$8FFFFFFF; PPP.UFixed:=false; PPP.DFixed:=false; PPP.UCon:=0; PPP.DCon:=0; PPP.Prev:=nil; PPP.Next:=nil; Points.Add(PPP); end; for i:=0 to GConnections.Count-1 do begin PC:=GConnections[i]; PPP := GetProcPointByUIN(PC.fromPoint.UIN); new(PPC); PPC.Value := PC.Value; PPC.toPoint := GetProcPointByUIN(PC.toPoint.UIN); PPC.Next := PPP.Next; PPP.Next := PPC; PPP := GetProcPointByUIN(PC.toPoint.UIN); new(PPC); PPC.Value := PC.Value; PPC.toPoint := GetProcPointByUIN(PC.fromPoint.UIN); PPC.Next := PPP.Prev; PPP.Prev := PPC; end; end; procedure SetUBorderToPPP(PPP:PProcPoint;Value:integer); var PPC:PProcCon; Fix:boolean; begin if PPP.UBorder < Value then PPP.UBorder := Value; PPC:=PPP.Prev; Fix:=true; while PPC<>nil do begin if not PPC.toPoint.DFixed then begin Fix:=false; Break end; PPC:=PPC.Next end; PPP.UFixed:=Fix end; procedure SetDBorderToPPP(PPP:PProcPoint;Value:integer); var PPC:PProcCon; Fix:boolean; begin if PPP.DBorder > Value then PPP.DBorder := Value; PPC:=PPP.Next; Fix:=true; while PPC<>nil do begin if not PPC.toPoint.UFixed then begin Fix:=false; Break end; PPC:=PPC.Next end; PPP.DFixed:=Fix end; procedure SetUBorderDown(PPP:PProcPoint;Value:integer); var PPC:PProcCon; workPPP:PProcPoint; List:TList; begin List:=TList.create; if PPP.UBorder < Value then begin PPP.UBorder := Value; List.Add(PPP); while List.Count<>0 do begin workPPP:=List[0]; List.delete(0); PPC:=workPPP.Next; while PPC<>nil do begin if PPC.toPoint.UBorder < workPPP.UBorder+1 then begin PPC.toPoint.UBorder:=workPPP.UBorder+1; List.Add(PPC.toPoint) end; PPC:=PPC.Next end; end; end; List.Destroy; end; procedure SetDBorderUp(PPP:PProcPoint;Value:integer); var PPC:PProcCon; workPPP:PProcPoint; List:TList; begin List:=TList.create; if PPP.DBorder > Value then begin PPP.DBorder := Value; List.Add(PPP); while List.Count<>0 do begin workPPP:=List[0]; List.delete(0); PPC:=workPPP.Prev; while PPC<>nil do begin if PPC.toPoint.DBorder > workPPP.DBorder-1 then begin PPC.toPoint.DBorder:=workPPP.DBorder-1; List.Add(PPC.toPoint) end; PPC:=PPC.Next end; end; end; List.Destroy; end; procedure SetProcToPPP(PPP:PProcPoint;Value:integer); var PPC:PProcCon; begin PPP.UBorder:=Value; PPP.DBorder:=Value; PPP.UFixed:=true; PPP.DFixed:=true; PPP.Merged:=true; PPC:=PPP.Prev; while PPC<>nil do begin if not PPC.toPoint.Merged then begin //if PPC.toPoint.DBorder>PPP.UBorder-1 then SetDBorderToPPP(PPC.toPoint,PPP.UBorder-1); SetDBorderToPPP(PPC.toPoint,PPP.UBorder-1); PPC.toPoint.DCon:=PPC.toPoint.DCon+PPC.Value; end; PPC:=PPC.Next; end; PPC:=PPP.Next; while PPC<>nil do begin if not PPC.toPoint.Merged then begin //if PPC.toPoint.UBorder<PPP.DBorder+1 then SetUBorderToPPP(PPC.toPoint,PPP.DBorder+1); SetUBorderToPPP(PPC.toPoint,PPP.DBorder+1); PPC.toPoint.UCon:=PPC.toPoint.UCon+PPC.Value; end; PPC:=PPC.Next; end; end; procedure TSubMerger.DoBazovoe; var i,j,p:integer; PPP:PProcPoint; PPC:PProcCon; PW,newPW:PWay; WorkList : TList; WaysList : TList; MaxWayLength : integer; s : string; //-->> Pretender:PProcPoint; NoChange:boolean; PretenderCon : integer; //-->> PPT:PProcTask; begin ClearLinks(true); ClearProcs(true); AllProcTasks.Clear; WaysList := TList.Create; WorkList := TList.Create; for i:=0 to Points.Count-1 do begin PPP:=Points[i]; PPP.UBorder:=0; PPP.DBorder:=$7FFFFFFF; PPP.UCon:=0; PPP.DCon:=0; PPP.UFixed:=false; PPP.DFixed:=false; PPP.Merged:=false; WorkList.Add(PPP) end; for i:=0 to Points.Count-1 do begin PPP:=Points[i]; PPC:=PPP.Next; while PPC<>nil do begin for j:=0 to WorkList.Count-1 do if PPC.toPoint = WorkList[j] then begin WorkList.delete(j); break end; PPC:=PPC.Next end; end; for i:=0 to WorkList.Count-1 do begin PPP:=WorkList[i]; new(PW); PW.Length:=1; PW.Numbers:=inttostr(PPP.UIN)+','; PW.Weight:=PPP.Value; PW.Current:=PPP; WorkList[i]:=PW end; while WorkList.Count<>0 do begin PW:=WorkList.first; WorkList.delete(0); if PW.Current.Next=nil then WaysList.Add(PW) else begin PPC:=PW.Current.Next; while PPC<>nil do begin new(newPW); newPW.Length:=PW.Length+1; newPW.Weight:=PW.Weight+PPC.Value+PPC.toPoint.Value; newPW.Numbers:=PW.Numbers+inttostr(PPC.toPoint.UIN)+','; newPW.Current:=PPC.toPoint; WorkList.Add(newPW); PPC:=PPC.Next end; dispose(PW) end; end; MaxWayLength := 0; for i:=0 to WaysList.Count-1 do begin PW:=WaysList[i]; if PW.Length > MaxWayLength then MaxWayLength:=PW.Length end; for i:=0 to Points.Count-1 do begin PPP:=Points[i]; if PPP.Prev = nil then SetUBorderDown(PPP,1); if PPP.Next = nil then SetDBorderUp(PPP,MaxWayLength); end; for i:=0 to Points.Count-1 do begin PPP:=Points[i]; if PPP.UBorder = PPP.DBorder then SetProcToPPP(PPP,PPP.UBorder); end; Pretender:=nil; PretenderCon:=0; repeat NoChange:=true; for i:=0 to Points.Count-1 do begin PPP:=Points[i]; if not PPP.merged then begin if PPP.UFixed and PPP.DFixed then begin if PPP.UCon > PPP.DCon then SetProcToPPP(PPP,PPP.UBorder) else SetProcToPPP(PPP,PPP.DBorder); Pretender:=nil; NoChange:=false; break end else begin if PPP.UFixed then begin if(Pretender = nil)or(PretenderCon < PPP.UCon) then begin Pretender:=PPP; PretenderCon := PPP.UCon end; end else if PPP.DFixed then begin if(Pretender = nil)or(PretenderCon < PPP.DCon) then begin Pretender:=PPP; PretenderCon := PPP.DCon end; end; end; end; end; if Pretender<>nil then begin if Pretender.UFixed then SetProcToPPP(Pretender,Pretender.UBorder) else SetProcToPPP(Pretender,Pretender.DBorder); Pretender:=nil; PretenderCon:=0; NoChange:=false; end; until NoChange; for i:=0 to Points.Count-1 do begin PPP:=Points[i]; new(PPT); PPT.ProcNum:=PPP.UBorder; PPT.ProcNum:=PPP.DBorder; PPT.Ready:=0; PPT.UIN:=PPP.UIN; PPT.StartTime:=0; PPT.Length:=PPP.Value; PPT.Prev:=nil; PPT.MayBeAfter:=false; PPT.MayBeBefore:=false; PPC:=PPP.Prev; while PPC<>nil do begin PPT.Ready:=PPT.Ready+1; PPC:=PPC.next end; j:=0; while j<=AllProcTasks.Count-1 do begin if PProcTask(AllProcTasks[j]).Ready > PPT.Ready then break; j:=j+1; end; AllProcTasks.Add(PPT); end; FormLinkTasksAndSetTimes(MaxWayLength); end; procedure SetProcTimes(List:TList); var i,j:integer; PPT:PProcTask; PH:PHolder; Time,dTime:integer; begin Time:=1; for i:=0 to List.Count-1 do begin PPT:=List[i]; PPT.StartTime:=Time; Time:=Time+PPT.Length; end; for i:=0 to List.Count-1 do begin PPT:=List[i]; Time:=PPT.StartTime; PH:=PPT.Prev; while PH<>nil do begin if PH.Task<>nil then begin if Time < PH.Task.StartTime+PH.Task.Length then Time:= PH.Task.StartTime+PH.Task.Length end else begin if Time < PH.Link.StartTime+PH.Link.Length then Time:= PH.Link.StartTime+PH.Link.Length end; PH:=PH.Next end; if Time > PPT.StartTime then begin dTime:=Time-PPT.StartTime; PPT.StartTime:=Time; for j:=i+1 to List.Count-1 do PProcTask(List[j]).StartTime:=PProcTask(List[j]).StartTime+dTime end; end; end; procedure SetProcStartTimes(List:TList); var i:integer; PPT:PProcTask; Time:integer; begin Time:=1; for i:=0 to List.Count-1 do begin PPT:=List[i]; PPT.StartTime:=Time; Time:=Time+PPT.Length; end; end; function PLT_TimeCompare(I1,I2:Pointer):integer; var D1,D2:integer; Item1,Item2:PLinkTask; begin Item1:=I1; Item2:=I2; if Item1.StartTime<Item2.StartTime then Result:=-1 else if Item1.StartTime>Item2.StartTime then Result:=1 else begin if Item1.toProc = Item2.toProc then begin if Item1.toTask.StartTime<Item2.toTask.StartTime then Result:=-1 else if Item1.toTask.StartTime>Item2.toTask.StartTime then Result:=1 else Result:=0 end else begin D1:=Item1.toProc - Item1.fromProc; D2:=Item2.toProc - Item2.fromProc; if D1>D2 then Result:=1 else if D1<D2 then Result:=-1 else begin if Item1.toProc<Item2.toProc then Result:=-1 else if Item1.toProc>Item2.toProc then Result:=1 else Result:=0 end; end; end; end; procedure SetLinkTimes(List:TList); var i:integer; PLT:PLinkTask; Time:integer; begin for i:=0 to List.Count-1 do begin PLT:=List[i]; if PLT.PrevTask<>nil then Time:= PLT.PrevTask.StartTime+PLT.PrevTask.Length else Time:= PLT.PrevLink.StartTime+PLT.PrevLink.Length; PLT.StartTime:=Time; end; List.Sort(PLT_TimeCompare); Time:=1; for i:=0 to List.Count-1 do begin PLT:=List[i]; if Time>PLT.StartTime then PLT.StartTime:=Time; |
|
|||||||||||||||||||||||||||||
![]() |
|
Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое. |
||
При использовании материалов - ссылка на сайт обязательна. |