Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];

Вниз

Рисование линий уровня функции.У кого какие идеи?   Найти похожие ветки 

 
pirat   (2002-10-18 17:42) [0]

Есть функция от 2х переменных f=f(x,y) . Хотелось бы получить ее графическое представление на лоскости экрана. Один вариант уже сделал - в виде гравиентных переходов между соседними по высоте уровнями. А вариант с тонкими линиями (как на контурных картах) не получается.
У кого какие предложения? :)


 
alxx   (2002-10-18 21:51) [1]

У меня есть курсовик (еще на Turbo C делал под DOS и BGI):

#define FUNCTION x*exp(-x*x-y*y)
#define FUNCTION2 "x * exp( - x * x - y * y )"
#define X0 -2.5 // левая коорд. Х
#define X1 2.5 // правая коорд. Х
#define Y0 -2. // левая коорд. Y
#define Y1 2. // правая коорд. Y
#define STX 0.3 // шаг координатной сетки по Х
#define STY 0.3 // шаг координатной сетки по Y
#define XW0 10 // координаты окна
#define XW1 630
#define YW0 12
#define YW1 350
#define STEP 0.1
#define ZSTEP 0.5

#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<graphics.h>
#include<stdlib.h>

double kx,ky; // коэффициент пропорциональности для вывода на экран
int zx,zy;

void intro();
void draw_contours();
double func_z(double x,double y);
void contour(double zz,double *z,int zx,int zy);
double get_x(double z1,double z2,double xstt);
void out_sys_coord(int xw,int yw);

main()
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "");
errorcode=graphresult();
if(errorcode==grOk)
{
intro();
draw_contours();
getch();
closegraph();
} else printf("\n Небольшой ошибончик с графикой... ");
return 0;
}

void intro()
{
settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
setfillstyle(1,DARKGRAY);
bar(0,0,getmaxx(),getmaxy());
setcolor(BLACK);
outtextxy(16,124,"БАЛТИЙСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ ");
outtextxy(11,154," УНИВЕРСИТЕТ ");
outtextxy(11,184," Курсовая работа ");
outtextxy(11,214," \"Построение линий уровня\" ");
outtextxy(11,244," автор : ");
outtextxy(11,274,"Студент Мельников Алексей. Группа Н371.");
setcolor(WHITE);
outtextxy(12,120,"БАЛТИЙСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ ");
outtextxy(7,150," УНИВЕРСИТЕТ ");
outtextxy(7,180," Курсовая работа ");
outtextxy(7,210," \"Построение линий уровня\" ");
outtextxy(7,240," автор : ");
outtextxy(7,270,"Студент Мельников Алексей. Группа Н371.");
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(137,320," Нажмите любую клавишу / Press any key ...");
setcolor(BLACK);
rectangle(3,87,634,344);
setcolor(RED);
rectangle(4,88,635,345);
getch();
setcolor(WHITE);
clearviewport();
}


 
alxx   (2002-10-18 21:54) [2]

Продолжение:

void draw_contours()
{
char a[50]=FUNCTION2;
double zmin,zmax,zct,x,y;
double *zc,kz;
int zx,zy,xc,yc,xw1,yw1;
outtextxy(1,1," Функция - ");
outtextxy(88,1,a);
zx=(X1-X0+STEP)/STEP+1;
zy=(Y1-Y0+STEP)/STEP+1;
zc=(double *)malloc(sizeof(double)*zx*zy);
for(x=X0,xc=0;xc<zx;x+=STEP,xc++)
{
for(y=Y0,yc=0;yc<=zy;y+=STEP,yc++)
{
zct=func_z(x,y);
zc[xc*zx+yc]=zct;
if(zct<zmin) zmin=zct;
if(zct>zmax) zmax=zct;
}
}
kz=15/(zmax-zmin);
setviewport(XW0,YW0,XW1,YW1,1);
xw1=XW1-XW0;
yw1=YW1-YW0;
kx=(XW1-XW0)/(X1-X0);
ky=(YW1-YW0)/(Y1-Y0);
out_sys_coord(xw1,yw1);
for(double z=-0.5;z<0.5;z+=0.05)
{ setcolor(8+16*z);
contour( z,zc,zx,zy);
}
}

