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

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

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

-351 -

Приложение 1

with Gabarit do begin AbsolX:=MaxGab/2-Centr3D.X; AbsolY:=MaxGab/2-Centr3D.Y; end; {with}

end;

procedure TForce.RotLeftClick(Sender: TObject); begin

RotateBase('Y',RotAng.OXAng,true);

CalculArray2D;

OutSpace.RePaint;

end;

procedure TForce.RotRightClick(Sender: TObject); begin

RotateBase('Y',RotAng.OXAng,false);

CalculArray2D;

OutSpace.RePamt;

end;

procedure TForce.RotUpClick(Sender: TObject); begin

RotateBase('X',RotAng.OYAng,false);

CalculArray2D;

OutSpace.RePaint;

end;

procedure TForce.RotDownClick(Sender: TObject); begin

RotateBase('X',RotAng.OYAng,true);

CalculArray2D;

OutSpace.RePaint;

end;

procedure TForce.RotProCIick(Sender: TObject); begin

RotateBase('Z',RotAng.OZAng,true);

CalculArray2D;

OutSpace.RePaint;

end;

-352 -

Приложение 1

procedure TForce.RotPoClick(Sender; TObject); begin

RotateBase('Z',RotAng.OZAng,false);

CalculArray2D;

OutSpace.RePaint;

end;

procedure TForce.CreateArrayPIane; var

i,j: integer;

begin {procedure}

//определяем колргчество квадратиков NOfPlanes:=(NOfX-l)*(NOfZ-l);

//выделяем память под массив указателей getmem(ArrayPiane,NOfPlanes*sizeof(PPlane)); {$R-}

//выделяем память под квадратики

for i:=l to NOfPlanes do new(ArrayPlane^[i]);

//натягиваем квадратики на точки forj:=l to(NOfZ-l)do

fori:=l to(NOfX-l)do

