Esempio n. 1
0
void QuaternionDemo::render() 
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    // (AB)-1 === B-1 A-1
    glm::mat4 inverseViewMatrix = glm::translate(glm::mat4(1.0f), -viewTrans) *
        viewRot.inverse().toRotMatrix();
    glm::mat4 projectionMatrix = glm::perspective(70.0f, 1024.0f/768.0f, 0.1f, 100.0f);
    glm::mat4 mvp = projectionMatrix * inverseViewMatrix;

    simpleShader.Use();
    glUniformMatrix4fv(simpleShader["mvp"], 1, GL_FALSE,  glm::value_ptr(mvp));

    
    drawVectors();
    drawOrigin();

    simpleShader.UnUse();
    
    SDL_GL_SwapWindow(mainWindow);
}
void GLWidget::paintGL()
{
    //
    /*int side = qMin(this->width(), this->height());
    // 设置视口
    glViewport((this->width() - side) / 2, (this->height() - side) / 2, side, side);
    // 指定当前矩阵
    glMatrixMode(GL_PROJECTION);
    // 将当前矩阵换成单位阵
    glLoadIdentity();
    glOrtho(-viewPointLeng,+viewPointLeng,
            -viewPointLeng,+viewPointLeng,
            -1000,1000);
    glMatrixMode(GL_MODELVIEW);
*/
    //
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glTranslatef(0.0, 0.0, -10.0);
    glRotatef(xRot / 16.0, 1.0, 0.0, 0.0);
    glRotatef(yRot / 16.0, 0.0, 1.0, 0.0);
    glRotatef(zRot / 16.0, 0.0, 0.0, 1.0);

    /*for (int i = 0; i < vector3d_list.size(); i++)
    {
        Vector3D*  temp = vector3d_list.at(i);
        glTranslatef(0.0, 0.0, -1.0);
        temp->draw();
    }*/

    //画坐标格
    draw3DCoordinate();

    if (pivdata != NULL && pivdata->list().length() > 0)
        drawVectors(pivdata);
    //qDebug() << "helloworld";
    //qDebug() << "pivdata" << pivdata << "length" << pivdata->list().length();

}
	void FluidDrawerBase::draw(float x, float y, float renderWidth, float renderHeight) {
		if(enabled == false) return;
		
		switch(drawMode) {
			case kFluidDrawColor:
				drawColor(x, y, renderWidth, renderHeight);
				break;
				
			case kFluidDrawMotion:
				drawMotion(x, y, renderWidth, renderHeight);
				break;
				
			case kFluidDrawSpeed:
				drawSpeed(x, y, renderWidth, renderHeight);
				break;
				
			case kFluidDrawVectors:
				drawVectors(x, y, renderWidth, renderHeight);
				break;
				
		}
	}
