您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ AddVertex函数代码示例

51自学网 2021-06-01 19:45:41
  C++
这篇教程C++ AddVertex函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中AddVertex函数的典型用法代码示例。如果您正苦于以下问题:C++ AddVertex函数的具体用法?C++ AddVertex怎么用?C++ AddVertex使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了AddVertex函数的23个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: contour

// adds an arc to the given center, start point, pen width, and angle (degrees).bool VRML_LAYER::AppendArc( double aCenterX, double aCenterY, double aRadius,                            double aStartAngle, double aAngle, int aContourID ){    if( aContourID < 0 || (unsigned int) aContourID >= contours.size() )    {        error = "AppendArc(): invalid contour (out of range)";        return false;    }    aAngle = aAngle / 180.0 * M_PI;    aStartAngle = aStartAngle / 180.0 * M_PI;    int nsides = calcNSides( aRadius, aAngle );    double da = aAngle / nsides;    bool fail = false;    if( aAngle > 0 )    {        aAngle += aStartAngle;        for( double ang = aStartAngle; ang < aAngle; ang += da )            fail |= !AddVertex( aContourID, aCenterX + aRadius * cos( ang ),                                aCenterY + aRadius * sin( ang ) );    }    else    {        aAngle += aStartAngle;        for( double ang = aStartAngle; ang > aAngle; ang += da )            fail |= !AddVertex( aContourID, aCenterX + aRadius * cos( ang ),                                aCenterY + aRadius * sin( ang ) );    }    return !fail;}
开发者ID:PatMart,项目名称:kicad-source-mirror,代码行数:36,


示例2: add

bool add(int which_poly, int x, int y) {     bool res = false;    vertex *v;     v = (vertex*)malloc(sizeof(vertex));     v->x = x;     v->y = y;    v->alpha = 0.;    v->internal = false;    v->linkTag = 0;    if (which_poly == 1)     { 	v->next = s_size+1 ;	res = AddVertex(s,s_size,v);    }     else if (which_poly == 2)     { 	v->next = c_size+1 ;	res = AddVertex(c,c_size,v);    }     else {	printf("%d is not a valid polygon index./n",which_poly);	exit(1);    }    free(v);    return res;}
开发者ID:ablimit,项目名称:hadoopgis,代码行数:30,


示例3: Drawable

Mesh::Mesh(Program &program)	: Drawable(program)	, vbuffer(-1)	, nbuffer(-1)	, tbuffer(-1)	, fbuffer(-1)	, texture(NULL){	AddVertex(-1.0, -1.0, -1.0);	AddVertex(-1.0, 1.0, -1.0);	AddVertex(1.0, 1.0, -1.0);	AddVertex(1.0, -1.0, -1.0);	AddTexcoord(0, 1);	AddTexcoord(0, 0);	AddTexcoord(1, 0);	AddTexcoord(1, 1);	AddColour(1.0, 0.0, 0.0);	AddColour(0.0, 1.0, 0.0);	AddColour(0.0, 0.0, 1.0);	AddColour(1.0, 1.0, 1.0);	AddNormal(0.0, 0.0, 1.0);	AddNormal(0.0, 0.0, 1.0);	AddNormal(0.0, 0.0, 1.0);	AddNormal(0.0, 0.0, 1.0);	AddFace(0, 1, 2);	AddFace(2, 3, 0);	InitBuffers();}
开发者ID:Wynjones1,项目名称:game,代码行数:32,