with ArrayPIane'^[G-l)*(NOfX-l)+ii'^ do begin Pts[l]:=(j-l)*NOfX-i-i; Pts[2]:={j-l)*N0D(+(i+l); Pts[3]:=j*N0DC+i;

Pts[4]:=j*N0fX+(i+l);

end;

//инициализируем цвет квадратиков по умолчанию fori:=l to NOfPlanes do ArrayPlane'^[i]^.Ch:=clBtnFace;

{$R+}

end;{procedure}

procedure TForce.CalculArray2D;

// Вычисляет координаты двумерных точек существующего массива точек, var

i: integer;

begin {procedure CalculArray2D}

// вталкиваем получившуюся проекцию в поле вывода

- 353 -

Приложение 1

{$R-}

fori:=l toNOfPointsdo ArrayScreen'"[i]'":=DisplayPomt3D(ArrayBase'^[i]'^); {$R+}

end; {procedure CalculArray2D}

procedure TForce.FormResize(Sender: TObject); begin

if ArrayBaseOnil then begin

//перерасчитываем величины, зависимые от длины и хпирины формы with Gabarit do begin KoofX~(OutSpace.Width-(OutSpace.Width/PoleKoof))/MaxGab; KoofY:=(OutSpace.Height-(OutSpace.Height/PoleKoof))/MaxGab; OtnosX:=round(OutSpace.Width/(2*PoleKoof)); OtnosY:=OutSpace.Height-round(OutSpace.Height/(2*PoleKoof));

end; {with}

//перерасчет изображения

CalculArray2D;

// вывод нового изображения Repaint;

end; {if} end;

procediu-e TForce.GetArray3D; var

faResource: file of real; // указатель на файл-ресурс

Fi: integer;

// счетчик угла поворота FI (переменная по X)

KvazyFi: extended;

// счетчик требуемых координат по X

Z: integer;

// счетчик по Z

ResolX: integer;

 

// количество всех точек по X

NumberOfPoint: integer; // номер отобранной точки

TempPoint: real;

// точка, считываемая из файла

NewPoint; PPoint3D;

// указатель на новую точку

begin {}

 

 

//связываемся и открываем файл-ресурс assignfile(faResource,SourceFile); reset(faResource);

//определяем требуемое количество точек по X

-354-

Приложение 1

ResolX:=trunc(Taktnosf/2*360)+l;

NOfX:=round(ResolX*Precis/100);

//определяем общее количество точек в массиве NOfPoints:=NOfX*NOfZ;

//создаем в памяти массив указателей на точки getmem(ArrayBase,NOfPomts*sizeof(PPomt3D));

//считываем данные из файла NumberOfPoint:=l;

Z:=NBeg;

while Z<=NEnd do begin KvazyFi:=0;

for Fi:=0 to (ResolX-1) do begin

//считываем очередную строку ресурс-файла read(faResource,TempPoint);

//проверка на попадание точки в отобранное множество if FI=trunc(KvazyFi) then begin

//создаем в памяти точку

new(NewPoint);

NewPoint^.X:=Fi;

NewPoint'^.Z:=Z; NewPoinf^.Y-TempPoint;

// подцепляем новую точку к массиву указателей {$R-} ArrayBase^[NumberOflPoint]:=NewPoint; {$R+} inc(NumberOfPoint);

// определение следующей отобранной точки KvazyFi;=KvazyFi+((ResolX-l) / (NOfX-1)); end; {if FI=trunc(KvazyFi)}

end; {forFi:=l to ResolX} Z:=Z+NStep;

if (Z>NEnd)and(Zo(NEnd+NStep)) then Z:=NEnd; end; {while Z}

// закрываем файл-ресурс closefile(faResource);

end; {procedure GetArray3D}

procedure TForce.CalculGabarit; const

MaxReal= 10E30;

MinReal=-10E30;

-355 - Приложение 1
// коэф. проверки на длинную ось

TooLong=5;

 

 

var

 

 

i: integer;

 

 

ArrLong: real;

// длина стрелки у координатной оси

ArrLongKoof: real;

// коэффициент, определяющий длину стрелки

ArrAng: real;

// угол у стрелки координатной оси

BegSKPnt: Point3D;

// точка начала координат

GabX,GabY,GabZ: real;

// габариты по осям

Gabl,Gab2: real;

// габариты по выбранным базовым осям

GabDone:boolean;

// индикатор выбраны ли базовые оси

fimction SetPoint3D(X,Y,Z: real): Point3D; begin {fiinction}

SetPoint3D.X:=X;

SetPoint3D.Y:=Y;

SetPoint3D.Z:=Z; end; {fiinction}

fiinction Tan(X: real): real; begin {fiinction} Tan:=Sin(X)/Cos(X);

end; {function}

begin {procedure CalculGabarit}

//устанавливаем оси в начальное положение with SKoord do begm

AxisX.A:=l; AxisX.B:=0; AxisX.C:=0; AxisY.A:=0; AxisY.B:=l; AxisY.C:=0; AxisZ.A:=0; AxisZ.B:=0; AxisZ.C:=l; end; {with}

//определяем габариты по осям

with Gabarit do begin MaxX:=MinReal; MinX:=MaxReal; MaxY:=MinReal; MinY:=MaxReal; MaxZ:=MinReal; MinZ;=MaxRea]; {$R-}

for i:=l to NOfPoints do

with ArrayBase'^[i]'^ do begin if MaxX<X then MaxX:=X;

-356-

Приложение 1

if MinX>X then MinX:=X; if MaxY<Y then MaxY:=Y; if MinY>Y then MinY:=Y; if MaxZ<Z then MaxZ:=Z; if MinZ>Z then MinZ:=Z; end;

{$R+} end; {with}

//устанавливаем масштабы по осям

//за основу берется ось X; ось Y и ось Z в 1.5 раза меньше оси X with Gabarit,SKoord do begin

if Taiitnost=2 then MasX :=2 {Taktnost=4}else MasX:=];

MasY:=(MaxX-MinX)/(l .5*(MaxY-MinY)); MasZ:=(MaxX-MinX)/( 1.5 *(Max2-MinZ)); end; {with}

with SKoord do begin MasX:=MasX*UserMasX; MasY:=MasY*UserMasY; MasZ:=MasZ*UserMasZ; end; {with}

//изменяем массив трехмерных точек и габариты в соот. с новыми масшт. with SKoord do begin

{$R-}

for i:=l to NOfPoints do

with ArrayBase''[i]'^ do begin X:=X*MasX;

Y:=Y*MasY;

