![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рисование линий уровня функции.У кого какие идеи? [D5, Win95/98]
pirat © (2002-10-18 17:42:00)Есть функция от 2х переменных f=f(x,y) . Хотелось бы получить ее графическое представление на лоскости экрана. Один вариант уже сделал - в виде гравиентных переходов между соседними по высоте уровнями. А вариант с тонкими линиями (как на контурных картах) не получается.
У кого какие предложения? :)
pirat (2002-10-20 08:16:00) [1]да, хорошая идея :))
k (2002-10-20 00:05:00) [2]
if abs(f(x,y)-step*i) < 0.001{это число тоже поизменяй} then putpixel - я это и имел ввиду написав плюс-минус некий епсилон
а если и это не поможет, то остается самому раисовать кривые через видимые точки, напр. сплайны (ОпенГЛ можно задействовать) или кривую Безье
Bis (2002-10-19 17:36:00) [3]почитай лучше классиков по компьютерной графике
pirat (2002-10-19 04:10:00) [4]это я тоже сделал.
так как функция не обязательно должна быть f(x,y)=step*i под пикселом, то мы получим набор несвязных точек. лучше рассматривать
if f(x,y)-step*i < 0.001 then putpixel - это уже похоже на правду.
Что больше идей нету?
k (2002-10-19 02:41:00) [5]если ты сделал с градиентным переходом, то здесь в чем проблема?
пусть ф-ция f - непрерывна и меняется в интервале [a,b]
(прям как из учебника по матану:))
разбиваешь этот интервал на n частей с шагом
step = (b-a)/n;
все.
если f(x,y) = step*i (плюс-минус некий епсилон, i-целое число от 0 до n) то эту точку рисуем
в кач. упражнения проверь утв., что если ф-ция указанная непрерывна, то точки будут образовывать непересекающиеся линии:)
pirat (2002-10-19 02:23:00) [6]Спасибо. А нельзя ли в двух словах основную идею ? :) А то что-то математики много ...
alxx (2002-10-18 21:54:00) [7]Продолжение:
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
alxx (2002-10-18 21:51:00) [8]У меня есть курсовик (еще на 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
#include
#include
#include
#include
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();
}