диссертация модальная логика
.pdf-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;
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