Хочу нарисовать 3D-график функции, но не знаю как сделать. Может кто-нибудьуже сталкивался с этим и может помочь?
Хочу нарисовать 3D-график функции, но не знаю как сделать. Может кто-нибудьуже сталкивался с этим и может помочь?
Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.
3 апреля 2008 в 1:01
а можно пример с использованием CsGL)
2 апреля 2008 в 9:01
Под .NET на C# есть инструментарий Tao
taoframmework.com
2 апреля 2008 в 1:02
Нет. Для использования OpenGL под .NET можно взять либу CsGL. Она довольно простая.
2 апреля 2008 в 1:01
А есть пример на С#или VB под .NET?
1 апреля 2008 в 10:03
Андрей "Сав" =) Мельников:
Ты все верно говоришь, только смотри, что буфер глубины в примере не используется. Да и код я просто скопировал из другой своей программы, не особо заботясь об оптимизациях. Работает да и ладно
31 марта 2008 в 18:00
Отличный пример, правда непонимаю зачем в gluPerspective глубина в 1000 единиц минуса, если в плюс отведено всего 10 единиц (камера там расположена), возможно будет влиять на точность глубинного отображения (хотя скорее всего это моё личное мнение)
Респект за оперативность=) Сам хотел, да не успел)
31 марта 2008 в 8:05
Например, так:
//www.everfall.com/paste/id.php?c27gyap6enfr
Опять же на скорую руку сделано, поэтому используется библиотека SDL, чтобы не отвлекаться на всякие нудные мелочи.
(MS VC++ 2003)
31 марта 2008 в 1:05
Спасибо за примеры на Паскале, постараюсь разобраться, хотя с ним не знаком.
А MahLab не нужен, нужно именно написать на языке.
А как сделать с помощью OpenGL можете рассказать. Заранее спасибо!
30 марта 2008 в 13:00
Хм… я так понял, автор вообще не сказал при помощи чего ему надо это делать?
Предлагаю поставить матлаб и сделать все в одну строчку))
(функция mesh() )
30 марта 2008 в 7:01
Например так (старая допотопная прога на ТурбоПаскале):
Uses Crt,Graph;
Const k:integer=180;
ks:integer=10;
sq:single=0.86602540378; {=sqrt(3)/2}
Var i,j,gd,gm:integer;
x,y,z:single;
ymas:array[0..639] of integer;
Procedure plot(i,j:integer);
Var x,y,z,t:single;
a,b:word;
Begin
x:=i/20;
y:=j/20;
t:=sqrt(x*x+y*y);
z:=-100*sin(t)/(t+0.0001);
a:=round(320+(j-i)*sq);
b:=round(240+z-(i+j) div 2);
if ymas[a]>=b then begin
putpixel(a,b,15);
ymas[a]:=b
end;
End;
BEGIN
gd:=detect;
initgraph(gd,gm,'bgi');
for i:=0 to 639 do ymas[i]:=1000;
j:=-k;
repeat
for i:=-k to k do plot(i,j);
j:=j+ks;
until j>k;
for i:=0 to 639 do ymas[i]:=1000;
i:=-k;
repeat
for j:=-k to k do plot(i,j);
i:=i+ks;
until i>k;
readln;
closegraph
END.
30 марта 2008 в 7:01
А так можно даже повращать график стрелками:
UsesCrt,Graph;
Type mypoint=record
x,y:integer
end;
Const xmin:single=-8.0;
xmax:single= 8.0;
ymin:single=-8.0;
ymax:single= 8.0;
zsize=39;
zs =zsize div 2;
mc:single=420/zsize;
ma =pi/180.0;
Var gd,gm :integer;
zmas:array[-zs..zs,-zs..zs] of integer;
scr :array[-zs..zs,-zs..zs] of mypoint;
xa,za,da:word;
i :word;
c :char;
Procedure calc;
Var dx,dy,x,y,z:single;
i,j:integer;
Begin
x:=xmin;
dx:=(xmax-xmin)/zsize;
dy:=(ymax-ymin)/zsize;
for i:=-zs to zs do begin
y:=ymin;
for j:=-zs to zs do begin
z:=sqrt(abs(x*x+y*y));
zmas[i,j]:=-round(80*sin(z)/(z+0.01));
y:=y+dy
end;
x:=x+dx
end;
End;
Procedure rotate;
Var x,y:integer;
i,j :integer;
csx,csz,snx,snz,yy:single;
Begin
csx:=cos(xa*ma);
csz:=cos(za*ma);
snx:=sin(xa*ma);
snz:=sin(za*ma);
for i:=-zs to zs do begin
x:=round(mc*i);
for j:=-zs to zs do begin
y:=round(mc*j);
yy:=-x*snz+y*csz;
scr[i,j].x:=320+round(x*csz+y*snz);
scr[i,j].y:=240+round(yy*csx+zmas[i,j]*snx)
end
end
End;
Procedure show;
Var i,j:integer;
ss:string[10];
Begin
while(port[$3da] and 8)=0 do;
cleardevice;
for i:=-zs to zs do begin
moveto(scr[i,-zs].x,scr[i,-zs].y);
for j:=-zs+1 to zs do lineto(scr[i,j].x,scr[i,j].y)
end;
for j:=-zs to zs do begin
moveto(scr[-zs,j].x,scr[-zs,j].y);
for i:=-zs+1 to zs do lineto(scr[i,j].x,scr[i,j].y)
end;
str(xa:5,ss);
outtextxy(0,0,'xa='+ss);
str(za:5,ss);
outtextxy(0,10,'za='+ss)
End;
BEGIN
gd:=detect;
initgraph(gd,gm,'bgi');
settextstyle(0,0,1);
settextjustify(0,2);
xa:=0;
za:=0;
da:=2;
calc;
rotate;
show;
repeat
c:=readkey;
if c=#0 then begin
c:=readkey;
case c of
#75: za:=(za+da)mod 360;
#77: za:=(za+360-da) mod 360;
#72: if xa<=(180-da) then xa:=(xa+da)mod 360;
#80: if xa>=dathen xa:=(xa+360-da) mod 360
end;
rotate;
show
end
until c=#27;
closegraph;
END.
30 марта 2008 в 6:05
1) Использовать соответствующие компоненты
2) Реализовать при помощи псевдо 3D (в 2д пространстве реализовать перспективную/ортогональную проекцию)
3) Реализовать с помощью библиотеки OpenGL/GLAUX/GLUT (это того стоит, но относительно накладно по ресурсам)