Z:=Z*MasZ; end; {with} {$R+}

with Gabarit do begin MaxX:=MaxX*MasX; MinX:=MinX*MasX; MaxY:=MaxY*MasY; MinY:=MinY*MasY; MaxZ:=MaxZ*MasZ; MinZ:=MinZ*MasZ; end; {with}

end; {with SKoord}

-357-

Приложение 1

// определяем некоторые параметры паттерна with Gabarit,SKoord do begin

//определяем габариты GabX:=MaxX-MmX; GabY:=MaxY-MinY; GabZ:=MaxZ-MinZ;

//определяем центр вращения Centr3D.X:=(MaxX+MinX)/2; Centr3D.Y:=(MaxY+MinY)/2; Cenh3D.Z:=(MaxZ+MinZ)/2;

//определяем базовую точку паттерна Base3D.X:=MinX;

Base3D.Y:=MinY;

Base3D.Z:=MinZ;

//определяем вектор смещения точки отсчета системы координат BaseSK.A:=0; // по оси изменения угла поворота коленвала

if MinY<0 then BaseSK.B;=-MinY // по оси рассматриваемой силы else BaseSK.B:=0;

BaseSK.C:=0; // по оси изменения частоты вращения коленвала

end; {with}

// выбираем две базовых оси with Gabarit do begin

// отсеивание слишком большой оси GabDone:=false;

Gabl:=MinReal;

Gab2:=MinReal;

if (((GabX/GabY)>TooLong)and((GabX/GabZ)>TooLong)) then begin Gabl:=GabY;

Gab2;=GabZ;

GabDone:=true; end; {if}

if (((GabY/GabX)>TooLong)and((GabY/GabZ)>TooLong)) then begin Gabl:=GabX;

Gab2:=GabZ;

GabDone:=true; end; {if}

if (((GabZ/GabX)>TooLong)and((GabZ/GabY)>TooLong)) then begin Gabl:=GabX;

Gab2:=GabY;

GabDone:=true;

Приложение 1

end; {if}

// если ничего не отсеяли, то выбираем две наиб, оси if GabDone=false then begin

//выбираем первы11 Gabl:=GabX;

if GabKGabY then Gabl:=GabY; if GabKGabZ then Gabl:=GabZ;

//выбираем второй

if (GabloGabX) then Gab2:=GabX;

if ((Gabl<>GabY)and(Gab2<GabY)) then Gab2:=GabY; if ((GabloGabZ)and(Gab2<GabZ)) then Gab2:=GabZ; end; {if}

end; {with}

// определяем максимальный размер проекции Gabarit.MaxGab:=Gabl*sin(arctan(Gabl/Gab2))+

Gab2*cos(arctan(Gabl/Gab2)); // определяем стрелки у координатных осей ArrAng:=Pi/12;

ArrLongKoof:=0.03;

with Gabarit,SKoord,BegSKPnt do begin ArrLong:=ArrLongKooPMaxGab;

//определяем точку начала координат X:=Base3D.X+BaseSK.A; Y:=Base3D.Y+BaseSK.B; Z:=Base3D.Z+BaseSK.C;

//определяем точки крыльев стрелок ArrPnts[l]:=SetPoint3D(MaxX-ArrLong,Y+tan(An-Ang)*ArrLong,Z); ArrPnts[2]:=SetPomt3D(MaxX-ArrLong,Y-tan(An-Ang)*ArrLong,Z); ArrPnts[3]:=SetPoint3D(MaxX-ArrLong,Y,Z+tan(ArrAng)*ArrLong); ArrPnts[4]:=SetPomt3D(MaxX-ArrLong,Y,Z-tan(ArrAng)*ArrLong);

ArrPnts[5]:=SetPoint3D(X+tan(ArrAng)*ArrLong,MaxY-ArrLong,Z);

ArrPnts[6]:=SetPoint3D(X-tan(ArrAng)*ArrLong,MaxY-ArrLong,Z);

ArrPnts[7]:=SetPoint3D(X,MaxY-ArrLong,Z+tan(ArrAng)*ArrLong);

ArrPnts[8]:=SetPoint3D(X,MaxY-ArrLong,Z-tan(ArrAng)* ArrLong);

