|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
10.05.2012, 13:00 | #1 |
Пользователь
Регистрация: 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; //=================================== ===================== |
10.05.2012, 13:01 | #2 |
Пользователь
Регистрация: 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; |
10.05.2012, 13:03 | #3 |
Пользователь
Регистрация: 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; |
10.05.2012, 13:03 | #4 |
Пользователь
Регистрация: 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. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |