Esempio n. 1
0
void nRenderer::drawQuad(nVertex p1, nVertex p2, nVertex p3, nVertex p4) {
	glBegin(GL_QUADS);
		drawVertex(p1);
		drawVertex(p2);
		drawVertex(p3);
		drawVertex(p4);
	glEnd();
}
Esempio n. 2
0
void nRenderer::drawTriangle(nTriangle t) {

	t.material->bind();
	glBegin(GL_TRIANGLES);
		drawVertex(t.vert[0]);
		drawVertex(t.vert[1]);
		drawVertex(t.vert[2]);
	glEnd();
}
Esempio n. 3
0
/**
 * Draw half a sphere, with one texture
 */
void Sphere::drawHalfSphere(GLuint tgLoc, GLuint tcoordsLoc) const
{
    glBegin(GL_QUADS);

    for (int j = 0; j < _hDivs; j++) {
        for (int i = 0; i < _vDivs; i++) {
            drawVertex(i, j, tgLoc, tcoordsLoc);
            drawVertex(i+1, j, tgLoc, tcoordsLoc);
            drawVertex(i+1, j+1, tgLoc, tcoordsLoc);
            drawVertex(i, j+1, tgLoc, tcoordsLoc);
        }
    }
    glEnd();
}
Esempio n. 4
0
void nRenderer::drawTriangles(vector<nTriangle> tr) {
	nMaterial *mat = 0;
	glBegin(GL_TRIANGLES);
	for(unsigned int i = 0; i != tr.size(); i++) {
		if(tr[i].material != mat) {
			mat = tr[i].material;
			glEnd();
			tr[i].material->bind();
			glBegin(GL_TRIANGLES);
		}
		drawVertex(tr[i].vert[0]);
		drawVertex(tr[i].vert[1]);
		drawVertex(tr[i].vert[2]);
	}
	glEnd();
}
Esempio n. 5
0
void nRenderer::drawTriangles(nTriangle *t, unsigned int count) {
	nMaterial *mat = 0;
	glBegin(GL_TRIANGLES);
	for(unsigned int i = 0; i != count; i++) {
		if(t[i].material != mat) {
			mat = t[i].material;
			glEnd();
			t[i].material->bind();
			glBegin(GL_TRIANGLES);
		}
		drawVertex(t[i].vert[0]);
		drawVertex(t[i].vert[1]);
		drawVertex(t[i].vert[2]);
	}
	glEnd();
}
// Рисует панель высот вершин (справа).
void MaxFlowVisualizer::drawHeightsBar(QPainter &painter) {
    painter.save();
    painter.setPen(QPen(Qt::black, 3));
    painter.setBrush(Qt::lightGray);
    size_t verteciesNumber = verteciesList.size();
    int levelCount = countUsedHeightLevels();
    int borderOffset = VisableVertex::DEFAULT_VERTEX_RADIUS;
    // Для удобства перенесем систему коодинат в левый верхний угол будующей панели.
    painter.translate(width() - RIGHT_BAR_OF_HEIGHTS_WIDTH, borderOffset);
    unsigned barWidth = RIGHT_BAR_OF_HEIGHTS_WIDTH;
    int barHeight = height() - 2 * borderOffset;
    int bottomY = barHeight;
    double scaleHeight = barHeight / levelCount;
    // Рисует горизонтальные линии, соответсвующие уровням.
    for (size_t level = 0; level < levelCount; ++level) {
        int x = 0;
        painter.drawLine(x,
                         bottomY - scaleHeight * level,
                         x + barWidth,
                         bottomY - scaleHeight * level);
    }
    // Отображение вершин на панели высот.
    double scaleWidth = RIGHT_BAR_OF_HEIGHTS_WIDTH / verteciesNumber;
    for (size_t vertex = 0; vertex < verteciesNumber; ++vertex) {
        // Для того, чтобы все визуальные эффекты вершины (выделение, надписи и т.д.)
        // отображались и на боковой панели высот, мы в явном виде создаем новую
        // вершину - точную копию исходной (простой конструктор копирования)
        // и перемещаем ее на нужное место на панели высот.
        VisableVertex currentVertex(verteciesList[vertex]);
        currentVertex.setCenterCoordX(borderOffset + scaleWidth * vertex);
        currentVertex.setCenterCoordY(bottomY - scaleHeight * relabelToFrontAlgo.getVertexHeight(vertex));
        drawVertex(currentVertex, painter);
    }
    painter.restore();
}
Esempio n. 7
0
void			btSoftBodyHelpers::DrawFrame(		btSoftBody* psb,
											 btIDebugDraw* idraw)
{
	if(psb->m_pose.m_bframe)
	{
		static const btScalar	ascl=10;
		static const btScalar	nscl=(btScalar)0.1;
		const btVector3			com=psb->m_pose.m_com;
		const btMatrix3x3		trs=psb->m_pose.m_rot*psb->m_pose.m_scl;
		const btVector3			Xaxis=(trs*btVector3(1,0,0)).normalized();
		const btVector3			Yaxis=(trs*btVector3(0,1,0)).normalized();
		const btVector3			Zaxis=(trs*btVector3(0,0,1)).normalized();
		idraw->drawLine(com,com+Xaxis*ascl,btVector3(1,0,0));
		idraw->drawLine(com,com+Yaxis*ascl,btVector3(0,1,0));
		idraw->drawLine(com,com+Zaxis*ascl,btVector3(0,0,1));
		for(int i=0;i<psb->m_pose.m_pos.size();++i)
		{
			const btVector3	x=com+trs*psb->m_pose.m_pos[i];
			drawVertex(idraw,x,nscl,btVector3(1,0,1));
		}
	}
}
void QgsGeometryRubberBand::paint( QPainter *painter )
{
  if ( !mGeometry || !painter )
  {
    return;
  }

  painter->save();
  painter->translate( -pos() );

  if ( mGeometryType == QgsWkbTypes::PolygonGeometry )
  {
    painter->setBrush( mBrush );
  }
  else
  {
    painter->setBrush( Qt::NoBrush );
  }
  painter->setPen( mPen );


  QgsAbstractGeometry *paintGeom = mGeometry->clone();

  paintGeom->transform( mMapCanvas->getCoordinateTransform()->transform() );
  paintGeom->draw( *painter );

  //draw vertices
  QgsVertexId vertexId;
  QgsPoint vertex;
  while ( paintGeom->nextVertex( vertexId, vertex ) )
  {
    drawVertex( painter, vertex.x(), vertex.y() );
  }

  delete paintGeom;
  painter->restore();
}
Esempio n. 9
0
/**
 * Berechnet anhand der Rekursionstiefe die Anzahl der Quadrate auf dem Boden
 * @param p1,p2,p3,p4 - Die Ecken des Quadrats
 * @param rek - Rekursionstiefe
 * @param color - die Farbe der Quadrate
 * 
 */
void drawRecursiveQuad(CGPoint3f p1, CGPoint3f p2, CGPoint3f p3, CGPoint3f p4, int rek, int color)
{
    CGPoint3f middle0 = {0.0,0.0,0.0},
              middle1 = {0.0,0.0,0.0},
              middle2 = {0.0,0.0,0.0},
              middle3 = {0.0,0.0,0.0},
              center = {0.0,0.0,0.0};

    center[0] = (p1[0] + p3[0]) / 2;
    center[2] = (p1[2] + p3[2]) / 2;

    middle0[0] = (p1[0] + p2[0]) / 2;
    middle0[2] = (p1[2] + p2[2]) / 2;

    middle1[0] = (p2[0] + p3[0]) / 2;
    middle1[2] = (p2[2] + p3[2]) / 2;

    middle2[0] = (p3[0] + p4[0]) / 2;
    middle2[2] = (p3[2] + p4[2]) / 2;


    middle3[0] = (p4[0] + p1[0]) / 2;
    middle3[2] = (p4[2] + p1[2]) / 2;

    if (rek > 0)
    {
      drawRecursiveQuad(center,middle0,p2,middle1, rek-1, color);
      drawRecursiveQuad(center,middle1,p3,middle2, rek-1, !color);
      drawRecursiveQuad(center,middle2,p4,middle3, rek-1, color);
      drawRecursiveQuad(center,middle3,p1,middle0, rek-1, !color);


    } else {
        /*drawVertex(p1,p2,p3,p4, color);*/
        drawVertex(p4,p3,p2,p1, color);
    }
}
Esempio n. 10
0
void			btSoftBodyHelpers::Draw(	btSoftBody* psb,
										btIDebugDraw* idraw,
										int drawflags)
{
	const btScalar		scl=(btScalar)0.1;
	const btScalar		nscl=scl*5;
	const btVector3		lcolor=btVector3(0,0,0);
	const btVector3		ncolor=btVector3(1,1,1);
	const btVector3		ccolor=btVector3(1,0,0);
	int i,j,nj;

	/* Nodes	*/ 
	if(0!=(drawflags&fDrawFlags::Nodes))
	{
		for(i=0;i<psb->m_nodes.size();++i)
		{
			const btSoftBody::Node&	n=psb->m_nodes[i];
			if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
			idraw->drawLine(n.m_x-btVector3(scl,0,0),n.m_x+btVector3(scl,0,0),btVector3(1,0,0));
			idraw->drawLine(n.m_x-btVector3(0,scl,0),n.m_x+btVector3(0,scl,0),btVector3(0,1,0));
			idraw->drawLine(n.m_x-btVector3(0,0,scl),n.m_x+btVector3(0,0,scl),btVector3(0,0,1));
		}
	}
	/* Links	*/ 
	if(0!=(drawflags&fDrawFlags::Links))
	{
		for(i=0;i<psb->m_links.size();++i)
		{
			const btSoftBody::Link&	l=psb->m_links[i];
			if(0==(l.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
			idraw->drawLine(l.m_n[0]->m_x,l.m_n[1]->m_x,lcolor);
		}
	}
	/* Normals	*/ 
	if(0!=(drawflags&fDrawFlags::Normals))
	{
		for(i=0;i<psb->m_nodes.size();++i)
		{
			const btSoftBody::Node&	n=psb->m_nodes[i];
			if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
			const btVector3			d=n.m_n*nscl;
			idraw->drawLine(n.m_x,n.m_x+d,ncolor);
			idraw->drawLine(n.m_x,n.m_x-d,ncolor*0.5);
		}
	}
	/* Contacts	*/ 
	if(0!=(drawflags&fDrawFlags::Contacts))
	{
		static const btVector3		axis[]={btVector3(1,0,0),
			btVector3(0,1,0),
			btVector3(0,0,1)};
		for(i=0;i<psb->m_rcontacts.size();++i)
		{		
			const btSoftBody::RContact&	c=psb->m_rcontacts[i];
			const btVector3				o=	c.m_node->m_x-c.m_cti.m_normal*
				(dot(c.m_node->m_x,c.m_cti.m_normal)+c.m_cti.m_offset);
			const btVector3				x=cross(c.m_cti.m_normal,axis[c.m_cti.m_normal.minAxis()]).normalized();
			const btVector3				y=cross(x,c.m_cti.m_normal).normalized();
			idraw->drawLine(o-x*nscl,o+x*nscl,ccolor);
			idraw->drawLine(o-y*nscl,o+y*nscl,ccolor);
			idraw->drawLine(o,o+c.m_cti.m_normal*nscl*3,btVector3(1,1,0));
		}
	}
	/* Anchors	*/ 
	if(0!=(drawflags&fDrawFlags::Anchors))
	{
		for(i=0;i<psb->m_anchors.size();++i)
		{
			const btSoftBody::Anchor&	a=psb->m_anchors[i];
			const btVector3				q=a.m_body->getWorldTransform()*a.m_local;
			drawVertex(idraw,a.m_node->m_x,0.25,btVector3(1,0,0));
			drawVertex(idraw,q,0.25,btVector3(0,1,0));
			idraw->drawLine(a.m_node->m_x,q,btVector3(1,1,1));
		}
		for(i=0;i<psb->m_nodes.size();++i)
		{
			const btSoftBody::Node&	n=psb->m_nodes[i];		
			if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
			if(n.m_im<=0)
			{
				drawVertex(idraw,n.m_x,0.25,btVector3(1,0,0));
			}
		}
	}
	/* Faces	*/ 
	if(0!=(drawflags&fDrawFlags::Faces))
	{
		const btScalar	scl=(btScalar)0.8;
		const btScalar	alp=(btScalar)1;
		const btVector3	col(0,(btScalar)0.7,0);
		for(i=0;i<psb->m_faces.size();++i)
		{
			const btSoftBody::Face&	f=psb->m_faces[i];
			if(0==(f.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
			const btVector3			x[]={f.m_n[0]->m_x,f.m_n[1]->m_x,f.m_n[2]->m_x};
			const btVector3			c=(x[0]+x[1]+x[2])/3;
			idraw->drawTriangle((x[0]-c)*scl+c,
				(x[1]-c)*scl+c,
				(x[2]-c)*scl+c,
				col,alp);
		}	
	}
	/* Clusters	*/ 
	if(0!=(drawflags&fDrawFlags::Clusters))
	{
		srand(1806);
		for(i=0;i<psb->m_clusters.size();++i)
		{
			if(psb->m_clusters[i]->m_collide)
			{
				btVector3						color(	rand()/(btScalar)RAND_MAX,
					rand()/(btScalar)RAND_MAX,
					rand()/(btScalar)RAND_MAX);
				color=color.normalized()*0.75;
				btAlignedObjectArray<btVector3>	vertices;
				vertices.resize(psb->m_clusters[i]->m_nodes.size());
				for(j=0,nj=vertices.size();j<nj;++j)
				{				
					vertices[j]=psb->m_clusters[i]->m_nodes[j]->m_x;
				}
				HullDesc		hdsc(QF_TRIANGLES,vertices.size(),&vertices[0]);
				HullResult		hres;
				HullLibrary		hlib;
				hdsc.mMaxVertices=vertices.size();
				hlib.CreateConvexHull(hdsc,hres);
				const btVector3	center=average(hres.m_OutputVertices);
				add(hres.m_OutputVertices,-center);
				mul(hres.m_OutputVertices,(btScalar)1);
				add(hres.m_OutputVertices,center);
				for(j=0;j<(int)hres.mNumFaces;++j)
				{
					const int idx[]={hres.m_Indices[j*3+0],hres.m_Indices[j*3+1],hres.m_Indices[j*3+2]};
					idraw->drawTriangle(hres.m_OutputVertices[idx[0]],
						hres.m_OutputVertices[idx[1]],
						hres.m_OutputVertices[idx[2]],
						color,1);
				}
				hlib.ReleaseResult(hres);
			}
			/* Velocities	*/ 
#if 0
			for(int j=0;j<psb->m_clusters[i].m_nodes.size();++j)
			{
				const btSoftBody::Cluster&	c=psb->m_clusters[i];
				const btVector3				r=c.m_nodes[j]->m_x-c.m_com;
				const btVector3				v=c.m_lv+cross(c.m_av,r);
				idraw->drawLine(c.m_nodes[j]->m_x,c.m_nodes[j]->m_x+v,btVector3(1,0,0));
			}
#endif
			/* Frame		*/ 
			btSoftBody::Cluster& c=*psb->m_clusters[i];
			idraw->drawLine(c.m_com,c.m_framexform*btVector3(10,0,0),btVector3(1,0,0));
			idraw->drawLine(c.m_com,c.m_framexform*btVector3(0,10,0),btVector3(0,1,0));
			idraw->drawLine(c.m_com,c.m_framexform*btVector3(0,0,10),btVector3(0,0,1));
		}
	}
	/* Notes	*/ 
	if(0!=(drawflags&fDrawFlags::Notes))
	{
		for(i=0;i<psb->m_notes.size();++i)
		{
			const btSoftBody::Note&	n=psb->m_notes[i];
			btVector3				p=n.m_offset;
			for(int j=0;j<n.m_rank;++j)
			{
				p+=n.m_nodes[j]->m_x*n.m_coords[j];
			}
			idraw->draw3dText(p,n.m_text);
		}
	}
	/* Node tree	*/ 
	if(0!=(drawflags&fDrawFlags::NodeTree))		DrawNodeTree(psb,idraw);
	/* Face tree	*/ 
	if(0!=(drawflags&fDrawFlags::FaceTree))		DrawFaceTree(psb,idraw);
	/* Cluster tree	*/ 
	if(0!=(drawflags&fDrawFlags::ClusterTree))	DrawClusterTree(psb,idraw);
	/* Joints		*/ 
	if(0!=(drawflags&fDrawFlags::Joints))
	{
		for(i=0;i<psb->m_joints.size();++i)
		{
			const btSoftBody::Joint*	pj=psb->m_joints[i];
			switch(pj->Type())
			{
			case	btSoftBody::Joint::eType::Linear:
				{
					const btSoftBody::LJoint*	pjl=(const btSoftBody::LJoint*)pj;
					const btVector3	a0=pj->m_bodies[0].xform()*pjl->m_refs[0];
					const btVector3	a1=pj->m_bodies[1].xform()*pjl->m_refs[1];
					idraw->drawLine(pj->m_bodies[0].xform().getOrigin(),a0,btVector3(1,1,0));
					idraw->drawLine(pj->m_bodies[1].xform().getOrigin(),a1,btVector3(0,1,1));
					drawVertex(idraw,a0,0.25,btVector3(1,1,0));
					drawVertex(idraw,a1,0.25,btVector3(0,1,1));
				}
				break;
			case	btSoftBody::Joint::eType::Angular:
				{
					const btSoftBody::AJoint*	pja=(const btSoftBody::AJoint*)pj;
					const btVector3	o0=pj->m_bodies[0].xform().getOrigin();
					const btVector3	o1=pj->m_bodies[1].xform().getOrigin();
					const btVector3	a0=pj->m_bodies[0].xform().getBasis()*pj->m_refs[0];
					const btVector3	a1=pj->m_bodies[1].xform().getBasis()*pj->m_refs[1];
					idraw->drawLine(o0,o0+a0*10,btVector3(1,1,0));
					idraw->drawLine(o0,o0+a1*10,btVector3(1,1,0));
					idraw->drawLine(o1,o1+a0*10,btVector3(0,1,1));
					idraw->drawLine(o1,o1+a1*10,btVector3(0,1,1));
				}
			}		
		}
	}
}
Esempio n. 11
0
File: main.cpp Progetto: MR-KO/GAGT
/*
 * Called when we should redraw the scene (i.e. every frame).
 * It will show the current framerate in the window title.
 */
void draw(void) {
	int time = glutGet(GLUT_ELAPSED_TIME);
	int frametime = time - last_time;
	frame_count++;

	// Clear the buffer
	glColor3f(0, 0, 0);
	glClear(GL_COLOR_BUFFER_BIT);


	//
	// Do any logic and drawing here.
	//

	// suggested vel = 8, suggested pos = 3.
	float32 timestep = 1.0f / 60.0f;
	int32 velocity_iterations = 6;
	int32 position_iterations = 2;

	b2Body *body_list = world->GetBodyList();
	int current_polygon = 0;

	while(body_list != NULL) {
		b2Fixture *fixture_list = body_list->GetFixtureList();

		if (ground == body_list) {
			body_list = body_list->GetNext();
			current_polygon++;
			continue;
		}

		while(fixture_list != NULL) {
			if (fixture_list->GetType() == 2) {
				b2PolygonShape *poly = (b2PolygonShape*) fixture_list->GetShape();
				drawPolygon(body_list, poly);
			}

			fixture_list = fixture_list->GetNext();
		}

		body_list = body_list->GetNext();
		current_polygon++;
	}

	if (play) {
		world->Step(timestep, velocity_iterations, position_iterations);

		/* If the ball has reached the finish, continue to the next level or finish the game. */
		b2Vec2 position = ball->GetPosition();

		if (ballHasReachedFinish(position)) {
			if (current_level > num_levels) {
				timeval play_time2;
				gettimeofday(&play_time2, 0);

				fprintf(stderr, "You have played for %d seconds.\n",
					play_time2.tv_sec - play_time.tv_sec);
				fprintf(stderr, "You have won the game! Also, you have lost the game... ;)\n");
				exit(0);
			} else {
				gettimeofday(&finish_time, 0);
				fprintf(stderr, "You finished level %d in %d seconds!\n", current_level,
					finish_time.tv_sec - start_time.tv_sec);

				if (current_level >= num_levels) {
					fprintf(stderr, "You have won the game! Also, you have lost the game... ;)\n");
					exit(0);
				} else {
					load_world(current_level);

					/* Automatically pause the world... */
					play = 0;
				}
			}
		}
	}

	// Draw ball
	drawBall();

	// Draw finish
	drawFinish();

	if (num_vertices > -1) {
		drawVertex(num_vertices);
		// printf("derp%d\n", num_vertices);
		if (drawn == 1) {
			num_vertices = -1;
			drawn = 0;
		}
	}

	// Show rendered frame
	glutSwapBuffers();

	// Display fps in window title.
	if (frametime >= 1000) {
		char window_title[128];
		snprintf(window_title, 128,
			"Box2D: %f fps, level %d/%d",
			frame_count / (frametime / 1000.f), current_level, num_levels);
		glutSetWindowTitle(window_title);
		last_time = time;
		frame_count = 0;
	}
}
Esempio n. 12
0
void			btSoftBodyHelpers::Draw(	btSoftBody* psb,
										btIDebugDraw* idraw,
										int drawflags)
{
	const btScalar		scl=(btScalar)0.1;
	const btScalar		nscl=scl*5;
	const btVector3		lcolor=btVector3(0,0,0);
	const btVector3		ncolor=btVector3(1,1,1);
	const btVector3		ccolor=btVector3(1,0,0);
	int i,j,nj;

		/* Clusters	*/ 
	if(0!=(drawflags&fDrawFlags::Clusters))
	{
		srand(1806);
		for(i=0;i<psb->m_clusters.size();++i)
		{
			if(psb->m_clusters[i]->m_collide)
			{
				btVector3						color(	rand()/(btScalar)RAND_MAX,
					rand()/(btScalar)RAND_MAX,
					rand()/(btScalar)RAND_MAX);
				color=color.normalized()*0.75;
				btAlignedObjectArray<btVector3>	vertices;
				vertices.resize(psb->m_clusters[i]->m_nodes.size());
				for(j=0,nj=vertices.size();j<nj;++j)
				{				
					vertices[j]=psb->m_clusters[i]->m_nodes[j]->m_x;
				}
#define USE_NEW_CONVEX_HULL_COMPUTER
#ifdef USE_NEW_CONVEX_HULL_COMPUTER
				btConvexHullComputer	computer;
				int stride = sizeof(btVector3);
				int count = vertices.size();
				btScalar shrink=0.f;
				btScalar shrinkClamp=0.f;
				computer.compute(&vertices[0].getX(),stride,count,shrink,shrinkClamp);
				for (int i=0;i<computer.faces.size();i++)
				{

					int face = computer.faces[i];
					//printf("face=%d\n",face);
					const btConvexHullComputer::Edge*  firstEdge = &computer.edges[face];
					const btConvexHullComputer::Edge*  edge = firstEdge->getNextEdgeOfFace();

					int v0 = firstEdge->getSourceVertex();
					int v1 = firstEdge->getTargetVertex();
					while (edge!=firstEdge)
					{
						int v2 = edge->getTargetVertex();
						idraw->drawTriangle(computer.vertices[v0],computer.vertices[v1],computer.vertices[v2],color,1);
						edge = edge->getNextEdgeOfFace();
						v0=v1;
						v1=v2;
					};
				}
#else

				HullDesc		hdsc(QF_TRIANGLES,vertices.size(),&vertices[0]);
				HullResult		hres;
				HullLibrary		hlib;
				hdsc.mMaxVertices=vertices.size();
				hlib.CreateConvexHull(hdsc,hres);
				const btVector3	center=average(hres.m_OutputVertices);
				add(hres.m_OutputVertices,-center);
				mul(hres.m_OutputVertices,(btScalar)1);
				add(hres.m_OutputVertices,center);
				for(j=0;j<(int)hres.mNumFaces;++j)
				{
					const int idx[]={hres.m_Indices[j*3+0],hres.m_Indices[j*3+1],hres.m_Indices[j*3+2]};
					idraw->drawTriangle(hres.m_OutputVertices[idx[0]],
						hres.m_OutputVertices[idx[1]],
						hres.m_OutputVertices[idx[2]],
						color,1);
				}
				hlib.ReleaseResult(hres);
#endif

			}
			/* Velocities	*/ 
#if 0
			for(int j=0;j<psb->m_clusters[i].m_nodes.size();++j)
			{
				const btSoftBody::Cluster&	c=psb->m_clusters[i];
				const btVector3				r=c.m_nodes[j]->m_x-c.m_com;
				const btVector3				v=c.m_lv+btCross(c.m_av,r);
				idraw->drawLine(c.m_nodes[j]->m_x,c.m_nodes[j]->m_x+v,btVector3(1,0,0));
			}
#endif
			/* Frame		*/ 
	//		btSoftBody::Cluster& c=*psb->m_clusters[i];
	//		idraw->drawLine(c.m_com,c.m_framexform*btVector3(10,0,0),btVector3(1,0,0));
	//		idraw->drawLine(c.m_com,c.m_framexform*btVector3(0,10,0),btVector3(0,1,0));
	//		idraw->drawLine(c.m_com,c.m_framexform*btVector3(0,0,10),btVector3(0,0,1));
		}
	}
	else
	{
		/* Nodes	*/ 
		if(0!=(drawflags&fDrawFlags::Nodes))
		{
			for(i=0;i<psb->m_nodes.size();++i)
			{
				const btSoftBody::Node&	n=psb->m_nodes[i];
				if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
				idraw->drawLine(n.m_x-btVector3(scl,0,0),n.m_x+btVector3(scl,0,0),btVector3(1,0,0));
				idraw->drawLine(n.m_x-btVector3(0,scl,0),n.m_x+btVector3(0,scl,0),btVector3(0,1,0));
				idraw->drawLine(n.m_x-btVector3(0,0,scl),n.m_x+btVector3(0,0,scl),btVector3(0,0,1));
			}
		}
		/* Links	*/ 
		if(0!=(drawflags&fDrawFlags::Links))
		{
			for(i=0;i<psb->m_links.size();++i)
			{
				const btSoftBody::Link&	l=psb->m_links[i];
				if(0==(l.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
				idraw->drawLine(l.m_n[0]->m_x,l.m_n[1]->m_x,lcolor);
			}
		}
		/* Normals	*/ 
		if(0!=(drawflags&fDrawFlags::Normals))
		{
			for(i=0;i<psb->m_nodes.size();++i)
			{
				const btSoftBody::Node&	n=psb->m_nodes[i];
				if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
				const btVector3			d=n.m_n*nscl;
				idraw->drawLine(n.m_x,n.m_x+d,ncolor);
				idraw->drawLine(n.m_x,n.m_x-d,ncolor*0.5);
			}
		}
		/* Contacts	*/ 
		if(0!=(drawflags&fDrawFlags::Contacts))
		{
			static const btVector3		axis[]={btVector3(1,0,0),
				btVector3(0,1,0),
				btVector3(0,0,1)};
			for(i=0;i<psb->m_rcontacts.size();++i)
			{		
				const btSoftBody::RContact&	c=psb->m_rcontacts[i];
				const btVector3				o=	c.m_node->m_x-c.m_cti.m_normal*
					(btDot(c.m_node->m_x,c.m_cti.m_normal)+c.m_cti.m_offset);
				const btVector3				x=btCross(c.m_cti.m_normal,axis[c.m_cti.m_normal.minAxis()]).normalized();
				const btVector3				y=btCross(x,c.m_cti.m_normal).normalized();
				idraw->drawLine(o-x*nscl,o+x*nscl,ccolor);
				idraw->drawLine(o-y*nscl,o+y*nscl,ccolor);
				idraw->drawLine(o,o+c.m_cti.m_normal*nscl*3,btVector3(1,1,0));
			}
		}
		/* Faces	*/ 
	if(0!=(drawflags&fDrawFlags::Faces))
	{
		const btScalar	scl=(btScalar)0.8;
		const btScalar	alp=(btScalar)1;
		const btVector3	col(0,(btScalar)0.7,0);
		for(i=0;i<psb->m_faces.size();++i)
		{
			const btSoftBody::Face&	f=psb->m_faces[i];
			if(0==(f.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
			const btVector3			x[]={f.m_n[0]->m_x,f.m_n[1]->m_x,f.m_n[2]->m_x};
			const btVector3			c=(x[0]+x[1]+x[2])/3;
			idraw->drawTriangle((x[0]-c)*scl+c,
				(x[1]-c)*scl+c,
				(x[2]-c)*scl+c,
				col,alp);
		}	
	}
	/* Tetras	*/ 
	if(0!=(drawflags&fDrawFlags::Tetras))
	{
		const btScalar	scl=(btScalar)0.8;
		const btScalar	alp=(btScalar)1;
		const btVector3	col((btScalar)0.3,(btScalar)0.3,(btScalar)0.7);
		for(int i=0;i<psb->m_tetras.size();++i)
		{
			const btSoftBody::Tetra&	t=psb->m_tetras[i];
			if(0==(t.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
			const btVector3				x[]={t.m_n[0]->m_x,t.m_n[1]->m_x,t.m_n[2]->m_x,t.m_n[3]->m_x};
			const btVector3				c=(x[0]+x[1]+x[2]+x[3])/4;
			idraw->drawTriangle((x[0]-c)*scl+c,(x[1]-c)*scl+c,(x[2]-c)*scl+c,col,alp);
			idraw->drawTriangle((x[0]-c)*scl+c,(x[1]-c)*scl+c,(x[3]-c)*scl+c,col,alp);
			idraw->drawTriangle((x[1]-c)*scl+c,(x[2]-c)*scl+c,(x[3]-c)*scl+c,col,alp);
			idraw->drawTriangle((x[2]-c)*scl+c,(x[0]-c)*scl+c,(x[3]-c)*scl+c,col,alp);
		}	
	}
	}
	/* Anchors	*/ 
	if(0!=(drawflags&fDrawFlags::Anchors))
	{
		for(i=0;i<psb->m_anchors.size();++i)
		{
			const btSoftBody::Anchor&	a=psb->m_anchors[i];
			const btVector3				q=a.m_body->getWorldTransform()*a.m_local;
			drawVertex(idraw,a.m_node->m_x,0.25,btVector3(1,0,0));
			drawVertex(idraw,q,0.25,btVector3(0,1,0));
			idraw->drawLine(a.m_node->m_x,q,btVector3(1,1,1));
		}
		for(i=0;i<psb->m_nodes.size();++i)
		{
			const btSoftBody::Node&	n=psb->m_nodes[i];		
			if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
			if(n.m_im<=0)
			{
				drawVertex(idraw,n.m_x,0.25,btVector3(1,0,0));
			}
		}
	}
	

	/* Notes	*/ 
	if(0!=(drawflags&fDrawFlags::Notes))
	{
		for(i=0;i<psb->m_notes.size();++i)
		{
			const btSoftBody::Note&	n=psb->m_notes[i];
			btVector3				p=n.m_offset;
			for(int j=0;j<n.m_rank;++j)
			{
				p+=n.m_nodes[j]->m_x*n.m_coords[j];
			}
			idraw->draw3dText(p,n.m_text);
		}
	}
	/* Node tree	*/ 
	if(0!=(drawflags&fDrawFlags::NodeTree))		DrawNodeTree(psb,idraw);
	/* Face tree	*/ 
	if(0!=(drawflags&fDrawFlags::FaceTree))		DrawFaceTree(psb,idraw);
	/* Cluster tree	*/ 
	if(0!=(drawflags&fDrawFlags::ClusterTree))	DrawClusterTree(psb,idraw);
	/* Joints		*/ 
	if(0!=(drawflags&fDrawFlags::Joints))
	{
		for(i=0;i<psb->m_joints.size();++i)
		{
			const btSoftBody::Joint*	pj=psb->m_joints[i];
			switch(pj->Type())
			{
			case	btSoftBody::Joint::eType::Linear:
				{
					const btSoftBody::LJoint*	pjl=(const btSoftBody::LJoint*)pj;
					const btVector3	a0=pj->m_bodies[0].xform()*pjl->m_refs[0];
					const btVector3	a1=pj->m_bodies[1].xform()*pjl->m_refs[1];
					idraw->drawLine(pj->m_bodies[0].xform().getOrigin(),a0,btVector3(1,1,0));
					idraw->drawLine(pj->m_bodies[1].xform().getOrigin(),a1,btVector3(0,1,1));
					drawVertex(idraw,a0,0.25,btVector3(1,1,0));
					drawVertex(idraw,a1,0.25,btVector3(0,1,1));
				}
				break;
			case	btSoftBody::Joint::eType::Angular:
				{
					//const btSoftBody::AJoint*	pja=(const btSoftBody::AJoint*)pj;
					const btVector3	o0=pj->m_bodies[0].xform().getOrigin();
					const btVector3	o1=pj->m_bodies[1].xform().getOrigin();
					const btVector3	a0=pj->m_bodies[0].xform().getBasis()*pj->m_refs[0];
					const btVector3	a1=pj->m_bodies[1].xform().getBasis()*pj->m_refs[1];
					idraw->drawLine(o0,o0+a0*10,btVector3(1,1,0));
					idraw->drawLine(o0,o0+a1*10,btVector3(1,1,0));
					idraw->drawLine(o1,o1+a0*10,btVector3(0,1,1));
					idraw->drawLine(o1,o1+a1*10,btVector3(0,1,1));
					break;
				}
				default:
				{
				}
					
			}		
		}
	}
}
Esempio n. 13
0
void Moon::renderOrbit(void){
	glBegin(GL_LINE_STRIP);
	drawVertex();
	glEnd();
}
void drawQuads(float x, float y, float z)
//x,y,z typically 1.
// useful for clipping
// If x=0.5 then only left side of texture drawn
// If y=0.5 then only posterior side of texture drawn
// If z=0.5 then only inferior side of texture drawn
{
    glBegin(GL_QUADS);
    //* Back side
    glNormal3f(0.0, 0.0, -1.0);
    drawVertex(0.0, 0.0, 0.0);
    drawVertex(0.0, y, 0.0);
    drawVertex(x, y, 0.0);
    drawVertex(x, 0.0, 0.0);
    //* Front side
    glNormal3f(0.0, 0.0, 1.0);
    drawVertex(0.0, 0.0, z);
    drawVertex(x, 0.0, z);
    drawVertex(x, y, z);
    drawVertex(0.0, y, z);
    //* Top side
    glNormal3f(0.0, 1.0, 0.0);
    drawVertex(0.0, y, 0.0);
    drawVertex(0.0, y, z);
    drawVertex(x, y, z);
    drawVertex(x, y, 0.0);
    //* Bottom side
    glNormal3f(0.0, -1.0, 0.0);
    drawVertex(0.0, 0.0, 0.0);
    drawVertex(x, 0.0, 0.0);
    drawVertex(x, 0.0, z);
    drawVertex(0.0, 0.0, z);
    //* Left side
    glNormal3f(-1.0, 0.0, 0.0);
    drawVertex(0.0, 0.0, 0.0);
    drawVertex(0.0, 0.0, z);
    drawVertex(0.0, y, z);
    drawVertex(0.0, y, 0.0);
    //* Right side
    glNormal3f(1.0, 0.0, 0.0);
    drawVertex(x, 0.0, 0.0);
    drawVertex(x, y, 0.0);
    drawVertex(x, y, z);
    drawVertex(x, 0.0, z);
    glEnd();
}
Esempio n. 15
0
File: func.cpp Progetto: lichq5/-
CImg<double> HoughTransf(CImg<double> testImg, double threshold) {
	int w = testImg.width();
	int h = testImg.height();
	int z = testImg.depth();
	int c = testImg.spectrum();
	int centerX = w/2;
	int centerY = h/2;
	int hough_space = 1000;
	double hough_cell = PI/hough_space;
	int diagonalLine = (int)round(sqrt(w*w + h*h));
	CImg<double> houghImg(hough_space,diagonalLine*2,z,c);
	houghImg.fill(0);
	// start hough transform now...
	double theta = 0;
	int r = 0;
	cimg_forXYZC(testImg, x,y,z,c) {
		if (testImg(x,y,z,c) != 0) {
			for (int i = 0; i < hough_space; i++) {
				double theta = i*hough_cell;
				r = (int)((y-centerY)*sin(theta) - (x-centerX)*cos(theta));
				r += diagonalLine;  //从原点diagonalLine开始,上下对称
				if (r >= 0 && r < 2*diagonalLine)
					houghImg(i,r,z,c) = houghImg(i,r,z,c) + 1;
			}
		}
	}
	//houghImg.display("HOugh");

	int max_hough = 0;
	cimg_forXYZC (houghImg, x,y,z,c) {
		if (houghImg(x,y,z,c) > max_hough)
			max_hough = houghImg(x,y,z,c);
	}
	
	//transfer back to image pixels space from hough space...
	int hough_threshold = (int)round(threshold*max_hough);
	cimg_forXYZC (houghImg, x,y,z,c) {
		if (houghImg(x,y,z,c) < hough_threshold)
			houghImg(x,y,z,c) = 0;
	}
	//houghImg.display("hough");
	CImg<double> houghImg_copy(houghImg);
	houghImg_copy.sort(false);
	
	int pass = 0;
	//表示是否已经找到一条宽或长
	bool x_match = false;
	bool y_match = false;
	double xb1 = 0;
	double xb2 = 0;
	double yb1 = 0;
	double yb2 = 0;
	double xtheta1 = 0;
	double xtheta2 = 0;
	double ytheta1 = 0;
	double ytheta2 = 0;
	int r1 = 0;
	int r2 = 0;
	int cell1 = 0;
	int cell2 = 0;
	int count = 0;
	bool finish_x = false;
	bool finish_y = false;
	CImg<int> vertex(4,1,1,2);  //用于保存角点
	int v = 0;
	cimg_forXYZC(houghImg, hx,hy,z,c) {
		if (count == 4) break;
		if (houghImg(hx,hy,z,c) == houghImg_copy(pass,0,0,0)) {
			if (hx*180/hough_space > 45 && hx*180/hough_space <= 135) {
				if (!finish_x) {
				if (x_match) {
					xb2 = (hy-diagonalLine)/sin(hx*hough_cell);
					xtheta2 = hx*180/hough_space;
					cell2 = hx;
					double min_theta = xtheta1 > xtheta2? xtheta2 : xtheta1;
					double max_theta = xtheta1 > xtheta2? xtheta1 : xtheta2; 
					if (((min_theta+180-max_theta < 10 && xb1*xb2>0) ||abs(xtheta2- xtheta1) < 10) && abs(cell1-cell2) > 10) {
						for (int x = 0; x < w; x++) {
							int y = (int)((hy-diagonalLine+(x-centerX)*cos(hx*hough_cell))/sin(hx*hough_cell))+centerY;
							if (y < h && y >= 0) {
								if (testImg(x,y,0,0) == 255) {
									cout << "角点坐标为: (" << x << "," << y << ")" << endl;
									vertex(v,0,0,0) = x;
									vertex(v++,0,0,1) = y;
								}else
									testImg(x,y,0,0) = 255;
							}
						}
						count++;
						//testImg.display();
						finish_x = true;
						//打印直线信息
						cout << "pass: "******", max: " << houghImg_copy(pass,0,0,0) << ", hx: " << hx
						<< ", hy: " << hy << ", theta: " << hx*180/hough_space << ", B: " << (hy-diagonalLine)/sin(hx*hough_cell)
						<< ", K: " << -sin(hx*hough_cell)/cos(hx*hough_cell) << endl;
					}
				
				} else {
					count++;
					x_match = true;
					cell1 = hx;
					xtheta1 = hx*180/hough_space;
					xb1 = (hy-diagonalLine)/sin(hx*hough_cell);
					for (int x = 0; x < w; x++) {
						int y = (int)((hy-diagonalLine+(x-centerX)*cos(hx*hough_cell))/sin(hx*hough_cell))+centerY;
						if (y < h && y >= 0) {
							if (testImg(x,y,0,0) == 255) {
								cout << "角点坐标为: (" << x << "," << y << ")" << endl;
								vertex(v,0,0,0) = x;
								vertex(v++,0,0,1) = y;
							} else
								testImg(x,y,0,0) = 255;
						}
					}
					//testImg.display();
					//打印直线信息
					cout << "pass: "******", max: " << houghImg_copy(pass,0,0,0) << ", hx: " << hx
						<< ", hy: " << hy << ", theta: " << hx*180/hough_space << ", B: " << (hy-diagonalLine)/sin(hx*hough_cell)
						<< ", K: " << -sin(hx*hough_cell)/cos(hx*hough_cell) << endl;
				}
				}
			} else {
				if (!finish_y) {
				if (y_match) {
					yb2 = (hy-diagonalLine)/sin(hx*hough_cell);
					ytheta2 = hx*180/hough_space;
					r2 = hy;
					double min_theta = ytheta1 > ytheta2? ytheta2 : ytheta1;
					double max_theta = ytheta1 > ytheta2? ytheta1 : ytheta2; 
					//如果角度基本互补,那么截距符号要一样,否则说明两条线基本重合,假设如果两条直线的夹角大于10,很有可能该直线不是要找的边缘
					if (((min_theta+180-max_theta < 10 && yb1*yb2 > 0) || (abs(ytheta2- ytheta1) < 10)) &&abs(r2-r1) > 10&& r2 > 0) {
						for (int y = 0; y < h; y++) {
							int x = (int)((-hy+diagonalLine+(y-centerY)*sin(hx*hough_cell))/cos(hx*hough_cell))+centerX;
							if (x < w && x >= 0) {
								if (testImg(x,y,0,0) == 255) {
									cout << "角点坐标为: (" << x << "," << y << ")" << endl;
									vertex(v,0,0,0) = x;
									vertex(v++,0,0,1) = y;
								} else
									testImg(x,y,0,0) = 255;
							}
						}
						count++;
						//testImg.display();
						finish_y = true;
						//打印直线信息
						cout << "pass: "******", max: " << houghImg_copy(pass,0,0,0) << ", hx: " << hx
						<< ", hy: " << hy << ", theta: " << hx*180/hough_space << ", B: " << (hy-diagonalLine)/sin(hx*hough_cell)
						<< ", K: " << -sin(hx*hough_cell)/cos(hx*hough_cell) << endl;
					}
				} else {
					count++;
					y_match = true;
					r1 = hy;
					ytheta1 = hx*180/hough_space;
					yb1 = (hy-diagonalLine)/sin(hx*hough_cell);
					for (int y = 0; y < h; y++) {
						int x = (int)((-hy+diagonalLine+(y-centerY)*sin(hx*hough_cell))/cos(hx*hough_cell))+centerX;
						if (x < w && x >= 0) {
							if (testImg(x,y,0,0) == 255) {
								cout << "角点坐标为: (" << x << "," << y << ")" << endl;
								vertex(v,0,0,0) = x;
								vertex(v++,0,0,1) = y;
							} else
								testImg(x,y,0,0) = 255;
						}
					}
					//打印直线信息
					cout << "pass: "******", max: " << houghImg_copy(pass,0,0,0) << ", hx: " << hx
						<< ", hy: " << hy << ", theta: " << hx*180/hough_space << ", B: " << (hy-diagonalLine)/sin(hx*hough_cell)
						<< ", K: " << -sin(hx*hough_cell)/cos(hx*hough_cell) << endl;
					//testImg.display();
				}
				}
			}
		hx = 0;
		hy = 0;
		pass++;
		}
	}
	//testImg.display("line");

	return drawVertex(vertex,testImg);
}
void MaxFlowVisualizer::showVertecies(QPainter &painter) {
    for (VertexIndex vertex = 0; vertex < verteciesList.size(); ++vertex) {
        drawVertex(verteciesList[vertex], painter);
    }
}