ArrPnts[9]:=SetPoint3D(X+tan(ArrAng)*ArrLong,Y,MaxZ-ArrLong);

ArrPnts[10]:=SetPoint3D(X-tan(ArrAng)*ArrLong,Y,MaxZ-ArrLong);

ArrPnts[ll]:=SetPoint3D(X,Y+tan(ArrAng)*ArrLong,MaxZ-ArrLong);

ArrPnts[ 12] :=SetPoint3D(X,Y-tan(ArrAng)*ArrLong,MaxZ-ArrLong);

- 359 -

Приложение 1

end; {with}

// определяем параметры вывода картинки with Gabarit do begin AbsolX:=MaxGab/2-Centr3D.X; AbsolY:=MaxGab/2-Centr3D.Y;

KoofX:=(OutSpace.Width-(OutSpace.Width/PoleKoof))/MaxGab;

KoofY:=(OutSpace.Height-(OutSpace.Height/PoleKoof))/MaxGab;

OtnosX:=round(OutSpace.Width/(2*PoleKoof)); OtnosY:=OutSpace.Height-round(OutSpace.Height/(2*PoleKoof)); end; {with}

end; {procedure CalculGabarit}

function TForce.DisplayPoint3D(InPoint: Point3D):TPoint; var

qwePoint: TPoint; qweX,qweY: real;

begin {function DisplayPoint3D} with qwePoint, Gabarit do begin

//помещаем точку относительно центральной точки qweX:=InPoint.X+AbsolX;

qweY:=InPoint.Y+AbsolY;

//масштабируем точку относительно окна вывода X:=round(qweX*KoofX);

Y:=round(qweY*KoofY);

//помещаем точку относительно главной формы приложения X:=X+OtnosX+OutSpace.Lefit;

Y:=OtnosY+OutSpace.Top-Y;

end; {with} DisplayPoint3D:=qwePoint; end; {function DisplayPoint3D}

procedure TForce.FormPamt(Sender: TObject); var

i,j: integer;

ABasePrtp: РАггауЗО;

APIanePrtp: PArrayPl;

MasXPrtp,MasYPrtp,MasZPrtp: real;

-360 -

Приложение 1

Ang3DBN: TAngel3D;

Ang3DBS: TAngeBD;

procedure ShowKvadr(NumbKvadr: integer); var

k: integer;

ArrayGraf: array [1..4] of TPoint; ArrayGrafPr: array [1 ..4] of TPoint; AKvadrPrtp: array [1..4] of Point3D; begin {procedure ShowKvadr}

{$R-}

//определяем координаты выводимого квадратика в массиве вывода

///определяем координаты родного квадратика

with ArrayPlane^[NumbKvadr]^ do begin ArrayGraf[ 1 ] :=ArrayScreen''[Pts[ 1J]'^; ArrayGrafI2]:=ArrayScreen^[Pts[2]]'^; ArrayGraf[3 ] :=ArrayScreen'^[Pts[4]]'^; ArrayGrafI4]:=ArrayScreen^[Pts[3]]'^; end;

/// определяем координаты квадратика прототипа, если он есть if NamePrtpo" then begin

////копируем координаты с формы прототипа with APlanePrtp^[NumbKvadr]^ do begm AKvadrPrtp[ 1 ] :=ABasePrtp'^[Pts[ 1J]'^; AKvadrPrtp[2]:=ABasePrtp'^[Pts[2]]'^; AKvadrPrtp[3]:=ABasePrtp'^[Pts[4]]^; AKvadrPrtp[4]:=ABasePrtp^[Pts[3]]^;

end; {with}

////приводим квадратик-прототип к родному масштабу for к:=1 to 4 do begin

AKvadrPrtp[k].X:=(AKvadrPrtp[k].X/MasXPrtp)*SKoord.MasX;

AKvadrPrtp[k].Y:=(AKvadrPrtp[k].Y/MasYPrtp)*SKoord.MasY;

AKvadrPrtp[k].Z:=(AKvadrPrtp[k].Z/MasZPrtp)*SKoord.MasZ; end; {for}

////поворачиваем квадратик-прототип параллельно родному квадратику fork:=l to 4 do

with AKvadrPrtp[k] do begin

///// поворот CK квадратика до совмещения с базисной СК

with Ang3DBN do begin