Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ график Sin(x)

Автор: Тёмный Эльф 9.03.2007 2:38

Пользователь вводит начальный x0 и конечный x2, затем программа высчитывает Sinx по ряду Тейлора с такой точностью, с какой запросит пользователь. Например k=5 (количество членов ряда), или k=50, тогда точность вычислений будет выше. Программа высчитывает Sinx от x=x0 до x=x2 с шагом dx, который тоже определяется пользователем. Меня интересует, как можно связать полученные в результате точки с системой координат. Как правильно задать расположение точек на экране, чтобы получился график?

Добавлено через 3 мин.
блин все-равно неточный вопрос получился. не как правильно задать расположение.. а вот например у меня получился x=0, y=0 соответсвенно. Их пересечение будет началом отсчета координат. Затем dx=0.5 предположим. значит уже пересечение x=0.5 и y = 0.47.. Куда тыркнуть полученную точку!? blink.gif

Автор: volvo 9.03.2007 3:04

Ну, введи какой-то коэффициент масштабирования. Например, так: поскольку значения Y по модулю не могут превышать 1 (для функции Y = Sin(X), я имею в виду), а размеры экрана по вертикали = 480 пикселов, то отображать, скажем, Y*200 вместо просто Y, оно однозначно поместится на экран, и будет хорошо видна форма графика...

Подобные соображения - и относительно масштаба по X, только здесь тебе надо принять в расчет, сколько периодов синусоиды ты хочешь отобразить на графике...

Автор: Тёмный Эльф 9.03.2007 7:11

Форма графика все-таки вырисовывалась неявно. Тогда я решил приписать к своей проге готовую процедуру grafik, которую взял из книжки. k (количество членов ряда), x1 и x2 я решил сделать пока постоянными, функция Sin_x() возвращает значение Y=Sin(x), котрое передается в процедуру grafik. Вроде нормально. Правда, получившийся график по-моему мало на синусоиду похож. По-крайней мере, когда использовалась стандартная функция Sin(x) языка Си, график был симпатичнее. И вот еще Y должен меняться от -1 до 1, здесь же при x1=0 x2=50 он меняется от 31744.00 до -31744.00 (!!!)

#include <graphics.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define PATHTODRIVER "D:\\tc\\bgi\\"

int Sin_x(float x)
{
int i; int n;
double temp;
float f;
const k=50;

temp=(float)x/1;
f=(float)x/1;
n=1;
for (i=1; i<k; i++)
{
temp=(-1)*(temp*((x*x)/((n+1)*(n+2))));
n=n+2;
f += temp;
}
return f;
}


void grafik(float x1, float x2)
{
float y1,y2;
float x,y; float dx=1;
int l=50, b=400;
int w=300, h=200;
float mx,my;
int x0,y0;
char st[25];

y1=Sin_x(x1); /*minimum*/
y2=Sin_x(x1); /*maximum*/
x=x1+dx;
do
{ y=Sin_x(x);
if (y<y1) y1=y;
if (y>y2) y2=y;
x += dx;
} while (x<=x2);

my=h/fabs(y2-y1);
mx=w/fabs(x2-x1);
x0=1;
y0=b-abs(y1*my);
line(l,b,l,b-h);
line(x0,y0,x0+w,y0);

sprintf(st,"%3.2f",y2);
outtextxy(l+5,b-h,st);
sprintf(st,"%3.2f",y1);
outtextxy(l+5,b,st);

x=x1;
do { y=Sin_x(x);
putpixel(x0+x*mx,y0-y*my,15);
x += dx;
} while (x<=x2);
}


void main(void)
{ float x1; float x2;
int gdriver = DETECT;
int gmode;
initgraph(&gdriver, &gmode, PATHTODRIVER);
x1=0;
x2=50;
grafik(x1,x2);
getchar();
closegraph();
}

}

Автор: Тёмный Эльф 9.03.2007 8:21

Цитата
Тогда я решил приписать к своей проге готовую процедуру grafik, которую взял из книжки.


Вот как нужно. (если кому интересно)

#include <graphics.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define PATHTODRIVER "D:\\tc\\bgi\\"

void Sin_x(float x1, float x2)
{
int i; int n;
long double temp;
long double f; long double x;
const k=100;
for (x=x1; x<=x2; x+=0.0001)
{
temp=(long double)x/1;
f=(long double)x/1;
n=1;
for (i=1; i<k; i++)
{
temp=(-1)*(temp*((x*x)/((n+1)*(n+2))));
n=n+2;
f += temp;
}
putpixel(x*16,f*490,15);
}
}

void main(void)
{ float x1; float x2;
int gdriver = DETECT;
int gmode;
initgraph(&gdriver, &gmode, PATHTODRIVER);

printf("Enter x1: ");
scanf("%f",&x1);
printf("Enter x2: ");
scanf("%f",&x2);
cleardevice();
Sin_x(x1,x2);

}


МОРАЛЬ: писать все процедуры самому, а не брать из книжек.