示例4: SetTexture

	void CDX9Renderer::Box(const rect& r, cr_float angle, point hotspot, const color& c)	{		// No support for textured lines		SetTexture(NULL);		quad q((r - hotspot).rotate_to_quad(angle, r.topleft()));		BeginBatch(batch_linestrip);		CBatch_Draw* draw_op = reinterpret_cast<CBatch_Draw*>(batch.back());		D3DCOLOR color = c.getD3DCOLOR();		// 4 vertices and use 5th index to repeat first vertex closing the strip as a box		AddVertex(color, q.tl, 0.0f, 0.0f);		AddVertex(color, q.tr, 0.0f, 0.0f);		AddVertex(color, q.br, 0.0f, 0.0f);		AddVertex(color, q.bl, 0.0f, 0.0f);		unsigned short index = draw_op->vertex_count;		AddIndex(index);		AddIndex(index + 1);		AddIndex(index + 2);		AddIndex(index + 3);		AddIndex(index);		draw_op->vertex_count += 4;		draw_op->index_count += 5;	}
开发者ID:segafan,项目名称:Construct-classic,代码行数:28,


示例5: fgets

void Mesh::ReadVertexData(FILE *fp, int num, bool have_normals, bool have_tex){	double n[3];	double v[3];	double t[2];	char buf[1024];	for(int i = 0; i < num; i++)	{		fgets(buf, 1024, fp);		if(have_normals && have_tex)		{			sscanf(buf, "%lf %lf %lf %lf %lf %lf %lf %lf", v, v+1, v+2, n, n+1, n+2, t, t+1);			AddVertex(v);			AddNormal(n);			AddTexcoord(t);		}		else if(have_normals)		{			sscanf(buf, "%lf %lf %lf %lf %lf %lf", v, v+1, v+2, n, n+1, n+2);			AddVertex(v);			AddNormal(n);		}		else if(have_tex)		{			sscanf(buf, "%lf %lf %lf %lf %lf", v, v+1, v+2, t, t+1);			AddVertex(v);			AddTexcoord(t);		}		else		{			sscanf(buf, "%lf %lf %lf", v, v+1, v+2);			AddVertex(v);		}	}}
开发者ID:Wynjones1,项目名称:game,代码行数:35,


示例6: AddVertex

void CircleEvaluator::Evaluate() {    // Add the vertexes specified    double x;    double y;    double pi = 3.14159265;    // We parametrically evaluate the circle    // x = sin(t)    // y = cos(t)    // t goes from 0 to 2pi    // 0 degrees = 0rad, 90 degrees = pi/2rad, etc.    double startRad = m_StartArcDegrees / 180 * pi;    double endRad = m_EndArcDegrees / 180 * pi;    double radPerPoint = m_DegreesPerPoint / 180 * pi;    if (startRad > endRad)        endRad += 2*pi;    double currentRad = startRad;    do {        x = m_Radius*sin(currentRad) + m_XOrigin;        y = m_Radius*cos(currentRad) + m_YOrigin;        AddVertex(x,y);        currentRad += radPerPoint;    } while (currentRad < endRad);    x = m_Radius*sin(endRad) + m_XOrigin;    y = m_Radius*cos(endRad) + m_YOrigin;    AddVertex(x, y);}
开发者ID:jpoirier,项目名称:GlassCockpit,代码行数:34,


示例7: DeleteVertices

bool CFuzzyMembershipFunction::InitTriangle (long x1, long x2, long x3){  if ((x1 < x2) && (x2 < x3))  {    CFuzzyElement FE;    DeleteVertices();    // Left vertex.    FE.SetValue(x1);    FE.SetMembership(0.0);    AddVertex(FE);    // Peak vertex.    FE.SetValue(x2);    FE.SetMembership(1.0);    AddVertex(FE);    // Right vertex.    FE.SetValue(x3);    FE.SetMembership(0.0);    AddVertex(FE);    return true;  }  return false;}
开发者ID:mvancompernolle,项目名称:ai_project,代码行数:27,


示例8: printf

/** * @function BuildManifold */void HP2D::BuildManifold( Vertex* _v0 ) {		Vertex* va;    std::vector<Vertex*> S;	std::vector<Vertex*> B;	printf("Build Manifold /n");	AddVertex( _v0 );		EnQueue( _v0 );	while( mQ.size() != 0 ) {		va = DeQueue();		S = Successors( va );		for( unsigned int i = 0; i < S.size(); ++i ) {			AddVertex( S[i] );			AddEdge( va, S[i] );			if( S[i]->GetDist() < DIST_MAX ) {						EnQueue( S[i] );			}			B = GetAdjacent2( va );			for( unsigned j = 0; j < B.size(); ++j ) {				if( CheckPosNeighbors( B[j], S[i] ) == true ) {					AddEdge( S[i], B[j] );				}			}		}			}}
开发者ID:ana-GT,项目名称:Homo2D,代码行数:32,


示例9: AddTriangle

    /** Add triangle to connectivity information */    int32 AddTriangle( const FVector &a, const FVector &b, const FVector &c )    {        // Map vertices        int32 VertexA = AddVertex( a );        int32 VertexB = AddVertex( b );        int32 VertexC = AddVertex( c );        // Make sure triangle is not degenerated        if ( VertexA!=VertexB && VertexB!=VertexC && VertexC!=VertexA )        {            // Setup connectivity info            int32 TriangleIndex = Triangles.Num();            Vertices[ VertexA ].AddTriangleLink( TriangleIndex );            Vertices[ VertexB ].AddTriangleLink( TriangleIndex );            Vertices[ VertexC ].AddTriangleLink( TriangleIndex );            // Create triangle            new ( Triangles ) FMeshConnectivityTriangle( VertexA, VertexB, VertexC );            return TriangleIndex;        }        else        {            // Degenerated triangle            return INDEX_NONE;        }    }
开发者ID:kidaa,项目名称:UnrealEngineVR,代码行数:27,


示例10: NewContour

// adds a circle the existing list; if 'hole' is true the contour is// a hole. Returns true if OK.bool VRML_LAYER::AddCircle( double x, double y, double rad, int csides, bool hole ){    int pad = NewContour();    if( pad < 0 )    {        error = "AddCircle(): failed to add a contour";        return false;    }    if( csides < 6 )        csides = CalcNSides( rad, maxdev );    // even numbers give prettier results    if( csides & 1 )        csides += 1;    double da = M_PI * 2.0 / csides;    bool fail = false;    if( hole )    {        for( double angle = 0; angle < M_PI * 2; angle += da )            fail |= !AddVertex( pad, x + rad * cos( angle ), y - rad * sin( angle ) );    }    else    {        for( double angle = 0; angle < M_PI * 2; angle += da )            fail |= !AddVertex( pad, x + rad * cos( angle ), y + rad * sin( angle ) );    }    return !fail;}
开发者ID:jerkey,项目名称:kicad,代码行数:36,


示例11: AddVertex

int AdjList::AddEdge(const Vertex& from, const Vertex& to, int cost){	if(!hasVertex(from))	{		AddVertex(from);	}		if(!hasVertex(to))	{		AddVertex(to);	}		for(auto& vinfo: m_vinfoList)	{		if(from == vinfo.m_vertex)		{			for(const auto& edge: vinfo.m_edges)			{				if(edge.m_to == to)				{					return -1; // already added				}			}			vinfo.m_edges.push_back({to, cost});			return GRAPH_OK;		}	}	return GRAPH_ERROR_VERTEX_NOT_FOUND;}
开发者ID:jnyabe,项目名称:lang,代码行数:31,


示例12: AddFacet

void Scene::Extrude (int n, float* x, float* y, float depth, 		     const Trafo& P, const ColorB* color){  int n1 = n-1, n2 = 2*n-2;       // add front and back polygonal with n vertices  // the back polygonal has reverse orientation  Facet &front = AddFacet(n),        &back  = AddFacet(n);      if (color) {    front.SetColor(*color);    back.SetColor(*color);  }  // create vertices and link them to facets  int i;  for (i = 0; i < n; i++) {     front(i) = &AddVertex( P * Vertex(x[i],y[i],0.0) );    back(i)  = &AddVertex( P * Vertex(x[n1-i],y[n1-i],-depth) );    if (color) {      front[i].SetColor(*color);      back[i].SetColor(*color);    }  }  // create n facets for the sides and link the vertices  for (i = 0; i < n; i++) {     Facet &side = AddFacet(4, front(i), back(n1-i),			   back((n2-i)%n), front((i+1)%n) );    if (color) side.SetColor(*color);  }}
开发者ID:lucafuji,项目名称:Gene-Correlation,代码行数:34,


示例13: AddVertex

void kexCpuVertList::AddLine(float x1, float y1, float z1,                          float x2, float y2, float z2,                          byte r, byte g, byte b, byte a) {        *(roverIndices++) = vertexCount; indiceCount++;    AddVertex(x1, y1, z1, 0, 0, r, g, b, a);    *(roverIndices++) = vertexCount; indiceCount++;    AddVertex(x2, y2, z2, 0, 0, r, g, b, a);}
开发者ID:svkaiser,项目名称:TurokEX,代码行数:9,


示例14: AddVertex

void CSimpleUGraph< ObjT, Compare >::AddEdge( const ObjT &oV1, const ObjT & oV2 ){  typename boost::graph_traits<Graph>::edge_descriptor e;  bool bAdded;  AddVertex( oV1 );   // should lazy these two - check to see if vertex is there first  AddVertex( oV2 );  Vertex u = oDataToVertexMap[ oV1 ];  Vertex v = oDataToVertexMap[ oV2 ];  boost::tie( e, bAdded ) = add_edge( v, u, oBoostGraph );    // add edge}
开发者ID:CMU-Suter-Group,项目名称:XDMXX,代码行数:10,


示例15: AddBaseTriangle

/// <summary>/// Helper function to create a face for the base octahedron./// </summary>/// <param name="mesh">Mesh</param>/// <param name="p1">Vertex 1.</param>/// <param name="p2">Vertex 2.</param>/// <param name="p3">Vertex 3.</param>void AddBaseTriangle(D3DVECTOR& p1, D3DVECTOR& p2, D3DVECTOR& p3){    AddVertex(p1.x, p1.y, p1.z, p1.x, p1.y, p1.z, 0, 0);    AddVertex(p2.x, p2.y, p2.z, p2.x, p2.y, p2.z, 0, 0);    AddVertex(p3.x, p3.y, p3.z, p3.x, p3.y, p3.z, 0, 0);        AddIndex(nextIndex++);    AddIndex(nextIndex++);    AddIndex(nextIndex++);}
开发者ID:AnthonyNystrom,项目名称:NuGenBioChemDX,代码行数:17,


示例16: ReadData

/* Read network from the training file */void ReadData(){  FILE *fin;  char name_v1[MAX_STRING], name_v2[MAX_STRING], str[2 * MAX_STRING + 10000];  int vid;  double weight;  fin = fopen(network_file, "rb");  if (fin == NULL)  {    printf("ERROR: network file not found!/n");    exit(1);  }  num_edges = 0;  while (fgets(str, sizeof(str), fin)) num_edges++;  fclose(fin);  printf("Number of edges: %lld          /n", num_edges);  edge_source_id = (int *)malloc(num_edges*sizeof(int));  edge_target_id = (int *)malloc(num_edges*sizeof(int));  edge_weight = (double *)malloc(num_edges*sizeof(double));  if (edge_source_id == NULL || edge_target_id == NULL || edge_weight == NULL)  {    printf("Error: memory allocation failed!/n");    exit(1);  }  fin = fopen(network_file, "rb");  num_vertices = 0;  for (int k = 0; k != num_edges; k++)  {    fscanf(fin, "%s %s %lf", name_v1, name_v2, &weight);    if (k % 10000 == 0)    {      printf("Reading edges: %.3lf%%%c", k / (double)(num_edges + 1) * 100, 13);      fflush(stdout);    }    vid = SearchHashTable(name_v1);    if (vid == -1) vid = AddVertex(name_v1);    vertex[vid].degree += weight;    edge_source_id[k] = vid;    vid = SearchHashTable(name_v2);    if (vid == -1) vid = AddVertex(name_v2);    vertex[vid].degree += weight;    edge_target_id[k] = vid;    edge_weight[k] = weight;  }  fclose(fin);  printf("Number of vertices: %d          /n", num_vertices);}
开发者ID:chentingpc,项目名称:LINE,代码行数:55,


示例17: LoadMeshInstanceIntoToy

void LoadMeshInstanceIntoToy(CConversionScene* pScene, CConversionMeshInstance* pMeshInstance, const Matrix4x4& mParentTransformations){	if (!pMeshInstance->IsVisible())		return;	CConversionMesh* pMesh = pMeshInstance->GetMesh();	for (size_t m = 0; m < pScene->GetNumMaterials(); m++)	{		for (size_t j = 0; j < pMesh->GetNumFaces(); j++)		{			size_t k;			CConversionFace* pFace = pMesh->GetFace(j);			if (pFace->m == ~0)				continue;			CConversionMaterial* pMaterial = NULL;			CConversionMaterialMap* pConversionMaterialMap = pMeshInstance->GetMappedMaterial(pFace->m);			if (!pConversionMaterialMap)				continue;			if (!pConversionMaterialMap->IsVisible())				continue;			if (pConversionMaterialMap->m_iMaterial != m)				continue;			while (g_asTextures.size() <= pConversionMaterialMap->m_iMaterial)			{				g_asTextures.push_back(pScene->GetMaterial(pConversionMaterialMap->m_iMaterial)->GetDiffuseTexture());				g_aaflData.push_back();			}			size_t iMaterial = pConversionMaterialMap->m_iMaterial;			CConversionVertex* pVertex0 = pFace->GetVertex(0);			for (k = 2; k < pFace->GetNumVertices(); k++)			{				CConversionVertex* pVertex1 = pFace->GetVertex(k-1);				CConversionVertex* pVertex2 = pFace->GetVertex(k);				AddVertex(iMaterial, mParentTransformations * pMesh->GetVertex(pVertex0->v), pMesh->GetUV(pVertex0->vu));				AddVertex(iMaterial, mParentTransformations * pMesh->GetVertex(pVertex1->v), pMesh->GetUV(pVertex1->vu));				AddVertex(iMaterial, mParentTransformations * pMesh->GetVertex(pVertex2->v), pMesh->GetUV(pVertex2->vu));			}		}	}}
开发者ID:BSVino,项目名称:CodenameInfinite,代码行数:51,


示例18: AddVertex

//-----------------------------------------------------------------------------bool SimpleMesh::AddFace(const std::vector<Vector3<float> > &verts){  unsigned int ind1, ind2, ind3;  AddVertex(verts.at(0), ind1);  AddVertex(verts.at(1), ind2);  AddVertex(verts.at(2), ind3);  Face tri(ind1, ind2, ind3);  mFaces.push_back(tri);  // Compute and assign a normal  mFaces.back().normal = FaceNormal(mFaces.size() - 1);  return true;}
开发者ID:ikee,项目名称:tnm079,代码行数:15,


示例19: sizeof

bool CFuzzyMembershipFunction::Read (std::istream& stream){  // Check the fuzzy membership function type type  EFileTypes FileType;  stream.read((char*)&FileType, sizeof(FileType));  if (FileType != fFuzzyMembershipFunction)  {    return false;  }  // Read in number of characters in the name.  unsigned short NumCharsInName;  stream.read((char*)&NumCharsInName, sizeof(NumCharsInName));  // Read in name one character at a time.  m_Name.erase();  for (unsigned short s = 0; s < NumCharsInName; s++)  {    m_Name += stream.get();  }  // Read in Tnorm.  stream.read((char*)&m_Tnorm,sizeof(m_Tnorm));  // Read in Tconorm.  stream.read((char*)&m_Tconorm,sizeof(m_Tconorm));  // Read in number of CFuzzyElements in the membership function.  long NumVertices;  stream.read((char*)&NumVertices, sizeof(NumVertices));  // Read in each CFuzzyElement.  CFuzzyElement FE;  for (long v = 0; v < NumVertices; v++)  {    // Read in value.     long Value;    stream.read((char*)&Value, sizeof(Value));    FE.SetValue(Value);    // Read in membership.    double Membership;    stream.read((char*)&Membership, sizeof(Membership));    FE.SetMembership(Membership);    // Read in Tnorm.     ETnormOperations Tnorm;    stream.read((char*)&Tnorm,sizeof(Tnorm));    FE.SetTnorm(Tnorm);    // Read in Tconorm.    ETconormOperations Tconorm;    stream.read((char*)&Tconorm,sizeof(Tconorm));    FE.SetTconorm(Tconorm);    AddVertex(FE);  }  return true;}
开发者ID:mvancompernolle,项目名称:ai_project,代码行数:60,


示例20: LoadSU2Vertices

int LoadSU2Vertices(FILE *FilHdl, Mesh *Msh){	int iVer, d, ref;	double crd[3], bufDbl;	char str[1024];		rewind(FilHdl);		Msh->NbrVer = GetSU2KeywordValue (FilHdl, "NPOIN=");		if ( Msh->NbrVer > Msh->MaxNbrVer ) {		printf("  ## ERROR: LoadSU2Vertices: INCONSISTENT NUMBER OF VERTICES./n");		return 0;	}	  for (iVer=1; iVer<=Msh->NbrVer; iVer++) {		    crd[2] = 0;		    for (d=0; d<Msh->Dim; d++) {      fscanf(FilHdl, "%lf", &bufDbl);      crd[d] = bufDbl;    }        fscanf(FilHdl, "%d", &ref);    fgets (str, sizeof str, FilHdl);    		AddVertex(Msh, iVer, crd);  }		return 1;}
开发者ID:rfenrich,项目名称:MULTIF,代码行数:32,


示例21: ProgressiveMesh

void ProgressiveMesh(std::vector<float3> &vert, std::vector<tridata> &tri,                     std::vector<int> &map, std::vector<int> &permutation){	AddVertex(vert);  // put input data into our data structures	AddFaces(tri);	ComputeAllEdgeCollapseCosts(); // cache all edge collapse costs	permutation.resize(vertices.size());  // allocate space	map.resize(vertices.size());          // allocate space	// reduce the object down to nothing:	while (vertices.size() > 0) {		// get the next vertex to collapse		Vertex *mn = MinimumCostEdge();		// keep track of this vertex, i.e. the collapse ordering		permutation[mn->id] = vertices.size() - 1;		// keep track of vertex to which we collapse to		map[vertices.size() - 1] = (mn->collapse) ? mn->collapse->id : -1;		// Collapse this edge		Collapse(mn,mn->collapse);	}	// reorder the map Array based on the collapse ordering	for (unsigned int i = 0; i<map.size(); i++) {		map[i] = (map[i]==-1)?0:permutation[map[i]];	}	// The caller of this function should reorder their vertices	// according to the returned "permutation".}
开发者ID:340211173,项目名称:sandbox-1,代码行数:26,


示例22: GetNextVertexIndex

void Model::AddCylinder(float radius, float height){	const double M_PI = 3.14159265358979;	int round = 6;	uint16_t startIndex = GetNextVertexIndex();	for(int i = 0; i <= round; i++)	{		double sangle = i * M_PI * 2. / round;		for (int t = -1; t <= 1; t += 2)		{			Vector3f v = Vector3f(cos(sangle) * radius, sin(sangle) * radius, t * height);			AddVertex(Vertex(v, Color(127, 0, 127, 255), float(i), float(t), Vector3f(cos(sangle), sin(sangle), 0)));		}	}	// Renumber indices	for (uint16_t s = 0; s < round; s++)	{		uint16_t s1 = s + 1;		auto get = [&](uint16_t s, uint16_t t){			return s * 2 + t + startIndex;		};		AddTriangle(get(s, 0),			get(s, 1),			get(s1, 0));		AddTriangle(get(s1, 0),			get(s, 1),			get(s1, 1));	}}
开发者ID:msakuta,项目名称:OculusCrystal,代码行数:32,


示例23: main

int main(){	scanf("%d", &ivc);	for (int i = 0; i < ivc; i++)	{		int x, y;		scanf("%d%d", &x, &y);		AddVertex(x, y);	}	scanf("%d", &iec);	for (int i = 0; i < iec; i++)	{		int u, v;		scanf("%d%d", &u, &v);		AddEdge(u, v);		AddEdge(v, u);	}	scanf("%d%d", &s, &t);	Bellman_Ford();	printf("%.2lf", V[t].shortest);	return 0;}
开发者ID:Dev-XYS,项目名称:Algorithms,代码行数:33,



注:本文中的AddVertex函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ AddWaypoint函数代码示例
C++ AddVectoredExceptionHandler函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。