Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2012, 13:00   #1
Cill
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 10
По умолчанию Построение 2D изображений. 2D аффинные преобразования

написать программу, которая имитирует приближение бумажного самолётика, выпущенного из окна замка (используя, операции масштабирования и смещения).

у меня есть эта прога только вместо самолётика стрела, помогите пожалуйста разобраться в том, что нужно изменить для того чтобы был бумажный самолётик

вот код:
var
fmLab4: TfmLab4;

implementation


{$R *.dfm}

procedure TfmLab4.FormCreate(Sender: TObject);
var
i: Integer;
y1, y2: Integer;
begin
SetLength(arrow, 9);
SetLength(arrow2, 9);
//--------------------------
arrow[0].Xn := 0; arrow[0].Yn := 0;
arrow[0].Xk := arrow[0].Xn + arrowLength; arrow[0].Yk := arrow[0].Yn;

//\-----------------------------------
arrow[1].Xn := arrow[0].Xn; arrow[1].Yn := arrow[0].Yn;
arrow[1].Xk := arrow[1].Xn + Round(spikeLength * cos(spikeangle));
arrow[1].Yk := arrow[1].Yn + Round(spikeLength * sin(spikeangle));
//<------------------------------------------
arrow[2].Xn := arrow[0].Xn; arrow[2].Yn := arrow[0].Yn;
arrow[2].Xk := arrow[2].Xn + Round(spikeLength * cos(spikeangle));
arrow[2].Yk := arrow[2].Yn - Round(spikeLength * sin(spikeangle));
//<-----///
for i := 4 to 5 do
begin
arrow[i].Xn := arrow[0].Xk - (6 - i) * Round(endLength * cos(spikeangle));
arrow[i].Yn := arrow[0].Yn;
arrow[i].Xk := arrow[i].Xn + Round(endLength * cos(spikeangle));
arrow[i].Yk := arrow[i].Yn - Round(endLength * sin(spikeangle));
end;
for i := 7 to 8 do
begin
arrow[i].Xn := arrow[0].Xk - (9 - i) * Round(endLength * cos(spikeangle));
arrow[i].Yn := arrow[0].Yn;
arrow[i].Xk := arrow[i].Xn + Round(endLength * cos(spikeangle));
arrow[i].Yk := arrow[i].Yn + Round(endLength * sin(spikeangle));
end;
//=================================== =====================
Cill вне форума Ответить с цитированием
Старый 10.05.2012, 13:01   #2
Cill
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 10
По умолчанию

продолжение кода:
for i := Low(arrow) to High(arrow) do
arrow2[i] := arrow[i];

SetLength(wall, 8);
//|
wall[0].Xn := pbOut.Width - 50; wall[0].Yn := 120;
wall[0].Xk := pbOut.Width - 50; wall[0].Yk := wall[0].Yn + WallHeight;

wall[1].Xn := pbOut.Width - 50; wall[1].Yn := wall[0].Yn;
wall[1].Xk := pbOut.Width; wall[1].Yk := wall[1].Yn - Round(WallHeight * cos(70* 3.14 / 180));

wall[2].Xn := pbOut.Width - 50; wall[2].Yn := wall[0].Yn;
wall[2].Xk := pbOut.Width; wall[2].Yk := wall[0].Yn;

wall[3].Xn := pbOut.Width - 50; wall[3].Yn := wall[0].Yn + WallHeight;
wall[3].Xk := pbOut.Width; wall[3].Yk := wall[0].Yn + WallHeight;

wall[4].Xn := wall[0].Xn + 10; wall[4].Yn := wall[0].Yn + 10;
wall[4].Xk := wall[4].Xn; wall[4].Yk := wall[4].Yn + 15;

wall[5].Xn := wall[0].Xn + 10 + 15; wall[5].Yn := wall[0].Yn + 10;
wall[5].Xk := wall[5].Xn; wall[5].Yk := wall[5].Yn + 15;

wall[6].Xn := wall[0].Xn + 10; wall[6].Yn := wall[0].Yn + 10;
wall[6].Xk := wall[6].Xn + 15; wall[6].Yk := wall[6].Yn;

