графика.помогите написать одну функцию
Добавлено: 20 апр 2009, 14:49
работа с графокой.данна программа осуществляет поворот 3д столбиков...но у меня большая проблема((((необходима сотрировка граней,сколько пробую,не получается написать эту функцию сортировки(((а она обязательно нужна, так как без нее у меня видны задние грани столбиков((( картинка нереальная получается
вот мой код исходник
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
[syntax=Delphi]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
draw: boolean;
i1,i2,j1,j2 : integer;
x,y : array[0..7] of integer;//массив
x0,y0,z0,Alfa,Betta, A : real;
Xmin,Xmax,Ymin,Ymax,Zmin,Zmax: real;
procedure IJ(x,y,z: real; var i,j: integer);
procedure Diagramm;
public
{ Public declarations }
end;
type
dd = record
kf,xd,yd,zd: real;
end;
var
Form1: TForm1;
Bitmap: TBitmap;
ddd:array[1..25] of dd; //ограничиваем количество столбиков
implementation //статич.массивом
{$R *.DFM}
{TSides=recod
p1 p2 p3 p4: Txyz;
Zmin:real;//координаты середины прямоугольника
end;
Txyz=record
x, y, z:real;
end;}
function Func(x,z: real): real;
begin
Func:=0.5*x+0.4*z;
end;
procedure TForm1.IJ(x,y,z: real; var i,j: integer);
var Xn,Yn,Zn: real;
begin //преобразование системы координат
Xn:=(x-x0)*cos(alfa)-(y-y0)*sin(alfa);
Yn:=((x-x0)*sin(alfa)+(y-y0)*cos(alfa))*cos(Betta)-(z-z0)*sin(Betta);
Zn:=((x-x0)*sin(alfa)+(y-y0)*cos(alfa))*sin(Betta)+(z-z0)*cos(Betta);
if A<>0 then begin //сжимаем координаты точки х,у к точке 0,0
Xn:=Xn/(Zn/A+1); //для поворота перпендикулярной экрану Oz
Yn:=Yn/(Zn/A+1);
end
else begin
Xn:=Xn/(Zn/0.1+1);
Yn:=Yn/(Zn/0.1+1);
end;
with Canvas do
begin //используем округление для того,чтобы
//не произошла ошибка несовместимости типов'Integer' and 'Extended'
i:=Trunc(Width*(Xn-Xmin)/(Xmax-Xmin));
j:=Trunc(Height*(yn-ymax)/(ymin-ymax));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Bitmap:=TBitmap.Create;
Bitmap.Width:=ClientWidth;
Bitmap.Height:=ClientHeight;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Diagramm;
sortirovka;
end;
//начало поворота графика
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
draw:=true;
end;
end;[/syntax]
вот мой код исходник
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
[syntax=Delphi]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
draw: boolean;
i1,i2,j1,j2 : integer;
x,y : array[0..7] of integer;//массив
x0,y0,z0,Alfa,Betta, A : real;
Xmin,Xmax,Ymin,Ymax,Zmin,Zmax: real;
procedure IJ(x,y,z: real; var i,j: integer);
procedure Diagramm;
public
{ Public declarations }
end;
type
dd = record
kf,xd,yd,zd: real;
end;
var
Form1: TForm1;
Bitmap: TBitmap;
ddd:array[1..25] of dd; //ограничиваем количество столбиков
implementation //статич.массивом
{$R *.DFM}
{TSides=recod
p1 p2 p3 p4: Txyz;
Zmin:real;//координаты середины прямоугольника
end;
Txyz=record
x, y, z:real;
end;}
function Func(x,z: real): real;
begin
Func:=0.5*x+0.4*z;
end;
procedure TForm1.IJ(x,y,z: real; var i,j: integer);
var Xn,Yn,Zn: real;
begin //преобразование системы координат
Xn:=(x-x0)*cos(alfa)-(y-y0)*sin(alfa);
Yn:=((x-x0)*sin(alfa)+(y-y0)*cos(alfa))*cos(Betta)-(z-z0)*sin(Betta);
Zn:=((x-x0)*sin(alfa)+(y-y0)*cos(alfa))*sin(Betta)+(z-z0)*cos(Betta);
if A<>0 then begin //сжимаем координаты точки х,у к точке 0,0
Xn:=Xn/(Zn/A+1); //для поворота перпендикулярной экрану Oz
Yn:=Yn/(Zn/A+1);
end
else begin
Xn:=Xn/(Zn/0.1+1);
Yn:=Yn/(Zn/0.1+1);
end;
with Canvas do
begin //используем округление для того,чтобы
//не произошла ошибка несовместимости типов'Integer' and 'Extended'
i:=Trunc(Width*(Xn-Xmin)/(Xmax-Xmin));
j:=Trunc(Height*(yn-ymax)/(ymin-ymax));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Bitmap:=TBitmap.Create;
Bitmap.Width:=ClientWidth;
Bitmap.Height:=ClientHeight;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Diagramm;
sortirovka;
end;
//начало поворота графика
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
draw:=true;
end;
end;[/syntax]