Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

График функции

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Ученик
Гость





СообщениеДобавлено: Чт Дек 23 2004 20:11    Заголовок сообщения: График функции Ответить с цитатой

Уважаемые программеры, объясните пожалуйста, в чем проблема. Вот пример программы, рисующей синусоиду. Линия не сплошная, а точками. Естесственно, нужно уменьшить шаг изменения x и y. но если приращение сделать меньше 0.5, программа виснет и через пару минут выдает ошибку...
Borland C++ Builder

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

BOOL bSetupPixelFormat(HDC hdc)
{
PIXELFORMATDESCRIPTOR pfd, *ppfd;
int pixelformat;

ppfd = &pfd;

ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
ppfd->nVersion = 1;
ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
ppfd->dwLayerMask = PFD_MAIN_PLANE;
ppfd->iPixelType = PFD_TYPE_RGBA;
ppfd->cColorBits = 16;
ppfd->cDepthBits = 16;

ppfd->cAccumBits = 0;
ppfd->cStencilBits = 0;

if ((pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0)
{
MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
return FALSE;
}
if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
{
MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
return FALSE;
}
return TRUE;
}

//---------------------------------------------------------------------------


void __fastcall TForm1::FormCreate(TObject *Sender)
{
ghDC = GetDC(Handle);
if (!bSetupPixelFormat(ghDC))
Close();
ghRC = wglCreateContext(ghDC);
wglMakeCurrent(ghDC, ghRC);

glClearColor(0.0, 0.0, 0.0, 0.0);

FormResize(Sender);

glEnable(GL_COLOR_MATERIAL);
glEnable(GL_DEPTH_TEST);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
float p[4]={3,3,3,1},
d[3]={-1,-1,-3};
glLightfv(GL_LIGHT0,GL_POSITION,p);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,d);
}


//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(ghRC)
{
wglMakeCurrent(ghDC,0);
wglDeleteContext(ghRC);
}
if(ghDC)
ReleaseDC(Handle, ghDC);

}
//---------------------------------------------------------------------------

void TForm1::Draw()
{
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

//GLUquadricObj *quadObj;
//quadObj=gluNewQuadric();

//gluQuadricDrawStyle(quadObj, GLU_LINE);
glColor3f(0,1,0);
//gluSphere(quadObj, 3,100,100);
//gluDisk(quadObj,1, 2, 30, 30);

//glRotatef(3, 0,1,0);
//gluDeleteQuadric(quadObj);

float x=1, y;

glPointSize(1);
// glEnable(GL_POINT_SMOOTH);
glBegin(GL_POINTS);
while (x!=100){
y = 2*sin(x);

glVertex2f(x, y);
x+=0.5;
}
glEnd();

SwapBuffers(ghDC);
}


void __fastcall TForm1::FormPaint(TObject *Sender)
{
Draw();
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FormResize(TObject *Sender)
{

glViewport( 0, 0, Width, Height );
//glViewport( 100, 100, 300, 300 );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-15,15, -15,15, 2,12);
gluLookAt(0,0,5, 0,0,0, 0,1,0);
glMatrixMode( GL_MODELVIEW );

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
//Draw();
}
//---------------------------------------------------------------------------
Вернуться к началу
SeioN



Зарегистрирован: 29.07.2004
Сообщения: 23
Откуда: RUSSIA

СообщениеДобавлено: Пт Дек 24 2004 00:37    Заголовок сообщения: Ответить с цитатой

используйте масштабирование
(выводя тригон. функции я это часто делал )
почему нельзя использовать коэф. для масштаб.-я
графика - y изм-ся от -2 до 2, а x от 1 до 100,
я б сделал x от 0 до 2pi с шагом 2pi/100 или pi/100
и аргументы функции изменил glVertex2i(round(100*x),round(100*y))
а то, у вас Y , пытается бегать по пяти координатам, x- по 101
да еще все они с плавающей точкой ..)

может я и работал с другой версией gl но вряд ли
обл. действия функций gl<name>f: (-1;1) поменяли.

Я одно не понял:
Цитата:
нужно уменьшить шаг изменения x и y.
Shocked
куда еще Y то уменьшать?

ЗЫ:поправьте меня, если что то не понял..
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
grayrat



Зарегистрирован: 30.06.2003
Сообщения: 189

СообщениеДобавлено: Пт Дек 24 2004 02:40    Заголовок сообщения: Ответить с цитатой

синус это пол беды, его производная это косинус, а он <=1, а вот если ты захочешь нарисовать тангенс, к примеру, производная которого улетает в бесконечность, то шаг нужно будет уменьшать очень сильно. Вывод: рисуй линиями.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Ученик
Гость





СообщениеДобавлено: Пт Дек 24 2004 08:05    Заголовок сообщения: Ответить с цитатой

2SeioN: да, насчет Y я запарился просто...

А вобщем все понятно, спасибо. Smile Просто я подзабыл немного про область действия... Embarassed
Вернуться к началу
Ученик
Гость





СообщениеДобавлено: Пт Дек 24 2004 20:19    Заголовок сообщения: Ответить с цитатой

блин, и все равно зависает прога, если шаг изменения x меньше 0.5
сделал для примера приращение 2*pi/100 и все... проц забился на 53%... Sad
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...