диссертация модальная логика
.pdf-371 -
Приложение 1
end;
TIznos = class(TForm) OutSpace: TShape; PanelUpr: TPanel; Razdel: TSplitter; NObTrack: TTrackBar; Shkala: TPaintBox; sbVar: TStatusBar;
procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject); procedure FormResize(Sender: TObject); procedure ShkalaPaint(Sender: TObject); procedure NObTrackChange(Sender: TObject);
procedure NObTrackKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
private
{ Private declarations }
function DisplayPoint(InPoint: TPoint2D; InGab: TGab2D): TPoint; flmction GetIndNOb(NCur; integer): integer;
public
{ Public declarations } ArraySheyka: PArraySheyka; ArrayPolar: PArrayPolar; Arraylznos: PArraylznos;
Taktnost: byte;
NOfX: integer;
NOfZ: integer;
CurNOb: integer;
DCyl: real;
NOfPoints: integer;
SourceFile: string;
Precis: byte;
GabLoc: TList;
CurGab: integer;
NameOfForce: string;
PoleKoof: real;
-372-
Приложение 1
chPolar: boolean; chlznos: boolean; chFit: boolean; NamePrtp: string;
procedure GetArrayBase; procedure GetGabarits; procedure FreeMemory; end;
var
Iznos: TIznos;
implementation
uses MainUnit, Tools;
{$R *.DFM}
procedure TIznos.FormCreate(Sender: TObject); begin
PoleKoof:=5;
Precis:=100;
chPolar;=true;
chIznos:=true;
chFit:=false;
GabLoc:=TList.Create;
Razdel.Enabled:=false;
end;
procedure TIznos.GetArrayBase; var
faResource: TFileStream;
ResolAng: integer;
KvazyFi: extended;
- 373 -
Приложение 1
NumberOfPoint: integer;
Fi: integer;
MaxSumma: real;
i,j: integer; tempPolar: TPoint2D; NewPolar: PPoint2D; NewDlznos: PDIznos; NewGab: PGab;
begin {procedure GetArrayBase}
//открываем файл-ресурс faResource:=TFileStreani.Create(Soiu-ceFile,fmOpenRead);
//определяем требуемое количество точек по X ResolAng:=trunc(Talctnost/2*360); NOfX:=round(ResolAng*Precis/100);
//определяем общее количество точек в массиве NOfPoints:=NOfX*NOfZ;
//создаем в памяти массив координат щеек getmem(ArraySheyka,NOfZ*sizeof(TPoint2D));
//создаем в памяти массив указателей на точки getmem(ArrayPolar,NOfPoints*sizeof(PPoint2D));
//создаем в памяти массив указателей на данные для диаграмм износа getmem(ArrayIznos,NOfZ*sizeof(PDIznos));
//считываем данные из файла-ресурса
NumberOfPoint:=l; forj:=I to NOfZ do begin
/// считываем данные для координат щеек {$R-}
ArraySheyka^|j]-X:=0;
if copy(NameOfForce, 1,2)='щщ'
then faResource.ReadBuffer(ArraySheyka^[j]. Y,sizeof(real)) else ArraySheyka'^Ol-Y-O;
{$R+}
/// считываем данные для полярной диаграммы KvazyFi:=0;
for Fi:=0 to (ResolAng-1) do begin faResource.ReadBuffer(tempPolar,sizeof(real)*2);
if FI=trunc(KvazyFi) then begin // проверка на попадание в треб. проц. new(NewPolar);
-374-
Приложение 1
////формируем координаты точки ЫешРокгЛХ :=tempPolar.X; NewPolar^.Y:=tempPolar.Y;
////подцепляем новую точку к массиву указателей
{$R-} ArrayPolar^[NumberOfPoint]:=NewPolar; {$R+} inc(NumberOfPoint);
//// определение следующей отобранной точки KvazyFi:=KvazyFi+((ResolAng- l)/(NOfX-1)); end; {if}
end; {for Fi}
///считываем данные для диаграммы износа
////создаем новую диаграмму new(NewDIznos);
////считываем данные для новой диаграммы MaxSumma:=0;
fori:==l to 12 do begin faResource.ReadBuffer(NewDIznos^[i].Summa,sizeof(real)); with NewDIznos^[i] do begin
if Summa>MaxSumma then MaxSumma:=Surnma; Direct.A:=sin((30*(i-l)*Pi)/180); Direct.B:=cos((30*(i-l)*Pi)/180);
end; {with} end; {for}
for i:=l to 12 do
with NewDlznos^[i] do Koof:=l-((Summa*0.2)/MaxSumma);
//// подцепляем новую диаграмму к массиву диаграмм {$R-} Arraylznos'^[j]:=NewDlznos; {$R+}
end; {for j}
//закрываем файл-ресурс faResource.Free;
//создаем локальные габариты для каждой диаграммы GabLoc.Clear;
for i:=0 to NOfZ do begin new(NewGab); GabLoc.Add(NewGab); end; {for}
end; {procedure GetArrayBase}
procedure TIznos.GetGabarits; const
- 375 -
Приложение 1
MaxReal= 10Е30; MinReal=-10E30; var
i,j: integer;
KoofX,KoofY: real;
MaxiX,MiniX,MaxiY,MiniY: real;
qweGab: PGab;
function CalculGabarit(NunibOfGab: byte; MaX,MiX,MaY,MiY: real): TGab2D; var
qweGab: TGab2D; begin {fijnction}
with qweGab do begin
// определяем габариты диаграммы износа
if (MaX-MiX)>(MaY-MiY) then RadIzn:=(MaX-MiX)/4 else RadIzn:=(MaY-MiY)/4;
// инициализируем максимумы и минимумы if NumbOfGab=0 then begin
MaxX:=MaX; MinX:=MiX;
MaxY:=MaY; MinY:=MiY; end
else begin
///только полярная диаграмма if chIznos=false then begin MaxX:=MaX; MinX:=MiX; MaxY:=MaY; MinY:=MiY; end; {if}
///только диграмма износа
if chPolar=false and chIznos=true then begin {$R-} MaxX:=(ArraySheyka'^[NumbOfGab].X+RadIzn); MinX:=(ArraySheyka^[NumbOfGab].X-RadIzn); MaxY:=(ArraySheyka^[NumbOfGab].Y+RadIzn); MinY:=(ArraySheyka^[NumbOfGab].Y-RadIzn); {$R+}
end; {if}
/// и диаграмма износа и полярная диаграмма if chPolar=true and chIznos=true then begin
- 376 -
Приложение 1
{$R-}
if MaX<(ArraySlieyifa'^[NumbOfGab] .X+Radlzn)
then MaxX:=(ArraySheylfa'^[NumbOfGab].X+RadIzn) else MaxX:=MaX; ifMiX>(ArraySheyka^[NumbOfGab].X-RadIzn)
then MinX:=(ArraySheyka''[NumbOfGab] .X-Radlzn) else MinX:=MiX; ifMaY<(ArraySheyka^[NumbOfGab].Y+RadIzn)
then MaxY:=(ArraySheyka'^[NumbOfGab].Y+RadIzn) else MaxY:=MaY; ifMiY>(ArraySheyka'^[NumbOfGab].Y-RadIzn)
then MinY :=(ArraySheyka''[NumbOfGab]. Y-Radlzn) else MinY:=MiY;
{$R+} end; {if} end; {else}
//определяем габариты по осям GabX:=MaxX-MinX; GabY:=MaxY-MinY;
//определяем центральную точку изображения паттерна Centr2D.x:=(MaxX+MinX)/2; Centr2D.y:=(MaxY+MinY)/2;
//определяем параметры вывода картинки AbsolX:=Centr2D,x;
AbsolY:=Centr2D.y; KoofX:=(OutSpace.Width-(OutSpace.Width/PoleKoof))/GabX; KoofY:=(OutSpace.Height-(OutSpace.Height/PoleKoof))/GabY; if KoofX<KoofY then Koof:=KoofK
else Koof:=KoofY; OtnosX:=round(OutSpace.Width/2); OtnosY:=round(OutSpace.Height/2);
end;
CalculGabarit:=qwegab; end; {function}
begin {procedure GetGabarits}
// вычисляем локальные габариты for j:=l to NOfZ do begin
/// определяем максимумы и минимумы по осям для данной диаграммы MaxiX-MinReal; MiniX:=MaxReal;
Приложение 1
MaxiY:=MinReal; MiniY:=MaxReal; {$R-}
for i:=l to NODC do
with ArrayPoIar'^[(j-l)*NOfK+i]'^ do begin if MaxiX<X then MaxiX:=X;
if MiniX>X then MiniX:=X; if MaxiY<Y then MaxiY:=Y; if MmiY>Y then MiniY:=Y; end; {with}
{$R+}
/// вычисляем локальный габарит для данной диаграммы qweGab:=GabLoc.ItemsO]; qweGab^:=CalculGabarit{j,MaxiX,MiniX,MaxiY,MiniY); end; {for j}
//вычисляем общий габарит
///определяем максимумы и минршумы по осям для всех диаграмм MaxiX:=MinReal; MiniX:=MaxReai;
MaxiY:=MinReal; MiniY:=MaxReal; for j:=l to NOfZ do begin qweGab:=GabLoc.Items|j];
with qweGab^ do begm
if MaxiX<MaxX then MaxiX:=MaxX; if MiniX>MinX then MiniX:=MinX; if MaxiY<MaxY then MaxiY:=MaxY; if MiniY>MinY then MiniY:=MinY; end; {with}
end; {for j}
///вычисляем габарит для всех диаграмм qweGab:=GabLoc.Items[0]; qweGab'':=CaIculGabarit(0,MaxiX,MiniX,MaxiY,MiniY);
//устанавливаем текущий габарит
if chFit=true then CurGab:=GetIndNOb(NObTraclc.Position)+l else CurGab:=0;
end; {procedure GetGabarits}
function TIznos.DisplayPoint(InPoint: TPoint2D; InGab: TGab2D): TPoint; var
qwePoint: TPoint2D;
begin {function DisplayPoint} with qwePoint, InGab do begin
-378 -
Приложение 1
//помещаем точку относительно центральной точки X:=InPoint.X-AbsolX;
Y:=InPoint.Y-AbsolY;
//масштабируем точку относительно окна вывода X:=X*Koof;
Y:=Y*Koof;
//помещаем точку относительно главной формы приложения DisplayPoint.X:=round(X)+OtnosX+OutSpace.Left; DisplayPoint.Y:=OtnosY+OutSpace.Top+round(Y);
end; {with}
end; {function DisplayPomt}
fitnction TIznos.GetIndNOb(NCur; integer): integer; begin {function}
with NObTracli do
if NCur=Max then GetIndNOb:=NOfZ-]
else GetlndNOb: =round((NCur-Min)/Frequency); end; {fimction}
procedure TIznos.FormPaint(Sender: TObject); const
Pole = 4; var
i,j: integer;
PolyPnt 1 ,PolyPnt2,PolyPnt3: TPoint; PiePnt2,PiePnt3: TPoint; PrtpPnt2,PrtpPnt3: TPoint; 0Kvadrl,0Kvadr2: TPoint;
qwePnt: TPoint; qwePnt2D: TPoint2D; NCur: integer; qweGab,qweGab2: PGab; OldColor: TColor;
AlznosPrtp: PArraylznos;
APolarPrtp: PArrayPolar;
procedure SetMark(Ax: char; MarkVal: real; asdGab: TGab2D); var
asdPnt: TPoint;
-379- Приложение 1
asdPnt2D: TPomt2D; asdStr: string; OldColor: TColor; OldStyle: TPenStyle; begin {procedure} with Canvas do begin
// рисуем линию маркировки case Ax of
'x','X': begin asdPnt2D.X:=MarkVal; asdPnt2D.Y:=0;
end; y.'Y': begin
asdPnt2D.X:=0;
asdPnt2D.Y:=MarkVal;
end; end; {case}
asdPnt:=DisplayPoint(asdPnt2D,asdGab); case Ax of
'х','Х': asdPnt.y:=OutSpace.Height-Pole-l; y ; Y ' : asdPnt.x:=Pole+l;
end; {case} 01dStyle:=Pen.Style; Pen.Style:=psDot; Pen.Color:=clSilver; PenPos:=asdPnt; case Ax of
'x','X': LineTo(asdPnt.x,Pole);
'y','Y': LineTo(asdPnt.x+OutSpace.Width-Pole,asdPnt.y); end; {case}
Pen.Style:=01dStyle;
// выводим на экран надпись 01dColor:=Canvas.Font.Color; Font.Color:=clBlue; Brush.StyIe:=bsSolid; Brush.Color:=clWhite; asdStr:=floattostrf(Markval,ffFixed,9,l); case Ax of
'xVX':TextOut(asdPnt.x-round(TextWidth(asdSh)/2), asdPnt.y-TextHeight(asdStr),asdStr);
-380 -
Приложение 1
'y','Y': TextOut(asdPnt.x, asdPnt.y-round(TextHeight(asdStr)/2),asdStr);
end; {case} Font.Color:=01dColor; end; {with Canvas} end; {procedure}
begin {FormPaint}
/// инициализируем параметры прототипа AIznosPrtp:=nil;
APolarPrtp:=nil;
if NamePrtpo" then begin
with (MainForm.MDiChildren[GetNumbPrtp(NamePrtp)] as TIznos) do begin AIznosPrtp:=ArrayIznos;
APolarPrtp:=ArrayPolar; end; {with}
end; {if}
//
FontName:='Times New Roman'; Font.Size:=6; NCur:=GetIndNOb(NObtrack.Position); qweGab:=GabLoc.Items[CurGab];
with Canvas do begin OldColor-Pen.Color;
// строим диаграмму износа if chIznos=true then begin
if chPolar=true then qweGab2:=GabLoc.Items[NCur+l] else qweGab2:=GabLoc.Items[CurGab];
with qweGab2^ do begin {$R-}
PolyPntl :=DisplayPoint(ArraySheyka^[NCur+1 ],qweGab^); qwePnt2D.X:=ArraySheyka^[NCur+I].X-RadIzn; qwePnt2D.Y:=ArraySheyka''[NCur+l].Y-RadIzn; OKvadrI:=DisplayPoint(qwePnt2D,qweGab'^); qwePnt2D.X:=ArraySheyka^[NCur+l].X+Radlzn; qwePnt2D.Y:=ArraySheyka'^[NCur+l].Y+RadIzn; OKvadr2:=DisplayPoint(qwePnt2D,qweGab'^);
{$R+}
{$R-}
for i:==l to 12 do begin