Ученик Гость
|
Добавлено: Чт Дек 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. |
куда еще Y то уменьшать?
ЗЫ:поправьте меня, если что то не понял.. |
|