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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2011, 18:43   #1
Lisёноk
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 75
По умолчанию Рисование 3D в Delphi

Доброго времени суток! Нам по геометрическому моделированию задали изобразить в Delphi в 3D объект. С помощью методички попыталась написать код, но почему то выдает ошибки. Второй час разбираюсь, никак не пойму в чем дело. Помогите, если можете.
Код:
unit Unit1;

interface

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

type

//массивы координат******
    T3DCoord = (CX,CY,CZ);
    T3DPoint= ARRAY[CX..CZ] OF REAL;
    TEdges= ARRAY [0..720] OF ARRAY[1..2] OF word;
    TPoints=ARRAY [0..360] OF T3DPoint;
    TMatrix=ARRAY[1..4,1..4] OF REAL;
    TAxis=(AxX,AxY,AxZ);

    TGeom3D=CLASS(TObject)

 public
 canvas:TCanvas;
 PX:REAL;
 PY:REAL;
 bkgcolor:Tcolor;
 fcolor:Tcolor;
 acolor:Tcolor;
 bcolor:Tcolor;
 angles:ARRAY[AxX..AxZ] OF REAL; // ориентация объекта
 Scal:REAL; // масштабный коэффициент
 FUNCTION Multiple(m:TMatrix;m2:T3DPoint):T3DPoint;
 FUNCTION Rotate3D(p:T3DPoint; origin:T3DPoint; Axis:TAxis;  alpha:REAL):T3DPoint;
 PROCEDURE Draw;
 PROCEDURE Rotate(Axis:TAxis; alpha:REAL);
 CONSTRUCTOR Create(NumOfPoints, NumOfEdges:word;Canv:TCanvas);
