|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
19.05.2009, 11:41 | #1 |
Регистрация: 19.05.2009
Сообщений: 6
|
построение изолиний
Доброго времени суток!
Помогите, пожалуйста, решить задачу : построение изолиний для функции двух переменных (f(x,y)=z) на Паскале". Оч нужно скоро защита, а задачи нет . есть вот такая (моего исполнения но она рисует только сетку): uses graph,crt; const n=220; m=90; // iterk=10000; //eps=0.0001; niz=10; var x0e,xke,y0e,yke :integer; x0,xk,y0,yk :real; z,zn,hz,zk :real; hxe,hye :real; alpha,beta,gamma,delta :real; hx,hy :real; xr,yr :array[1..4] of integer; p,status:array [1..n,1..m] of real; i,j,ii :integer; grdriver,grmode :integer; max,min :real; imax,jmax,imin,jmin :integer; xt1,yt1,xt2,yt2 :real; ixt1,jyt1,ixt2,jyt2 :integer; kk :integer; x,y :real; lx,ly :real; BEGIN clrscr; grDriver := Detect; initGraph(grDriver, grMode,''); //setlinestyle(solidln,1,thickwidth); setcolor(yellow); x0e:=1; y0e:=1; xke:=560;yke:=560; hxe:=(xke-x0e)/n;hye:=(yke-y0e)/m; x0:=0.0;y0:=0.0;xk:=2.2;yk:=0.9; hx:=(xk-x0)/n; hy:=(yk-y0)/m; alpha:=(x0e-xke)/(x0-xk); beta:=(x0*xke-xk*x0e)/(x0-xk); gamma:=(y0e-yke)/(yk-y0); delta:=(yk*yke-y0*y0e)/(yk-y0); x0:=1;y0:=1; for i:=1 to n do begin x:=x0+(i-1)*hx; for j:=1 to m do begin y:=y0+(j-1)*hy; p[i,j]:=sin(x+y); end; end; {построение сетки} for i := 1 to n do begin x:=i * hxe; MoveTo(round(x), round(y0e)); LineTo(round(x), round(yke)); end; for j := 1 to m do begin y := j * hye; MoveTo(round(x0e), round(y)); LineTo(round(xke), round(y)); end; //€§®Ўа*¦Ґ*ЁҐ ॣг«па*®© бҐвЄЁ max:=p[1,1];imax:=1;jmax:=1; min:=p[1,1];imin:=1;jmin:=1; for i:=1 to n do begin for j:=1 to m do begin if max<p[i,j] then begin max:=p[i,j]; imax:=i; jmax:=j; end; if min>p[i,j] then begin min:=p[i,j]; imin:=i; jmin:=j; end; end; end; zn:=min;zk:=max;hz:=(max-min)/niz; z:=zn; while z<=zk-0.000001*hz do begin for i:=1 to n-1 do begin lx:=x0+(i)*hx; for j:=1 to m-1 do begin ly:=y0+(j)*hy; kk:=0; if ((p[i,j] <= z) and (z < p[i+1,j])) or ((p[i,j] >= z) and (z > p[i+1,j])) then begin x:=lx+(hx*(z-p[i,j]))/(p[i+1,j]-p[i,j]); kk:=kk+1; xr[kk]:=round(alpha*x+beta); yr[kk]:=round(gamma*ly+delta); end; if ((p[i+1,j] <= z) and (z < p[i+1,j+1])) or ((p[i+1,j] >= z) and (z > p[i+1,j+1])) then begin y:=ly+(hy*(z-p[i+1,j]))/(p[i+1,j+1]-p[i+1,j]); kk:=kk+1; xr[kk]:=round(alpha*(lx+hx)+beta); yr[kk]:=round(gamma*y+delta); if kk=2 then begin MoveTo(xr[2],yr[2]); LineTo(xr[1],yr[1]); kk:=0; end; end; if ((p[i,j+1] <= z) and (z < p[i+1,j+1])) or ((p[i,j+1] >= z) and (z > p[i+1,j+1])) then begin x:=lx+(hx*(z-p[i,j+1]))/(p[i+1,j+1]-p[i,j+1]); kk:=kk+1; xr[kk]:=round(alpha*x+beta); yr[kk]:=round(gamma*(ly+hy)+delta); if kk=2 then begin MoveTo(xr[2],yr[2]); LineTo(xr[1],yr[1]); kk:=0; end; end; if ((p[i,j] <= z) and (z < p[i,j+1])) or ((p[i,j] >= z) and (z > p[i,j+1])) then begin y:=ly+(hy*(z-p[i,j]))/(p[i,j+1]-p[i,j]); kk:=kk+1; xr[kk]:=round(alpha*lx+beta); yr[kk]:=round(gamma*y+delta); if kk=2 then begin MoveTo(xr[2],yr[2]); LineTo(xr[1],yr[1]); kk:=0; end; end; end; end; z:=z+hz; end; readln; readln; closegraph; END. Бутьте добры, ПОМОГОТЕ ПОЖАЛУЙСТА!!! Заранее спасибо! |
19.05.2009, 11:53 | #2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Что ты называешь Изолиниями? Проекции на оси?
I'm learning to live...
|
19.05.2009, 12:35 | #3 |
Регистрация: 19.05.2009
Сообщений: 6
|
под изолиниями я понимаю линиии, для которых функция принимает постоянные значения f(x,y)=z=Const,заданной в узлах прямоугольной сетки {Xi, Yj}.
Последний раз редактировалось cherkasenok; 19.05.2009 в 13:33. |
19.05.2009, 13:20 | #4 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Я так пониаю что твоя Z - значение на самой изолинии а x y - координаты на сетке?
Ну я бы скорее всего для каждого значения Z организовал массив иксов и игреков, а потом бы их отрисовывал...
I'm learning to live...
|
19.05.2009, 15:31 | #5 |
Регистрация: 19.05.2009
Сообщений: 6
|
а поточнее можно, чет не очень понимаю
|
19.05.2009, 16:47 | #6 |
Регистрация: 19.05.2009
Сообщений: 6
|
Помогите,пожалуйста!
|
19.05.2009, 17:25 | #7 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Я себе это так представляю
Создаешь массив трехмерный. Туда по ходу выполнения твоей функции заносишь значения x,y,z И еще один массив, в которые заносишь только Z Далее в цикле проходиш по второму массиву, читаешь каждое Z, и во внутреннем цикле перебираешь первый массив, если в нем Z-ты совпадают чертишь на экране очередную линию от предидущей точки до этой. Когда внутренний массив закончится перемещаешся по экрану в начало координат и повторяешь черчение по следующиму Z. Таким образом получишь кучу линий. Жаль ухожу домой уже, времени нет наброски сделать... Так что удачи...
I'm learning to live...
|
19.05.2009, 19:23 | #8 |
Регистрация: 19.05.2009
Сообщений: 6
|
спасибо! я попробую сама, но если время будет сделай наброски, оч прошу.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
построение сечений | Дина1109 | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 11.04.2009 19:30 |
Построение на экране | Ximer | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 10.04.2009 21:37 |
Построение графиков на C# | TheGuardian123 | Общие вопросы .NET | 2 | 29.01.2008 14:50 |
(С++) Построение графика tg(x)=y. | Panterka | Помощь студентам | 2 | 13.12.2007 09:32 |
рисование изолиний | Alar | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 30.10.2006 14:17 |