Форум: "Основная";
Текущий архив: 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