singlepost

3D график функции << На главную или назад  

Хочу нарисовать 3D-график функции, но не знаю как сделать. Может кто-нибудьуже сталкивался с этим и может помочь?

27 ответов в теме “3D график функции”

  1. 12
    Виталий Лисапов ответил:

    а можно пример с использованием CsGL)

  2. 11
    Тимур Багаутдинов ответил:

    Под .NET на C# есть инструментарий Tao
    taoframmework.com

  3. 10
    Алексей Терещенко ответил:

    Нет. Для использования OpenGL под .NET можно взять либу CsGL. Она довольно простая.

  4. 9
    Виталий Лисапов ответил:

    А есть пример на С#или VB под .NET?

  5. 8
    Алексей Терещенко ответил:

    Андрей "Сав" =) Мельников:
    Ты все верно говоришь, только смотри, что буфер глубины в примере не используется. Да и код я просто скопировал из другой своей программы, не особо заботясь об оптимизациях. Работает да и ладно :)

  6. 7
    Андрей Мельников ответил:

    Отличный пример, правда непонимаю зачем в gluPerspective глубина в 1000 единиц минуса, если в плюс отведено всего 10 единиц (камера там расположена), возможно будет влиять на точность глубинного отображения (хотя скорее всего это моё личное мнение)

    Респект за оперативность=) Сам хотел, да не успел)

  7. 6
    Алексей Терещенко ответил:

    Например, так:
    //www.everfall.com/paste/id.php?c27gyap6enfr
    Опять же на скорую руку сделано, поэтому используется библиотека SDL, чтобы не отвлекаться на всякие нудные мелочи.
    (MS VC++ 2003)

  8. 5
    Виталий Лисапов ответил:

    Спасибо за примеры на Паскале, постараюсь разобраться, хотя с ним не знаком.

    А MahLab не нужен, нужно именно написать на языке.
    А как сделать с помощью OpenGL можете рассказать. Заранее спасибо!

  9. 4
    Иван Сопов ответил:

    Хм… я так понял, автор вообще не сказал при помощи чего ему надо это делать?
    Предлагаю поставить матлаб и сделать все в одну строчку))
    (функция mesh() )

  10. 3
    Алексей Терещенко ответил:

    Например так (старая допотопная прога на ТурбоПаскале):

    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.

  11. 2
    Алексей Терещенко ответил:

    А так можно даже повращать график стрелками:

    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.

  12. 1
    Андрей Мельников ответил:

    1) Использовать соответствующие компоненты
    2) Реализовать при помощи псевдо 3D (в 2д пространстве реализовать перспективную/ортогональную проекцию)
    3) Реализовать с помощью библиотеки OpenGL/GLAUX/GLUT (это того стоит, но относительно накладно по ресурсам)

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.