Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Вращение геометрической фигуры


Автор: Жанна23 18.3.2012, 21:21
Здравствуйте!
Подскажите, почему оси координат исчезают, когда начинаю вращать параллелепипед?
И как сделать, чтобы параллелепипед вращался не где-то в стороне, а именно вокруг центра координат
Код


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    TrackBar1: TTrackBar;
    Image1: TImage;
    Button1: TButton;
    procedure TrackBar1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
   x,y,xn,yn:array[1..4] of integer;
  cosa,sina:double;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
x,y: Real;
    x0, y0: Integer;
    m: Integer;
    i: Integer;
    n: Integer;
begin
x0 := Image1.Width div 2; // центр координатной плоскости по х оси
  y0 := Image1.Height div 2; // центр координатной плоскости по у оси
  m := 25;      // масштаб

  // координатная плоскость
  Image1.Canvas.MoveTo(0, y0);
  Image1.Canvas.LineTo(ClientWidth, y0);
  Image1.Canvas.MoveTo(x0, 0);
  Image1.Canvas.LineTo(x0, ClientHeight);

  x := -7; // стартовое значение функции
  n := Abs(Round(x)); // конечное значение функции
  // шкалирование осей
  for i := Round(x) to n do
    begin
      Image1.Canvas.MoveTo(x0+i*m, y0-5);
      Image1.Canvas.LineTo(x0+i*m, y0-(-5));
      Image1.Canvas.TextOut(x0+i*m, y0+10, IntToStr(i));
      Image1.Canvas.MoveTo(x0+5, y0-m*i);
      Image1.Canvas.LineTo(x0-5, y0-m*i);
      Image1.Canvas.TextOut(x0-15, y0+i*m, IntToStr(-i));
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
x[1]:=-50 ;
y[1]:=-20 ;

x[2]:=30 ;
y[2]:=-20 ;

x[3]:=50 ;
y[3]:=20 ;

x[4]:=-30 ;
y[4]:=20 ;

end;

procedure TForm1.TrackBar1Change(Sender: TObject);
var
i:integer;

begin
label1.Caption:=Inttostr(TrackBar1.Position);
Image1.Canvas.FillRect(rect(0,0,Width,height));

cosa:=cos(2*pi*trackBar1.Position/360);
sina:=sin(2*pi*trackBar1.Position/360);
for i:=1 to 4 do
begin
    Canvas.MoveTo(200+xn[i],200+yn[i]);
    Image1.Canvas.lineTo(200+xn[i],200+yn[i]);

    xn[i]:=round((x[i]+100)*cosa-(y[i]+100)*sina);
    yn[i]:=round((x[i]+100)*sina+(y[i]+100)*cosa);

end;
end;

end.

Автор: LegionnaireFH 20.3.2012, 11:44
Здравствуйте.
Оси координат исчезают при вращении параллелепипеда из-за параметров в rect():
Код

procedure TForm1.TrackBar1Change(Sender: TObject);
Image1.Canvas.FillRect(rect(0,0,Width,height)); 

Смещение параллелепипеда по координате "x" можно добиться изменением следующего параметра (пример: 200+xn[i] на 240+xn[i]):
Код

procedure TForm1.TrackBar1Change(Sender: TObject);
Image1.Canvas.lineTo(240+xn[i],200+yn[i]);


Автор: Жанна23 20.3.2012, 20:02
Спасибо за помощь! Очень вам благодарна!!!
Как вам удаётся находить чужие ошибки? Здесь есть какой-то секрет? Неужели это просто хорошие знания Delphi ?

Автор: LegionnaireFH 20.3.2012, 20:17
Я сам начинающий программист, поэтому о хороших знаниях Delphi здесь не может идти и речи, к тому же эта программа довольно проста, можно сказать, азы программирования. А секретов тоже никаких нет, работа программы зависит (разумеется) от ее исходного кода.

Автор: Жанна23 20.3.2012, 20:25
Здоровья вам и удачи во всем!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)