wall[7].Xn := wall[0].Xn + 10; wall[7].Yn := wall[0].Yn + 10 + 15;
wall[7].Xk := wall[7].Xn + 15; wall[7].Yk := wall[7].Yn;

Trans(wall[4].Xn, wall[4].Yn);
for i := Low(arrow) to High(arrow) do
arrow[i] := arrow2[i];

ReSize(5.5);
for i := Low(arrow) to High(arrow) do
arrow[i] := arrow2[i];

Turn(40 * 3.14/ 180, (arrow2[0].Xn + arrow2[0].Xk) div 2, (arrow2[0].Yn + arrow2[0].Yk) div 2);
for i := Low(arrow) to High(arrow) do
arrow[i] := arrow2[i];

y1 := Round(0.0002 * (wall[4].Xn - 1) * (wall[4].Xn - 1) ) + 92;
SetLength(traek, Length(traek) + 1);
traek[High(traek)].X := wall[4].Xn - 1;
traek[High(traek)].y := y1;
for i := wall[4].Xn - 1 downto wall[4].Xn - 50 do
begin
SetLength(traek, Length(traek) + 1);
y2 := Round(0.0002 * i * i ) + 92;
traek[High(traek)].X := i;
traek[High(traek)].y := y2;
y1 := y2;
end;

y1 := Round(10000 / (wall[4].Xn - 50) )+ 100;;
SetLength(traek, Length(traek) + 1);
traek[High(traek)].X := wall[4].Xn - 50;
traek[High(traek)].y := y1;
for i := wall[4].Xn - 50 downto 40 do
begin
SetLength(traek, Length(traek) + 1);
y2 := Round(10000 / i )+ 100;
traek[High(traek)].X := i;
traek[High(traek)].y := y2;
y1 := y2;
end;
end;
Cill вне форума Ответить с цитированием
Старый 10.05.2012, 13:03   #3
Cill
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 10
По умолчанию

далее:
procedure TfmLab4.bbRePainAllClick(Sender: TObject);
var
i: Integer;
begin
pbOUt.Refresh;
for i := Low(arrow2) to High(arrow2) do
Brezenhem(arrow2[i].Xn, arrow2[i].Yn, arrow2[i].Xk, arrow2[i].Yk, seArrowS.Value, cbArrowColor.Selected,
rbArrowT.Checked, rbArrowSt.Checked, ArrowC.Checked, rvArrowSq.Checked,
rbArrowOt.Checked, pbOut);

for i := Low(wall) to High(wall) do
Brezenhem(wall[i].Xn, wall[i].Yn, wall[i].Xk, wall[i].Yk, seStep.Value, ColorBox2.Selected,
rbSlim.Checked, rbStret.Checked, rbCircle.Checked, rbSquare.Checked,
rbOtr.Checked, pbOut);
end;

function TfmLab4.Rotate(Vek: TMatrix; Angle: real; PointX, PointY: Real): TMatrix;
var
Bb, Cc, Dd: TMatrix;
begin
Dd[0, 0] := cos(Angle); Dd[0, 1] := sin(Angle); Dd[0, 2] := 0;
Dd[1, 0] := -sin(Angle); Dd[1, 1] := cos(Angle); Dd[1, 2] := 0;
Dd[2, 0] := 0; Dd[2, 1] := 0; Dd[2, 2] := 1;

Bb[0, 0] := 1; Bb[0, 1] := 0; Bb[0, 2] := 0;
Bb[1, 0] := 0; Bb[1, 1] := 1; Bb[1, 2] := 0;
Bb[2, 0] := -PointX; Bb[2, 1] := -PointY; Bb[2, 2] := 1;

Cc := UmnogMatric(3, 1, 3, Vek, Bb);
Cc[0, 2] := 1;
Cc := UmnogMatric(3, 1, 3, Cc, Dd);
Cc[0, 2] := 1;

Bb[0, 0] := 1; Bb[0, 1] := 0; Bb[0, 2] := 0;
Bb[1, 0] := 0; Bb[1, 1] := 1; Bb[1, 2] := 0;
Bb[2, 0] := PointX; Bb[2, 1] := PointY; Bb[2, 2] := 1;

Cc := UmnogMatric(3, 1, 3, Cc, Bb);

