Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

диссертация модальная логика

.pdf
Скачиваний:
17
Добавлен:
25.03.2016
Размер:
8.07 Mб
Скачать

-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