Esempio n. 4
0
void Flow::draw()
{
  glPushMatrix();

      glTranslatef(m_position.m_x, m_position.m_y, m_position.m_z);

      drawVectors();

      glColor4f(0.2f,0.2f,1.0f,0.5f);
      glLineWidth(0.1f);

      GLFunctions::WiredCube(m_fsize*2.0f, m_fsize*2.0f, m_fsize*2.0f);
      glLineWidth(3.0f);

      glColor4f(1.0f,0.1f,0.0f,0.8f);
      glPointSize(2.0f);

      glBegin(GL_POINTS);
        glVertex3f(m_position.m_x,m_position.m_y,m_position.m_z);
        glColor4f(1.0f,1.0f,1.0f,1.0f);
      glEnd(); //glPoint

  glPopMatrix();
}
Esempio n. 5
0
void kangxueCalcVectorField(IplImage* sourceImage,IplImage* screen, std::vector<std::vector<CvPoint> > curves) {
    cvSetMouseCallback( "curveDetect", mouseCallback ) ;
    // calculate edgels and display it on the source image
    IplImage *edgelsImage = cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U, 1 );
    getEdgels( sourceImage,  edgelsImage ) ;
    // get gradient
    IplImage *gradImage = cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U, 3 );
    getGradImage( sourceImage, gradImage, gradmap );
    Edges dstSnakeCurves ;
    Edges dstVectorCurves ;
    int thresh_t100 = 100;
    cvCreateTrackbar("threshold", "curveDetect",&thresh_t100, 400  ) ;
    Edges edges_bkup ;

    //screen = cvCloneImage( sourceImage ) ;        //已经注释掉了,需要在外部进行cpoy,防止指针出错
    vecfield.compute( curves, cvSize( sourceImage->width,sourceImage->height), 400 ) ;
    //drawCurves( screen , curves, cvScalar(255,0,255),2) ;
    drawVectors( screen, vecfield ) ;
    return;

    while(1){
        screen = cvCloneImage( sourceImage ) ;
        if( displayEdge )
            cvCvtColor(edgelsImage, screen, CV_GRAY2RGB) ;
        if( displayCurve )
            drawCurves( screen , curves, cvScalar(255,0,255),2) ;
        if( 0 && curves.size() && curves[0].size() > 10 ){
            Edges guideCurve, spline ;
            guideCurve.elems = curves ;
            getUniformCubicBSpline(guideCurve, spline) ;
            drawCurves( screen , spline.elems, cvScalar(0,255,0),2) ;
        }
        if( AppState != _draw_curves && displayVector)
            drawVectors( screen, vecfield ) ;
        if( AppState == _got_result )
            if( displayVecOrSnake )
                drawCurves(screen, dstSnakeCurves.elems ,  cvScalar(0,255,255),2) ;
            else
                drawCurves(screen, dstVectorCurves.elems ,  cvScalar(0,255,0),2) ;
        if( AppState >= _edges_linkeded ){
            edges = edges_bkup ;
            filterLinkedEdge(edges, vecfield, gradmap, curves, thresh_t100 * 0.01 ) ;
        }
        if( displayEdges )
            drawCurves_randomColor( screen, edges.elems, 4 ) ;
        cvShowImage("curveDetect", screen );
        unsigned char key = cvWaitKey(50) ;
        if( key == 99 ) break; // press c to exit
        if( key == 114 ){ // press r to reset
            curves.clear() ;
            AppState = _draw_curves ;
            getEdgels( sourceImage,  edgelsImage ) ;
            edges.elems.clear();
            dstVectorCurves.elems.clear();
            dstSnakeCurves.elems.clear();
            ctrpoints.elems.clear();
        }
        if( key == 115 ){ // press s
            if( AppState == _draw_curves ){
                AppState = _show_vectors ;
                 // calculate vector field
                std::cout<<"begin calculate the vector field" << std::endl;
                vecfield.compute( curves, cvSize( sourceImage->width,sourceImage->height), 400 ) ;
                std::cout<<"vector field calculated" << std::endl;
            }
        }
    }
}
Esempio n. 6
0
int main2(int argc, char **argv) {
    std::cout<<"  LBFGSERR_MAXIMUMLINESEARCH == "<<   LBFGSERR_MAXIMUMLINESEARCH << std::endl;
	std::string sourceImageName ;
    sourceImageName = std::string("/home/netbeen/桌面/周叔项目/imgSalCurDetector/test.jpg") ;
    sourceImage = cvLoadImage(sourceImageName.c_str(), CV_LOAD_IMAGE_COLOR) ;
	cvNamedWindow( "curveDetect") ;
	cvSetMouseCallback( "curveDetect", mouseCallback ) ;
	// calculate edgels and display it on the source image
	IplImage *edgelsImage = cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U, 1 );
	getEdgels( sourceImage,  edgelsImage ) ;
	// get gradient
	IplImage *gradImage = cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U, 3 );
	getGradImage( sourceImage, gradImage, gradmap );
	Edges dstSnakeCurves ;
	Edges dstVectorCurves ;
	int thresh_t100 = 100;
	cvCreateTrackbar("threshold", "curveDetect",&thresh_t100, 400  ) ;
	Edges edges_bkup ;
	while(1){
		IplImage *screen = cvCloneImage( sourceImage ) ;
		if( !displaySourceimage ){
            std::cout << "NO, 我删掉了一行" << std::endl;
            //cvCopyImage(gradImage,screen);
            //////////////////////////////////////////////////////////////////////我删掉了一行//////////////////////////////////////
		}
		if( displayEdge )
			cvCvtColor(edgelsImage, screen, CV_GRAY2RGB) ;
		if( displayCurve )
			drawCurves( screen , curves, cvScalar(255,0,255),2) ;
		if( 0 && curves.size() && curves[0].size() > 10 ){
			Edges guideCurve, spline ;
			guideCurve.elems = curves ;
			getUniformCubicBSpline(guideCurve, spline) ;
			drawCurves( screen , spline.elems, cvScalar(0,255,0),2) ;
		}
		if( AppState != _draw_curves && displayVector)
			drawVectors( screen, vecfield ) ;
        if( AppState == _got_result )
			if( displayVecOrSnake )
				drawCurves(screen, dstSnakeCurves.elems ,  cvScalar(0,255,255),2) ;
			else
				drawCurves(screen, dstVectorCurves.elems ,  cvScalar(0,255,0),2) ;
		if( AppState >= _edges_linkeded ){
			edges = edges_bkup ;
			filterLinkedEdge(edges, vecfield, gradmap, curves, thresh_t100 * 0.01 ) ;
		}
		if( displayEdges )
			drawCurves_randomColor( screen, edges.elems, 4 ) ;
		cvShowImage("curveDetect", screen );
		unsigned char key = cvWaitKey(50) ;
		if( key !=255)
			std::cout<<(unsigned)key ;
		if( key == 99 ) break; // press c to exit
		if( key == 27 )  {  // press ESC to delete the last curve drawn by user
			if( AppState == _draw_curves && curves.size()!=0)
				curves.erase( curves.end()-1) ;
		}
		if( key == 114 ){ // press r to reset
			curves.clear() ;
			AppState = _draw_curves ;
			getEdgels( sourceImage,  edgelsImage ) ;
			edges.elems.clear();
			dstVectorCurves.elems.clear();
			dstSnakeCurves.elems.clear();
			ctrpoints.elems.clear();
		}
        if( key == 9 ) // press TAB to switch between displaying sourceImage and edges
			displayEdge = !displayEdge ;
        if( key == 113 )  //press q
			displayVector = !displayVector ;
        if( key == 101 )  //press e
			displaySourceimage = !displaySourceimage ;
        if( key == 97 )  //press a
			displayVecOrSnake = !displayVecOrSnake ;
        if( key == 122 )  //press z
			displayEdges = !displayEdges ;
        if( key == 119 ) // press TAB to switch between displaying sourceImage and edges
			displayCurve = !displayCurve ;
		if( key == 115 ){ // press s
			if( AppState == _draw_curves ){ 
				AppState = _show_vectors ;
				 // calculate vector field
				std::cout<<"begin calculate the vector field" << std::endl;
                vecfield.compute( curves, cvSize( sourceImage->width,sourceImage->height), 400 ) ;
				std::cout<<"vector field calculated" << std::endl;
                std::cout << "验证,是main2"  << std::endl;
                //cvZero( bandMsk ) ;
                //drawCurves( bandMsk, curves, cvScalar(1, 1,1), 80 ) ;
                //cvMul(bandMsk, edgelsImage, edgelsImage ) ;
            }
            /*else if( AppState == _show_vectors ){
				AppState = _edges_linkeded ;
				linkEdge(edgelsImage, edges, 20) ;
				edges_bkup = edges ;
            }
            else if( AppState == _edges_linkeded ){
				AppState = _edges_filtered ;
				filterLinkedEdge( edges,  vecfield, gradmap, curves, thresh_t100 * 0.01 ) ;
            }
            else if( AppState == _edges_filtered ){
				AppState = _new_field ;
                std::vector<std::vector<CvPoint> > allCurves = edges.elems;
                for( size_t i=0; i<curves.size(); ++i )
					allCurves.push_back(curves[i] ) ;
				// smooth edges
				std::cout<<"begin calculate the new vector field" << std::endl;
				vecfield.compute( edges.elems, cvSize( sourceImage->width,sourceImage->height), 400 ) ;
				std::cout<<"new vector field calculated" << std::endl;
            }
            else if( AppState == _new_field ){
				AppState = _got_result ;
				// calculate ctrpoints
				ctrpoints.elems = curves ;
				CvPoint prepoint = ctrpoints.elems[0][0] ;
                for( size_t j=1; j<ctrpoints.elems[0].size()-1; ++j ){
					if( sqrt( (double)((prepoint.x - ctrpoints.elems[0][j].x) *(prepoint.x - ctrpoints.elems[0][j].x) 
						+ (prepoint.y - ctrpoints.elems[0][j].y) *(prepoint.y - ctrpoints.elems[0][j].y)) ) > 20  ){
							prepoint = ctrpoints.elems[0][j] ;
					}
					else{
						ctrpoints.elems[0].erase( ctrpoints.elems[0].begin() + j ) ;
						j-- ;
					}
                }
                #define _lbfgs 0
				if( _lbfgs ){
					// Snakes
					extern bool consider_vecfield ;
					consider_vecfield = false ;
					std::cout<<"begin optimization: consider_vecfield = false"<<std::endl;
					int ret = 0;
					lbfgsfloatval_t fx;
					lbfgsfloatval_t *x = lbfgs_malloc( ctrpoints.elems[0].size() * 2 );
					lbfgs_parameter_t param;
					if (x == NULL) {
						printf("ERROR: Failed to allocate a memory block for variables.\n");
						return 1;
					}
                    // Initialize the variables.
                    for (size_t i = 0;i < ctrpoints.elems[0].size() * 2 ; i++)
						x[i] = 0;
					lbfgs_parameter_init(&param);
					param.max_linesearch = 100 ;
					ret = lbfgs(ctrpoints.elems[0].size() * 2, x, &fx, evaluate, progress, NULL, &param);
					printf("L-BFGS optimization terminated with status code = %d\n", ret);
					printf("  fx = %f, x[0] = %f, x[1] = %f\n", fx, x[0], x[1]);
					// apply the optimization result to ctrpoints
					Edges dstctrpoints = ctrpoints ;
                    for( size_t i=0; i<dstctrpoints.elems[0].size(); ++i ){
						dstctrpoints.elems[0][i].x += x[ i ] ;
						dstctrpoints.elems[0][i].y += x[ i + dstctrpoints.elems[0].size() ] ;
					}
					curve_interplation(dstctrpoints, dstSnakeCurves ) ;
					// field guided snakes
					consider_vecfield = true ;
					std::cout<<"begin optimization: consider_vecfield = true"<<std::endl;
                    for (size_t i = 0;i < ctrpoints.elems[0].size() * 2 ; i++)
						x[i] = 0;
					lbfgs_parameter_init(&param);
					param.max_linesearch = 100 ;
					ret = lbfgs(ctrpoints.elems[0].size() * 2, x, &fx, evaluate, progress, NULL, &param);
					printf("L-BFGS optimization terminated with status code = %d\n", ret);
					printf("  fx = %f, x[0] = %f, x[1] = %f\n", fx, x[0], x[1]);
					// apply the optimization result to ctrpoints
					dstctrpoints = ctrpoints ;
                    for( size_t i=0; i<dstctrpoints.elems[0].size(); ++i ){
						dstctrpoints.elems[0][i].x += x[ i ] ;
						dstctrpoints.elems[0][i].y += x[ i + dstctrpoints.elems[0].size() ] ;
					}
					curve_interplation(dstctrpoints, dstVectorCurves ) ;
					lbfgs_free(x);
				}
				else{
					// Snakes
					extern bool consider_vecfield ;
					consider_vecfield = false ;
					std::cout<<"begin optimization: consider_vecfield = false"<<std::endl;
					splab::BFGS<double, EnergyFunction> solver;
					splab::Vector<double> x0;
					x0.resize(ctrpoints.elems[0].size() * 2) ;
					for( int i=0; i<x0.size(); ++i )
						x0[i] = 0 ;
					EnergyFunction ef ;
					solver.optimize(ef, x0, 1e-10, 1000 ) ;
					x0 = solver.getOptValue() ;
					std::cout<<"func["<<x0<<"] = "<<solver.getFuncMin()<<std::endl;
					std::vector<double> X;
					for( int i=0; i<x0.size(); ++i )
						X.push_back(x0[i]);
					// apply the optimization result to ctrpoints
					Edges dstctrpoints = ctrpoints ;
                    for( size_t i=0; i<dstctrpoints.elems[0].size(); ++i ){
						dstctrpoints.elems[0][i].x += X[ i ] ;
						dstctrpoints.elems[0][i].y += X[ i + dstctrpoints.elems[0].size() ] ;
					}
					getUniformCubicBSpline(dstctrpoints, dstSnakeCurves ) ;
					// field guided Snakes
					consider_vecfield = true ;
					std::cout<<"begin optimization: consider_vecfield = true"<<std::endl;
					for( int i=0; i<x0.size(); ++i )
						x0[i] = 0 ;
					solver.optimize(ef, x0, 1e-10, 1000 ) ;
					x0 = solver.getOptValue() ;
					std::cout<<"func["<<x0<<"] = "<<solver.getFuncMin()<<std::endl;
					// apply the optimization result to ctrpoints
                    for( size_t i=0; i<ctrpoints.elems[0].size(); ++i ){
						ctrpoints.elems[0][i].x += x0[ i ] ;
						ctrpoints.elems[0][i].y += x0[ i + ctrpoints.elems[0].size() ] ;
					}
					getUniformCubicBSpline(ctrpoints, dstVectorCurves) ;
				}
            }*/
		}
	}
	return 0;
}