Result := Cc;
end;

function TfmLab4.Mashtabirovanie(Vek: TMatrix; S: real): TMatrix;
var
Bb, Dd, Cc: TMatrix;
begin
Bb[0, 0] := 1; Bb[0, 1] := 0; Bb[0, 2] := 0;
Bb[1, 0] := 0; Bb[1, 1] := 1; Bb[1, 2] := 0;
Bb[2, 0] := 0; Bb[2, 1] := 0; Bb[2, 2] := S;

Cc := UmnogMatric(3, 1, 3, Vek, Bb);

Result := Cc;
end;

function TfmLab4.Smesh(Vek: TMatrix; m, n: real): TMatrix;
var
Bb, Dd, Cc: TMatrix;
begin
Bb[0, 0] := 1; Bb[0, 1] := 0; Bb[0, 2] := 0;
Bb[1, 0] := 0; Bb[1, 1] := 1; Bb[1, 2] := 0;
Bb[2, 0] := m; Bb[2, 1] := n; Bb[2, 2] := 1;

Cc := UmnogMatric(3, 1, 3, Vek, Bb);

Result := Cc;
end;

procedure TfmLab4.ReSize(S: real);
var
i: Integer;
Aa, Cc: TMatrix;
m, n: real;
begin
m := -(1 / S - 1 )* arrow[0].Xn;
n := -(1 / S - 1 )* arrow[0].Yn;
for i := Low(arrow) to High(arrow) do
begin
Aa[0, 0] := arrow2[i].Xn;
Aa[0, 1] := arrow2[i].Yn;
Aa[0, 2] := 1;

Cc := Mashtabirovanie(Aa, S);
// Cc[0, 2] := 1;
Cc := Smesh(Cc, m, n);
arrow2[i].Xn := Round(Cc[0, 0] / S);
arrow2[i].Yn := Round(Cc[0, 1] / S);

Aa[0, 0] := arrow2[i].Xk;
Aa[0, 1] := arrow2[i].Yk;
Aa[0, 2] := 1;

Cc := Mashtabirovanie(Aa, S);
// Cc[0, 2] := 1;
Cc := Smesh(Cc, m, n);
arrow2[i].Xk := Round(Cc[0, 0] / S);
arrow2[i].Yk := Round(Cc[0, 1] / S);
end;
end;

procedure TfmLab4.Turn(fi, m, n: real);
var
i: Integer;
Aa, Bb, Cc: TMatrix;
begin
for i := Low(arrow) to High(arrow) do
begin
Aa[0, 0] := arrow[i].Xn;
Aa[0, 1] := arrow[i].Yn;
Aa[0, 2] := 1;

Cc := Rotate(Aa, fi, m, n);
arrow2[i].Xn :=Round(Cc[0, 0]);
arrow2[i].Yn := Round(Cc[0, 1]);

Aa[0, 0] := arrow[i].Xk;
Aa[0, 1] := arrow[i].Yk;
Aa[0, 2] := 1;

Cc := Rotate(Aa, fi, m, n);
arrow2[i].Xk := Round(Cc[0, 0]);
arrow2[i].Yk := Round(Cc[0, 1]);
end;

end;
Cill вне форума Ответить с цитированием
Старый 10.05.2012, 13:03   #4
Cill
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 10
По умолчанию

концовка:
procedure TfmLab4.Trans(m, n: real);
var
i: Integer;
Aa, Cc: TMatrix;
begin
for i := Low(arrow) to High(arrow) do
begin
Aa[0, 0] := arrow2[i].Xn;
Aa[0, 1] := arrow2[i].Yn;
Aa[0, 2] := 1;

Cc := Smesh(Aa, m, n);
arrow2[i].Xn := Round(Cc[0, 0]);
arrow2[i].Yn := Round(Cc[0, 1]);

Aa[0, 0] := arrow2[i].Xk;
Aa[0, 1] := arrow2[i].Yk;
Aa[0, 2] := 1;

Cc := Smesh(Aa, m, n);
arrow2[i].Xk := Round(Cc[0, 0]);
arrow2[i].Yk := Round(Cc[0, 1]);
end;
end;

procedure TfmLab4.GoToEnd;
var
i, j: Integer;
s, angle: real;
begin
s := 1.0;;
angle := - 3.58 * 3.14 / 180;
for i := Low(traek) to High(traek) do
begin
Turn(angle, (arrow[0].Xn + arrow[0].Xk) div 2, (arrow[0].Yn + arrow[0].Yk) div 2);
ReSize(S);
Trans( - arrow[0].Xn + traek[i].X, - arrow[0].Yn + traek[i].Y);
if i mod 20 = 0 then
begin
s := S - 0.035;
if i < High(traek) - 50 then
angle := angle - 3.58 * 3.14 / 180
else
angle := angle - 10.58 * 3.14 / 180;
end;

pbOut.Refresh;
for j := Low(arrow2) to High(arrow2) do
Brezenhem(arrow2[j].Xn, arrow2[j].Yn, arrow2[j].Xk, arrow2[j].Yk, seArrowS.Value, cbArrowColor.Selected,
rbArrowT.Checked, rbArrowSt.Checked, ArrowC.Checked, rvArrowSq.Checked,
rbArrowOt.Checked, pbOut);

for j := Low(wall) to High(wall) do
Brezenhem(wall[j].Xn, wall[j].Yn, wall[j].Xk, wall[j].Yk, seStep.Value, ColorBox2.Selected,
rbSlim.Checked, rbStret.Checked, rbCircle.Checked, rbSquare.Checked,
rbOtr.Checked, pbOut);

sleep(3);

end;
end;

procedure TfmLab4.EndToGo;
var
i, j: Integer;
s, angle: real;
begin
s := 0.265;
angle := -1.6181466;
for i := High(traek) downto Low(traek) do
begin
Turn(angle, (arrow[0].Xn + arrow[0].Xk) div 2, (arrow[0].Yn + arrow[0].Yk) div 2);
ReSize(S);
Trans( - arrow[0].Xn + traek[i].X, - arrow[0].Yn + traek[i].Y);
if i mod 20 = 0 then
begin
s := S + 0.035;
angle := angle + 3.58 * 3.14 / 180
end;

pbOut.Refresh;
for j := Low(arrow2) to High(arrow2) do
Brezenhem(arrow2[j].Xn, arrow2[j].Yn, arrow2[j].Xk, arrow2[j].Yk, seArrowS.Value, cbArrowColor.Selected,
rbArrowT.Checked, rbArrowSt.Checked, ArrowC.Checked, rvArrowSq.Checked,
rbArrowOt.Checked, pbOut);

for j := Low(wall) to High(wall) do
Brezenhem(wall[j].Xn, wall[j].Yn, wall[j].Xk, wall[j].Yk, seStep.Value, ColorBox2.Selected,
rbSlim.Checked, rbStret.Checked, rbCircle.Checked, rbSquare.Checked,
rbOtr.Checked, pbOut);

sleep(3);

end;
end;

procedure TfmLab4.bbStartClick(Sender: TObject);
begin
if cbEndToGo.Checked then
EndToGo
else
GoToEnd;
end;


procedure TfmLab4.rbSlimClick(Sender: TObject);
begin
gb1.Enabled := False;
end;

procedure TfmLab4.rbWideClick(Sender: TObject);
begin
gb1.Enabled := True;
end;

procedure TfmLab4.rbFullClick(Sender: TObject);
begin
seStep.Enabled := False;
end;

procedure TfmLab4.rbStretClick(Sender: TObject);
begin
seStep.Enabled := True;
end;

procedure TfmLab4.rbArrowStClick(Sender: TObject);
begin
seArrowS.Enabled := True;
end;

procedure TfmLab4.RadioButton6Click(Sender: TObject);
begin
seArrowS.Enabled := False;
end;

end.
Cill вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
2D преобразования syrga Общие вопросы Delphi 1 14.05.2012 23:50
Построение 2D изображений. 2D аффинные преобразования Продолжение Cill Мультимедиа в Delphi 1 10.05.2012 13:42
Аффинные преобразования (( Alexxiss Помощь студентам 1 17.02.2011 20:11
Аффинные преобразования meradone Общие вопросы Delphi 0 22.11.2009 15:00