how to draw 3d line(x,y,z)
i can draw the 2d line and i want to draw 3d (x,y,z) dimension for graph the math equation..
Where i should start ?
there is some explanation
http://www.digitalfanatics.org/projects/qt_tutorial/chapter14.html
but it is too complex.. i need to draw just line on (x,y,z) dimention..
4 replies
This simple app should get you started with drawing lines in 3D using OpenGL and Qt. I suggest you also have a read through the QGLWidget docs and get yourself a good book on OpenGL programming. I can recommend the OpenGL Superbible.
main.cpp
- #include <QtGui/QApplication>
- #include "lines.h"
- int main(int argc, char *argv[])
- {
- Lines w;
- w.show();
- return a.exec();
- }
lines.h
- #ifndef LINES_H
- #define LINES_H
- #include <QGLWidget>
- #include <QVector2D>
- const float pi = 3.141592653f;
- const float twoPi = 2.0f * pi;
- const float piBy2 = 0.5f * pi;
- const float degToRad = pi / 180.0f;
- const float radToDeg = 180.0f / pi;
- {
- Q_OBJECT
- public:
- protected:
- virtual void initializeGL();
- virtual void resizeGL( int w, int h );
- virtual void paintGL();
- private:
- float m_theta; /**< Rotation about x-axis */
- float m_phi; /**< Rotation about y-axis */
- float m_aspectRatio;
- QVector2D m_lineWidthRange;
- float m_lineWidthStep;
- float m_lineWidth;
- };
- #endif // LINES_H
lines.cpp
- #include "lines.h"
- #include <QCoreApplication>
- #include <QDebug>
- #include <QKeyEvent>
- #include <math.h>
- m_theta( 0.0f ),
- m_phi( 0.0f ),
- m_aspectRatio( 1.0 ),
- m_lineWidthRange(),
- m_lineWidthStep( 0.0f ),
- m_lineWidth( 1.0f )
- {
- }
- void Lines::initializeGL()
- {
- // Set the clear color to black
- glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
- // Set the drawing color to green
- glColor3f( 0.0f, 1.0f, 0.0f );
- // Query some info about supported point sizes
- glGetFloatv( GL_LINE_WIDTH_RANGE, reinterpret_cast<float*>( &m_lineWidthRange ) );
- glGetFloatv( GL_LINE_WIDTH_GRANULARITY, &m_lineWidthStep );
- qDebug() << "Point size range:" << m_lineWidthRange;
- qDebug() << "Point size step:" << m_lineWidthStep;
- m_lineWidth = m_lineWidthRange.x();
- }
- void Lines::resizeGL( int w, int h )
- {
- // Prevent a divde by zero
- if ( h == 0 )
- h = 1;
- // Set the viewport to window dimensions
- glViewport( 0, 0, w, h );
- // reset the coordinate system
- glMatrixMode( GL_PROJECTION );
- glLoadIdentity();
- // Establish the clipping volume by setting up an orthographic projection
- double range = 100.0;
- m_aspectRatio = double( w ) / double( h );
- if ( w <=h )
- glOrtho( -range, range, -range / m_aspectRatio, range / m_aspectRatio, range, -range );
- else
- glOrtho( -range * m_aspectRatio, range * m_aspectRatio, -range, range, range, -range );
- glMatrixMode( GL_MODELVIEW );
- glLoadIdentity();
- }
- void Lines::paintGL()
- {
- // Clear the buffer with the current clearing color
- glClear( GL_COLOR_BUFFER_BIT );
- // Set drawing colour to red
- glColor3f( 1.0f, 0.0f, 0.0f );
- // Save matrix state and do the custom rotation
- glPushMatrix();
- glRotatef( m_theta, 1.0f, 0.0f, 0.0f );
- glRotatef( m_phi, 0.0f, 1.0f, 0.0f );
- // Draw some Lines in a helix
- glLineWidth( m_lineWidth );
- glBegin( GL_LINE_STRIP );
- float z = -50.0f;
- float angle = 0.0f;
- for ( angle = 0.0f; angle <= twoPi * 3.0f; angle += 0.1f, z += 0.5f )
- {
- float x = 50.0 * sin( angle );
- float y = 50.0 * cos( angle );
- glVertex3f( x, y, z );
- }
- glEnd();
- // Restore the matrix state
- glPopMatrix();
- }
- {
- switch ( e->key() )
- {
- break;
- m_phi += 1.0f;
- updateGL();
- break;
- m_phi -= 1.0f;
- updateGL();
- break;
- m_theta += 1.0f;
- updateGL();
- break;
- m_theta -= 1.0f;
- updateGL();
- break;
- m_lineWidth = qMin( m_lineWidth + m_lineWidthStep, float( m_lineWidthRange.y() ) );
- qDebug() << "m_lineWidth =" << m_lineWidth;
- updateGL();
- break;
- m_lineWidth = qMax( m_lineWidth - m_lineWidthStep, float( m_lineWidthRange.x() ) );
- qDebug() << "m_lineWidth =" << m_lineWidth;
- updateGL();
- break;
- default:
- }
- }
You must log in to post a reply. Not a member yet? Register here!