END;

  TForm1 = class(TForm)
    Image1: TImage;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    BitBtn5: TBitBtn;
    ScrollBar1: TScrollBar;
    ScrollBar2: TScrollBar;
    TrackBar1: TTrackBar;
    TrackBar2: TTrackBar;
    TrackBar3: TTrackBar;
    ColorDialog1: TColorDialog;
    procedure ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    procedure ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure TrackBar2Change(Sender: TObject);
    procedure TrackBar3Change(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure BitBtn5Click(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  HObject:TGeom3D;
  points: TPoints; edges: Tedges;
  Form1: TForm1;
  mx,my:integer;

implementation

{$R *.dfm}

{CONSTRUCTOR TGeom3D.Create(NumOfPoints, NumOfEdges:word;Canv:TCanvas);
begin
INHERITED Create;
fcolor:=clblue;
//fturn:=right;
//p:=pp;
//frejim:=gril;
//fonoff:=false;
//ftemperature:=0;

end; }

PROCEDURE TGeom3D.Draw;

  VAR i:word;

   BEGIN
    WITH Form1.Image1.canvas DO
     BEGIN
   // Фон
   Brush.Color:=bkgColor;
   FillRect(Canvas.ClipRect);
   // Отрисовка ребер
   Pen.Color:=fColor;
   if Length(edges)=0 then
    exit;
   FOR i:=0 TO (Length(points)*2)-1 DO
    BEGIN
     MoveTo(TRUNC(points[edges[i,1],CX]*scal+PX),
            TRUNC(points[edges[i,1],CY]*scal+PY));
     LineTo(TRUNC(points[edges[i,2],CX]*scal+PX),
            TRUNC(points[edges[i,2],CY]*scal+PY))
    END;

   END
 END;

 FUNCTION TGeom3D.Multiple(m:TMatrix;m2:T3DPoint):T3DPoint;

BEGIN
 Result[CX]:=m[1,1]*m2[CX]+m[1,2]*m2[CY]+m[1,3]*m2[CZ]+m[1,4];
 Result[CY]:=m[2,1]*m2[CX]+m[2,2]*m2[CY]+m[2,3]*m2[CZ]+m[2,4];
 Result[CZ]:=m[3,1]*m2[CX]+m[3,2]*m2[CY]+m[3,3]*m2[CZ]+m[3,4]
END;

 FUNCTION tgeom3d.Rotate3D(p:T3DPoint; origin:T3DPoint; Axis:TAxis; alpha:REAL):T3DPoint;
// Поворот точки p вокруг точки origin вокруг оси Axis на угол alpha
VAR matrix:TMatrix;

BEGIN
      matrix[1,1]:=COS(alpha);
      matrix[1,2]:=0;
      matrix[1,3]:=0;
      matrix[1,4]:=0;
      matrix[2,1]:=0;
      matrix[2,2]:=COS(alpha);
      matrix[2,3]:=0;
      matrix[2,4]:=0;
      matrix[3,1]:=0;
      matrix[3,2]:=0;
      matrix[3,3]:=COS(alpha);
      matrix[3,4]:=0;
      matrix[4,1]:=0;
      matrix[4,2]:=0;
      matrix[4,3]:=0;
      matrix[4,4]:=1;
CASE Axis OF
 AxX: BEGIN
      matrix[1,1]:=1;
      matrix[2,3]:=SIN(alpha);
      matrix[3,2]:=-SIN(alpha);
     END;
 AxY: BEGIN
      matrix[1,3]:=-SIN(alpha);
      matrix[2,2]:=1;
      matrix[3,1]:=SIN(alpha);
     END;
 AxZ: BEGIN
      matrix[1,2]:=SIN(alpha);
      matrix[2,1]:=-SIN(alpha);
      matrix[3,3]:=1;
     END;
 END;
Я самый порочный ангел и самый безгрешный демон...
Lisёноk вне форума Ответить с цитированием
Старый 03.11.2011, 18:44   #2
Lisёноk
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 75
По умолчанию

Продолжение кода:
Код:
 END;
 // перенос начала координат
 p[CX]:=p[CX]-origin[CX];
 p[CY]:=p[CY]-origin[CY];
 p[CZ]:=p[CZ]-origin[CZ];
 p:=Multiple(matrix,p);
 // возврат начала координат
 p[CX]:=p[CX]+origin[CX];
 p[CY]:=p[CY]+origin[CY];
 p[CZ]:=p[CZ]+origin[CZ];
 Result:=p
END;

PROCEDURE tgeom3d.Rotate(Axis:TAxis; alpha:REAL);
// поворот объекта вокруг оси Axis на угол alpha
VAR i:word;
     origin:T3DPoint;
     BEGIN
 // начало координат
 origin[CX]:=0.0; origin[CY]:=0.0; origin[CZ]:=0.0;
 alpha:=alpha-self.angles[Axis];
 // пересчет координат всех точек
 FOR i:=0 TO Length(points)-1 DO
  points[i]:=Rotate3D(points[i], origin, Axis, alpha);
 // перерисовка
 Draw;
 self.angles[Axis]:=alpha+self.angles[Axis];
END;

BEGIN
 INHERITED Create; // вызов родительского конструктора
 Self.canvas:=canv;
 angles[AxX]:=0.0;
 angles[AxY]:=0.0;
 angles[AxZ]:=0.0;
 Self.Scal:=1.0;
 Self.px:=0;
 Self.py:=0;
end;


 


procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
begin
hobject.px:= ScrollBar1.Position;
hobject.Draw;
end;

procedure TForm1.ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
begin
hobject.py:= ScrollBar2.Position;
hobject.Draw;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
hobject.scal:=1.2*hobject.scal;
hobject.Draw;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
hobject.scal:=hobject.scal/2.5;
hobject.Draw;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.FormCreate(Sender: TObject);
const nn=360;
var i:word;
    r:real;
    x,y:real;
begin
 self.DoubleBuffered:=true;
 HObject:=TGeom3D.Create(nn,nn,Form1.Image1.Canvas);
 WITH HObject DO
 begin
   bkgcolor:=clwhite;
   fcolor:=clblack;
   acolor:=clblack;
   bcolor:=clblack;
  r:=100;
  // цикл в полярных координатах
  for i:=0 to nn-1 do
   begin
    y:=r*sin(degtorad(i));
    x:=r*cos(degtorad(i));
    points[i][CX]:=Trunc(x);
    points[i][CY]:=Trunc(y);
    points[i][CZ]:=0;
   end;
 // ребро от точки 0 в точку 1
 for i:=0 to nn-1 do
  begin
   edges[i][1]:=i;
   edges[i][2]:=i+1;
  end;
  edges[nn-1][2]:=0;
 for i:=nn to nn*2-1 do
  begin
   edges[i][1]:=i-nn;
   edges[i][2]:=nn;
  end;
   points[nn][CX]:=0;
   points[nn][CY]:=0;
   points[nn][CZ]:=100;
end;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
hobject.Rotate(axx,DegToRad(TrackBAr1.Position))
end;

procedure TForm1.TrackBar2Change(Sender: TObject);
begin
hobject.Rotate(axy,DegToRad(TrackBAr2.Position))
end;

procedure TForm1.TrackBar3Change(Sender: TObject);
begin
hobject.Rotate(axz,DegToRad(TrackBar3.Position))
end;

procedure TForm1.BitBtn4Click(Sender: TObject);
begin
colordialog1.Execute;
hobject.acolor:=colordialog1.Color;
hobject.draw
end;

procedure TForm1.BitBtn5Click(Sender: TObject);
begin
colordialog1.Execute;
hobject.bcolor:=colordialog1.Color;
hobject.draw
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 mx:=x;
 my:=y
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var dx,dy:integer;
begin
 dx:=x-mx;
   dy:=y-my;
   mx:=x;
   my:=y;
 if ssLeft in Shift then
  begin
   hobject.Rotate(axy,DegToRad(dx)+hobject.angles[axy]);
   hobject.Rotate(axx,-DegToRad(dy)+hobject.angles[axx])
  end;
 if ssright in Shift then
  begin
   hobject.px:=hobject.px+dx;
   hobject.py:=hobject.py+dy;
   hobject.Draw;
  end;
 if ssMiddle in Shift then
  begin
  hobject.scal:=hobject.scal*(1-0.01*dy);
  hobject.Draw;
  end;
end;

procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
IF PtInRect(Image1.ClientRect,Image1.ScreenToClient(mOUSE.CursorPos)) then
  begin
   hobject.scal:=hobject.scal*(1-0.1);
   hobject.Draw
  end
end;

procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
 IF PtInRect(Image1.ClientRect,Image1.ScreenToClient(mOUSE.CursorPos)) then
  begin
   hobject.scal:=hobject.scal*(1+0.1);
   hobject.Draw
  end
end;

end.
Я самый порочный ангел и самый безгрешный демон...
Lisёноk вне форума Ответить с цитированием
Старый 03.11.2011, 18:44   #3
Lisёноk
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 75
По умолчанию

В следующих строчках такие ошибки:
Код:
 INHERITED Create; // вызов родительского конструктора
Цитата:
[Error] Unit1.pas(200): This form of method call only allowed in methods of derived types
Код:
Self.canvas:=canv;
Цитата:
[Error] Unit1.pas(201): Undeclared identifier: 'Self'
Цитата:
[Error] Unit1.pas(201): Undeclared identifier: 'canv'
Код:
angles[AxX]:=0.0;
Цитата:
[Error] Unit1.pas(202): Undeclared identifier: 'angles'
Код:
 Self.Scal:=1.0;
Цитата:
[Error] Unit1.pas(205): Missing operator or semicolon
Код:
 Self.px:=0;
Цитата:
[Error] Unit1.pas(206): Missing operator or semicolon
Код:
Self.py:=0;
Цитата:
[Error] Unit1.pas(207): Missing operator or semicolon
Код:
 CONSTRUCTOR Create(NumOfPoints, NumOfEdges:word;Canv:TCanvas);
Цитата:
[Error] Unit1.pas(35): Unsatisfied forward or external declaration: 'TGeom3D.Create'
Я самый порочный ангел и самый безгрешный демон...
Lisёноk вне форума Ответить с цитированием
Старый 03.11.2011, 20:00   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

собственно:
Код:
PROCEDURE tgeom3d.Rotate(Axis:TAxis; alpha:REAL);
// поворот объекта вокруг оси Axis на угол alpha
VAR i:word;
     origin:T3DPoint;
     BEGIN
 // начало координат
 origin[CX]:=0.0; origin[CY]:=0.0; origin[CZ]:=0.0;
 alpha:=alpha-self.angles[Axis];
 // пересчет координат всех точек
 FOR i:=0 TO Length(points)-1 DO
  points[i]:=Rotate3D(points[i], origin, Axis, alpha);
 // перерисовка
 Draw;
 self.angles[Axis]:=alpha+self.angles[Axis];
END;

BEGIN
 INHERITED Create;  //Компилятор четка говорит "вызов inhreitid возможен только из классов произошедших от искомого". А Вы пытаетесь делать абсурд. И вызываете Create от TObject но не свой Create. Уберите это.
 Self.canvas:=canv; //Ошибка потому что неизвестно, чему принадлежит код. Читайте ниже
 angles[AxX]:=0.0;
 angles[AxY]:=0.0;
 angles[AxZ]:=0.0;
 Self.Scal:=1.0;
 Self.px:=0;
 Self.py:=0;
end;
 {
Чему принадлежит этот кусое кода вообще непонятно. Метод tgeom3d.Rotate уже давно закончился оператором  с Этим цветом 
} 
Оттуда и ошибки все, кроме этой:
Код:
CONSTRUCTOR Create(NumOfPoints, NumOfEdges:word;Canv:TCanvas);
Цитата:
[Error] Unit1.pas(35): Unsatisfied forward or external declaration: 'TGeom3D.Create'
поскольку все сам код этого метода заккоментирован, вы долны убать эту строку.
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование в Delphi, проблема. restarterx Общие вопросы Delphi 1 19.11.2010 14:27
Рисование Delphi 7 на Timage Dalagardi Помощь студентам 4 24.04.2010 16:17
Рисование в Delphi 7(Карандаш) Dalagardi Помощь студентам 0 24.04.2010 08:36
Delphi. Рисование. Ericnex Помощь студентам 3 20.04.2010 13:19
рисование в DELPHI Johny91 Помощь студентам 6 15.03.2010 21:56