/********************************* ФУНКЦИЯ *********************************/
double func_z(double x,double y)
{
return (FUNCTION);
}
/********************** ОСИ КООРДИНАТ И КООРД. СЕТКА **********************/
void out_sys_coord(int xw,int yw)
{
double x,y;
setlinestyle(DOTTED_LINE,1,1);
setcolor(DARKGRAY);
setfillstyle(1,0);
bar(0,0,xw,yw);
for(x=0;x<=X1;x+=STX)
{
line(kx*(x-X0),0,kx*(x-X0),yw);
}
for(x=0;x>=X0;x-=STX)
{
line(kx*(x-X0),0,kx*(x-X0),yw);
}

for(y=0;y<=Y1;y+=STY)
{
line(0,ky*(y-Y0)+1,xw,ky*(y-Y0)+1);
}
for( y=0;y>=Y0;y-=STY)
{
line(0,ky*(y-Y0)+1,xw,ky*(y-Y0)+1);
}

setlinestyle(SOLID_LINE,1,2);
setcolor(RED);
line(kx*(-X0),0,kx*(-X0),yw);
line(0,ky*(-Y0),xw,ky*(-Y0));
rectangle(0,0,xw,yw);
}
/***************************** ИНТЕРПОЛЯЦИЯ ******************************/
double get_x(double zz,double z1,double z2,double xstt)
{
double a;
if(z1>z2) { a=z2;z2=z1;z1=a;
return xstt-(zz-z1)*xstt/(z2-z1); }
else return (zz-z1)*xstt/(z2-z1);
}
/***************************** ЛИНИЯ УРОВНЯ *****************************/
void contour(double zz,double *z,int zx,int zy)
{
int xc,yc,xc1,yc1;
double x,y,x1,y1,z0,z1,dx,dy,xline1,yline1,xline2,yline2;
char xl1=0,yl1=0,xl2=0,yl2=0,col;

for(x=X0,xc=0;xc<(zx-1);x+=STEP,xc++)
{
for(y=Y0,yc=0;yc<zy;y+=STEP,yc++)
{
xc1=xc+1;
yc1=yc+1;
x1=x+STEP;
y1=y+STEP;
z0=z[xc*zx+yc];
z1=z[xc1*zx+yc];
if(((zz<z1)&&(zz>z0))||((zz>z1)&&(zz<z0)))
{
xline1=x+get_x(zz,z0,z1,STEP); xl1=1;
yline1=y;
}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
z0=z1;
z1=z[xc1*zx+yc1];
if(((zz<z1)&&(zz>z0))||((zz>z1)&&(zz<z0)))
{
if(xl1==0) {
xline1=x1;
yline1=y+get_x(zz,z0,z1,STEP); xl1=1;
}
if(xl1==1) {
xline2=x1;
yline2=y+get_x(zz,z0,z1,STEP); xl2=1;
}
}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

z0=z1;
z1=z[xc*zx+yc1];
if(((zz<z1)&&(zz>z0))||((zz>z1)&&(zz<z0)))
{
if(xl1==0) {
xline1=x+get_x(zz,z1,z0,STEP);
yline1=y1; xl1=1;
}
if(xl1==1) {
xline2=x+get_x(zz,z1,z0,STEP);
yline2=y1; xl2=1;
}
}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
z0=z1;
z1=z[xc*zx+yc];
if(((zz<z1)&&(zz>z0))||((zz>z1)&&(zz<z0)))
{
if(xl1==1) {
yline2=y+get_x(zz,z1,z0,STEP);
xline2=x; xl2=1;
}
}

if((xl1==1)&&(xl2==1))
line(kx*(xline1-X0),ky*(yline1-Y0),kx*(xline2-X0),ky*(yline2-Y0));
xl1=0;xl2=0;

}
}
}


 
pirat   (2002-10-19 02:23) [3]

Спасибо. А нельзя ли в двух словах основную идею ? :) А то что-то математики много ...


 
k   (2002-10-19 02:41) [4]

если ты сделал с градиентным переходом, то здесь в чем проблема?

пусть ф-ция f - непрерывна и меняется в интервале [a,b]
(прям как из учебника по матану:))
разбиваешь этот интервал на n частей с шагом
step = (b-a)/n;
все.
если f(x,y) = step*i (плюс-минус некий епсилон, i-целое число от 0 до n) то эту точку рисуем

в кач. упражнения проверь утв., что если ф-ция указанная непрерывна, то точки будут образовывать непересекающиеся линии:)


 
pirat   (2002-10-19 04:10) [5]

это я тоже сделал.
так как функция не обязательно должна быть f(x,y)=step*i под пикселом, то мы получим набор несвязных точек. лучше рассматривать
if f(x,y)-step*i < 0.001 then putpixel - это уже похоже на правду.
Что больше идей нету?


 
Bis   (2002-10-19 17:36) [6]

почитай лучше классиков по компьютерной графике


 
k   (2002-10-20 00:05) [7]


if abs(f(x,y)-step*i) < 0.001{это число тоже поизменяй} then putpixel - я это и имел ввиду написав плюс-минус некий епсилон

а если и это не поможет, то остается самому раисовать кривые через видимые точки, напр. сплайны (ОпенГЛ можно задействовать) или кривую Безье


 
pirat   (2002-10-20 08:16) [8]

да, хорошая идея :))



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
3-101065
alenka
2002-10-11 03:16
2002.10.31
обновить записи


3-101121
Юра
2002-10-09 16:36
2002.10.31
Суммирование в запрсе Null-полей


3-101100
БД Ламер
2002-10-09 16:24
2002.10.31
Я никогда не создавал БД. Помогите!


1-101312
KidMan
2002-10-17 22:50
2002.10.31
Прошу совета относительно списка файлов


7-101530
nv-vetal
2002-08-24 12:23
2002.10.31
Как пересчитать все папки (файлы) в определенной папке?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский