procedure getProjection(x,y,z:integer);
var
result:coords2;
zz:real;
begin
zz:=z*(sqrt(2)/2);
result.x:=round(x-zz)+center.x;
result.y:=-round(y-zz)+center.y;
MyCoord2:=result; { Результат}
end;
3д график без трехмерных библиотек
Код:
uses crt,graph;
var GraphDriver,GraphMode:integer;
function f3D(x,y:real):real;
begin f3D:=Sin (x); end;
procedure build_gr_3D(x1,y1,x2,y2,d:integer);
var i,j,mx,my,mz,nx,ny,xi,yi:integer;f,x,y,a1,b1,a2,b2,h1,h2,k,min,max:real;
up_gor,down_gor:array[0..640]of integer;
begin nx:=50;ny:=50; {//к-ть ліній на які поділено поверхю(розмір сітки)}
setviewport(x1,y1-d,x2+d,y2,false);
my:=x2-x1;mx:=d;mz:=y2-y1;
a1:=-2;b1:=2;a2:=-4;b2:=5;
h1:=(b1-a1)/mx;h2:=(b2-a2)/my;
max:=f3D(a1,a2);min:=max;
for j:=0 to my do for i:=0 to mx do begin x:=a1+h1*i;y:=a2+h2*j;f:=f3D(x,y);
if max<f then max:=f;
if min>f then min:=f;end;
setcolor(8);setlinestyle(3,1,1);line(mx,0,mx,mz);line(mx,mz,my+mx,mz);line(mx,mz,0,mz+mx);
setlinestyle(0,1,1);
k:=mz/(max-min);setcolor(150);
for i:=0 to my do begin up_gor:=round(mz+mx-(f3D(a1,i*h2+a2)-min)*k);down_gor:=up_gor;end;
for i:=0 to mx do begin up_gor[i+my]:=round(mz+mx-(f3D(i*h1+a1,h2*my+a2)-min)*k-i);down_gor[i+my]:=up_gor[i+my];end;
for j:=0 to nx do begin
moveto(round(j*mx/nx),round(mz+mx-(f3D(h1*j*mx/nx+a1,a2)-min)*k-j*mx/nx));
for i:=1 to my do begin xi:=i+round(j*mx/nx);yi:=round(mz+mx-(f3D(h1*j*mx/nx+a1,i*h2+a2)-min)*k-j*mx/nx);
if (down_gor[xi]<=yi)and(yi<=up_gor[xi])and(j<>0) then moveto(xi,yi)
else begin lineto(xi,yi);
if down_gor[xi]>yi then down_gor[xi]:=yi;
if up_gor[xi]<yi then up_gor[xi]:=yi;
end; end; end;
for i:=0 to my do begin up_gor:=round(mz+mx-(f3D(a1,i*h2+a2)-min)*k);down_gor:=up_gor;end;
for i:=0 to mx do begin up_gor[i+my]:=round(mz+mx-(f3D(i*h1+a1,h2*my+a2)-min)*k-i);down_gor[i+my]:=up_gor[i+my];end;
for j:=ny downto 0 do begin
moveto(round(j*my/ny),round(mz+mx-(f3D(a1,h2*j*my/ny+a2)-min)*k));
for i:=1 to mx do begin xi:=i+round(j*my/ny);yi:=round(mz+mx-(f3D(i*h1+a1,h2*j*my/ny+a2)-min)*k-i);
if (down_gor[xi]<=yi)and(yi<=up_gor[xi])and(j<>ny) then moveto(xi,yi)
else begin lineto(xi,yi);
if down_gor[xi]>yi then down_gor[xi]:=yi;
if up_gor[xi]<yi then up_gor[xi]:=yi;
end; end; end;
setcolor(7);rectangle(0,mx,my,mz+mx);
line(0,mx,mx,0);line(mx,0,my+mx,0);line(my+mx,0,my,mx);line(my+mx,0,my+mx,mz);line(my,mz+mx,my+mx,mz);end;
begin
graphDriver:=VGA;
GraphMode:=VGAHi;
InitGraph(graphDriver,GraphMode,'D:\bp\bgi');
build_gr_3D(1,200,410,479,200);
read;
closegraph;end.
var GraphDriver,GraphMode:integer;
function f3D(x,y:real):real;
begin f3D:=Sin (x); end;
procedure build_gr_3D(x1,y1,x2,y2,d:integer);
var i,j,mx,my,mz,nx,ny,xi,yi:integer;f,x,y,a1,b1,a2,b2,h1,h2,k,min,max:real;
up_gor,down_gor:array[0..640]of integer;
begin nx:=50;ny:=50; {//к-ть ліній на які поділено поверхю(розмір сітки)}
setviewport(x1,y1-d,x2+d,y2,false);
my:=x2-x1;mx:=d;mz:=y2-y1;
a1:=-2;b1:=2;a2:=-4;b2:=5;
h1:=(b1-a1)/mx;h2:=(b2-a2)/my;
max:=f3D(a1,a2);min:=max;
for j:=0 to my do for i:=0 to mx do begin x:=a1+h1*i;y:=a2+h2*j;f:=f3D(x,y);
if max<f then max:=f;
if min>f then min:=f;end;
setcolor(8);setlinestyle(3,1,1);line(mx,0,mx,mz);line(mx,mz,my+mx,mz);line(mx,mz,0,mz+mx);
setlinestyle(0,1,1);
k:=mz/(max-min);setcolor(150);
for i:=0 to my do begin up_gor:=round(mz+mx-(f3D(a1,i*h2+a2)-min)*k);down_gor:=up_gor;end;
for i:=0 to mx do begin up_gor[i+my]:=round(mz+mx-(f3D(i*h1+a1,h2*my+a2)-min)*k-i);down_gor[i+my]:=up_gor[i+my];end;
for j:=0 to nx do begin
moveto(round(j*mx/nx),round(mz+mx-(f3D(h1*j*mx/nx+a1,a2)-min)*k-j*mx/nx));
for i:=1 to my do begin xi:=i+round(j*mx/nx);yi:=round(mz+mx-(f3D(h1*j*mx/nx+a1,i*h2+a2)-min)*k-j*mx/nx);
if (down_gor[xi]<=yi)and(yi<=up_gor[xi])and(j<>0) then moveto(xi,yi)
else begin lineto(xi,yi);
if down_gor[xi]>yi then down_gor[xi]:=yi;
if up_gor[xi]<yi then up_gor[xi]:=yi;
end; end; end;
for i:=0 to my do begin up_gor:=round(mz+mx-(f3D(a1,i*h2+a2)-min)*k);down_gor:=up_gor;end;
for i:=0 to mx do begin up_gor[i+my]:=round(mz+mx-(f3D(i*h1+a1,h2*my+a2)-min)*k-i);down_gor[i+my]:=up_gor[i+my];end;
for j:=ny downto 0 do begin
moveto(round(j*my/ny),round(mz+mx-(f3D(a1,h2*j*my/ny+a2)-min)*k));
for i:=1 to mx do begin xi:=i+round(j*my/ny);yi:=round(mz+mx-(f3D(i*h1+a1,h2*j*my/ny+a2)-min)*k-i);
if (down_gor[xi]<=yi)and(yi<=up_gor[xi])and(j<>ny) then moveto(xi,yi)
else begin lineto(xi,yi);
if down_gor[xi]>yi then down_gor[xi]:=yi;
if up_gor[xi]<yi then up_gor[xi]:=yi;
end; end; end;
setcolor(7);rectangle(0,mx,my,mz+mx);
line(0,mx,mx,0);line(mx,0,my+mx,0);line(my+mx,0,my,mx);line(my+mx,0,my+mx,mz);line(my,mz+mx,my+mx,mz);end;
begin
graphDriver:=VGA;
GraphMode:=VGAHi;
InitGraph(graphDriver,GraphMode,'D:\bp\bgi');
build_gr_3D(1,200,410,479,200);
read;
closegraph;end.
В результате вы получите очень красивый график. Привяжете синтаксический анализатор и вполне потянет для того чтоб зароботать репутацию в преподавателя.
Источник: softengines.ru
Вот как я его сделал для делфи, кому надо - обращайтесь дам исходник.
Код:
MyCoord2 и center : coords2.
Нужно, конечно, определить структуру coords2. Передаете 3 координаты, получаете 2. А больше ничего и не нужно.
Исходник в дельфи, по просьбам.
Есть версия с синтаксическим анализом. Если кому интерестно - качайте: