void nRenderer::drawQuad(nVertex p1, nVertex p2, nVertex p3, nVertex p4) { glBegin(GL_QUADS); drawVertex(p1); drawVertex(p2); drawVertex(p3); drawVertex(p4); glEnd(); }
void nRenderer::drawTriangle(nTriangle t) { t.material->bind(); glBegin(GL_TRIANGLES); drawVertex(t.vert[0]); drawVertex(t.vert[1]); drawVertex(t.vert[2]); glEnd(); }
/** * 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(); }
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(); }
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(); }
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(); }
/** * 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); } }
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)); } } } } }
/* * 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; } }
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: { } } } } }
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(); }
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); } }