图形处理(二)固定边界参数化

固定边界参数化方法是参数化方法中的一类经典算法,至今还有很广泛的用途。这类算法可以说是我读研阶段写的第一个算法。当年年少无知,连外文文献怎么阅读都不懂,导师发给了我好几篇paper,没有一篇看得懂,就连三角网格模型的拓扑邻接关系都不懂。参数化国内相关的硕士、博士论文非常多,所以我就从国内文献开始看起,看了20篇paper才完全知道代码要怎么写,要怎么把文献转换成代码,看了将近一个月的文献,又花了一周的时间把代码实现出来。

现在回想起来,其实这个算法只要一天的时间就可以搞定,因为算法就只只需要求解一个方程组AX=b,因此我们只需要把A、b的计算方法,写出来,然后求解方程组,就可以求出每个顶点的参数化坐标。

1、边界点的参数化。边界的参数化形状常用的有两种,当然其实任意凸多边形都是可以的。

(1)参数化到正方形上:对边界点按逆时针方向弦长参数化到正方形上,参数化后的坐标作为求解内点坐标的已知条件。
(2)参数化到圆周上:对边界点按同样的步骤,参数化到圆周上。


固定边界的参数化方法,根据权值的不同又有好个不同的方法,但是万变不离其中,只是更改一下权值而已。

2、内点的参数化(非边界点)。

内点坐标的计算是根据如下计算公式:


(1)均匀参数化所采用的权值:


均匀参数化是最早的固定边界参数化算法了。均匀参数化的基本思想是把网格的边界点映射到一个平面上的凸多边形,而内点坐标为其一环邻近点的凸组合,其权值取以它为中心点的一环的平均值。



(2)保形参数化。保形参数化是在Tutte的基础上根据凸组合的思想提出的一种方法。此方法保持了每个径向弧长不变,要求所有的三角片都是非退化的。在满足以下两个式子的前提下,其各邻接顶点的权值计算公式如下:





从上面三个公式,其实说白了就是保证边长长度不变,同时角度比例不变的性质

(3)中值坐标参数化。其权值λ的计算公式为:


(4)调和映射。其权值计算公式如下:


2、算法代码实现

这个代码是我写的第一个网格曲面的代码,已经是3年前的事,所以代码非常粗糙,一大堆bug,所以将就着看看实现:

#include "Parameterization.h"
#include <algorithm>
#include <assert.h>
#include <math.h>






CParameterization::CParameterization(int m_SelectType,bool ParameterRegionType,TriMesh *tmesh)
{
	m_ParameterType=m_SelectType;//参数化类型
	m_mesh=tmesh;
	seedInnerv=-1;
	m_SumBorderLength=0.0;
	m_ParameterRegionType=ParameterRegionType;
	m_ParameterResult.resize(tmesh->vertices.size());
}

CParameterization::~CParameterization(void)
{



}
//提取框选中三角面片的边界顶点、内点索引,并存于m_BorderVertex、m_InnerVertex中
void CParameterization::FindBorderInnerVertex()
{   
	int i,j,k;
	m_mesh->need_adjacentfaces();
	m_mesh->need_neighbors();
	int n=m_mesh->faces.size();
	//调试专用
		/*m_mesh->faces[229].beSelect=true;
		m_mesh->faces[248].beSelect=true;
		m_mesh->faces[249].beSelect=true;
		m_mesh->faces[262].beSelect=true;
		m_mesh->faces[263].beSelect=true;
		m_mesh->faces[283].beSelect=true;*/

	/*m_mesh->faces[229].beSelect=true;
		m_mesh->faces[248].beSelect=true;
		m_mesh->faces[249].beSelect=true;
		m_mesh->faces[262].beSelect=true;
		m_mesh->faces[263].beSelect=true;
		m_mesh->faces[268].beSelect=true;
		m_mesh->faces[269].beSelect=true;
		m_mesh->faces[282].beSelect=true;
		m_mesh->faces[283].beSelect=true;
		m_mesh->faces[303].beSelect=true;*/

		
   


	//寻找到一个内点,作为种子点
	for (i=0;i<n;i++)
	if (m_mesh->faces[i].beSelect)
	{   
		for (j=0;j<3;j++)
		{
			const vector<int>&a=m_mesh->adjacentfaces[m_mesh->faces[i][j]];
			for(k=0;k<a.size();k++) if (m_mesh->faces[a[k]].beSelect==false)  break;
	
			if(k==a.size()) {seedInnerv=m_mesh->faces[i][j];break;}

		}
		if (seedInnerv!=-1)break;//内点种子点找到
	}


     if(i==n)  {AfxMessageBox("未选中任何区域");return;}			

	  m_InteriorVertex.push_back(seedInnerv);
	  vector<int> nearby;
	  vector<bool> beSearch(m_mesh->vertices.size(),false);
	  beSearch[seedInnerv]=TRUE;
	  // add all the neighbors of the starting vertex into nearby
	  for(j=0;j< m_mesh->neighbors[seedInnerv].size();j++)
	  {
		  int nid=m_mesh->neighbors[seedInnerv][j];
		  nearby.push_back(nid);
	  }
	  //广度优先遍历
	  while(nearby.size()>0)
	  {
		
		  int iNearby,iNeighbor;
		  for(i=0; i<nearby.size(); i++)
		  {   
			  iNearby = nearby[i];
			 if(beSearch[iNearby])
			 {
				 vector<int>::iterator iter;
			     iter=find(nearby.begin(),nearby.end(),iNearby);
			     nearby.erase(iter);
			     continue;
			 }
         vector<int> CountAdjacentSelFaces;
		  for(j=0;j<m_mesh->adjacentfaces[iNearby].size();j++)
		  {   
                if(m_mesh->faces[m_mesh->adjacentfaces[iNearby][j]].beSelect==TRUE) 
					CountAdjacentSelFaces.push_back(m_mesh->adjacentfaces[iNearby][j]); 
			/*  if(m_mesh->faces[m_mesh->adjacentfaces[iNearby][j]].beSelect==false)  
				  {
					  m_BorderVertex.push_back(iNearby);
					  break;
				  }//边界点
			  else if (m_mesh->is_bdy(iNearby))
			  {   
				  m_BorderVertex.push_back(iNearby);
				  break;
			  }*/
		  }
		 if(CountAdjacentSelFaces.size()==1)
		 {
           m_mesh->faces[CountAdjacentSelFaces[0]].beSelect=false;
		 }
         else if(CountAdjacentSelFaces.size()<m_mesh->adjacentfaces[iNearby].size())
		 {
			m_BorderVertex.push_back(iNearby); 
		 }
		 else if(CountAdjacentSelFaces.size()==m_mesh->adjacentfaces[iNearby].size()) 
		{   
		      if(m_mesh->is_bdy(iNearby))
		      {   
			    m_BorderVertex.push_back(iNearby); 
		       }
			  else m_InteriorVertex.push_back(iNearby);	
		  }//内点
		  beSearch[iNearby]=TRUE;
		  vector<int>::iterator iter;
		  iter=find(nearby.begin(),nearby.end(),iNearby);
		  nearby.erase(iter);
		 for(k=0;k<m_mesh->neighbors[iNearby].size();k++)
			 {   
				int h1,h2;
				h2=0;
			    iNeighbor = m_mesh->neighbors[iNearby][k];
			   if(beSearch[iNeighbor]) continue;
			 for (h1=0;h1<m_mesh->adjacentfaces[iNeighbor].size();h1++)
			  {
				 if(m_mesh->faces[m_mesh->adjacentfaces[iNeighbor][h1]].beSelect==false)   
			    h2++;
			  }
			 if (h2<m_mesh->adjacentfaces[iNeighbor].size())nearby.push_back(iNeighbor);
			 }
		  }//for
	  }//while
	//边界点排序

 vector<int>BorderVertex;
  vector<int>::iterator iter;
   vector<int>::iterator iter0;
  int fid;
  if (m_BorderVertex.size()<3) AfxMessageBox("边界点出错");
  BorderVertex.push_back(m_BorderVertex[0]);
  iter=find(m_BorderVertex.begin(),m_BorderVertex.end(),m_BorderVertex[0]);
  m_BorderVertex.erase(iter);
	while(m_BorderVertex.size()>0)
	  { 
       
		for (j=0;j<m_mesh->neighbors[BorderVertex[BorderVertex.size()-1]].size();j++)
		{ 
		  fid=m_mesh->neighbors[BorderVertex[BorderVertex.size()-1]][j];
          iter=find(m_BorderVertex.begin(),m_BorderVertex.end(),fid);
		  if (iter!=m_BorderVertex.end()) break;
		
		}
		if (j==m_mesh->neighbors[BorderVertex[BorderVertex.size()-1]].size())  
		{   
			int SpecialVertex=BorderVertex[BorderVertex.size()-1];
			for(int k=0;k<m_mesh->adjacentfaces[SpecialVertex].size();k++)
			{
				m_mesh->faces[m_mesh->adjacentfaces[SpecialVertex][k]].beSelect=false;
			}
            BorderVertex.pop_back();
			//AfxMessageBox("参数化失败");
			continue;
		}
		BorderVertex.push_back(m_mesh->neighbors[BorderVertex[BorderVertex.size()-1]][j]);
		m_BorderVertex.erase(iter);
	  }

   m_BorderVertex=BorderVertex;


}
//边界顶点参数化
void CParameterization::ParameterBorderVertex()
{


//计算边界总长度
  if (m_BorderVertex.size()<3)
  {
    return;
  }
  vec v1v2;
  vector<float> VertexU(m_BorderVertex.size(),0.0);//边界顶点的弧长参数化坐标
  VertexU[0]=0.0;
  for(int i=1;i<m_BorderVertex.size();i++)
  {
  v1v2=m_mesh->vertices[m_BorderVertex[i]]-m_mesh->vertices[m_BorderVertex[i-1]];
  m_SumBorderLength+=len(v1v2);
  VertexU[i]=m_SumBorderLength;
  }
  v1v2=m_mesh->vertices[m_BorderVertex[m_BorderVertex.size()-1]]-m_mesh->vertices[m_BorderVertex[0]];
  m_SumBorderLength+=len(v1v2);

  for (int i=0;i<VertexU.size();i++)
  {   
	  VertexU[i]=VertexU[i]/m_SumBorderLength;
  }
  
 //分为正方形和圆形参数域

//暂时未写圆形参数化

 //正方形参数化
	 float unionscal=0.25;
	  for (int i=0;i<VertexU.size();i++)
	  {
		  if(unionscal>VertexU[i])m_ParameterResult[m_BorderVertex[i]]=vec2(VertexU[i]*4.0,0.0);
		  else if(unionscal*2.0>VertexU[i])m_ParameterResult[m_BorderVertex[i]]=vec2(1.0,(VertexU[i]-unionscal)*4.0);
		  else if(unionscal*3.0>VertexU[i])m_ParameterResult[m_BorderVertex[i]]=vec2((unionscal*3.0-VertexU[i])*4.0,1.0);
		else if(unionscal*4.0>VertexU[i])m_ParameterResult[m_BorderVertex[i]]=vec2(0.0,(1.0-VertexU[i])*4.0);
	  } 
}
void CParameterization::ParameterInnerVertex()
{  
    if (m_BorderVertex.size()<3)
  {
    return;
  }
   int n=m_InteriorVertex.size()+m_BorderVertex.size();
   FyMatrix CoefficientMatrix(n,n),b(n,2),pt(n,2);//系数矩阵
   CoefficientMatrix.EqualEye();//方程组系数矩阵单位化
   b.AllZero();//系数矩阵
   for (int i=m_InteriorVertex.size();i<n;i++)
    for (int j=0;j<2;j++)
    b(i,j)=m_ParameterResult[m_BorderVertex[i-m_InteriorVertex.size()]][j];
	  
   
   float Coefficient;//参数化类型的系数 均匀参数化为度的倒数
   int ineighbors;
   for (int i=0;i<m_InteriorVertex.size();i++)
   {  
	  
       int  NeighborNumber=m_mesh->neighbors[m_InteriorVertex[i]].size();
	   vector<float>NeighborCoefficient;
	   if(m_ParameterType==0) NeighborCoefficient=ShapePreserveParameterization(m_InteriorVertex[i]);
	   else if((m_ParameterType==2)||(m_ParameterType==3)) NeighborCoefficient=MeanValueHarmonyParameterization(m_InteriorVertex[i]);

	  for (int j=0;j<NeighborNumber;j++)
	   {   
		   
		   if (m_ParameterType==1) 
			   Coefficient=1.0/NeighborNumber;//均匀参数
		   else if (m_ParameterType==0)//
		   {
            Coefficient=NeighborCoefficient[j];
		   }//保形 else if

		   else if ((m_ParameterType==2)||(m_ParameterType==3))
		   {   
		   Coefficient=NeighborCoefficient[j];
		   }//中值 else if

          ineighbors=m_mesh->neighbors[m_InteriorVertex[i]][j];
		  int Index=0;
		  vector<int>::iterator iter;
		  iter=find(m_InteriorVertex.begin(),m_InteriorVertex.end(),ineighbors);
		  if(iter!=m_InteriorVertex.end())  Index=distance(m_InteriorVertex.begin(),iter);
		  else
		  {
			 iter=find(m_BorderVertex.begin(),m_BorderVertex.end(),ineighbors);
			 if (iter!=m_BorderVertex.end()) Index=m_InteriorVertex.size()+distance(m_BorderVertex.begin(),iter);
			 else {AfxMessageBox("参数化失败1");/*assert(0)*/;/* return;*/}
		
		  }
		  CoefficientMatrix(i,Index)=-Coefficient;


	   }//for
	
   }//for



   CoefficientMatrix=CoefficientMatrix.Inverse();
   pt=CoefficientMatrix*b;
   for (int i=0;i<m_InteriorVertex.size();i++)
    for (int j=0;j<2;j++)
     {
	   m_ParameterResult[m_InteriorVertex[i]][j]=pt(i,j);
     }
 
	for (int i=0;i<m_BorderVertex.size();i++)
	if( (m_ParameterResult[m_BorderVertex[i]][0]!=pt(i+m_InteriorVertex.size(),0))||(m_ParameterResult[m_BorderVertex[i]][1]!=pt(i+m_InteriorVertex.size(),1))  )
	{
		AfxMessageBox("参数化失败2");
	}
 
}
//均匀参数化
float CParameterization::UniformParameterization()
{

return 0.3;
}
//保形参数化  参数p是三维模型的顶点索引
vector<float> CParameterization::ShapePreserveParameterization(int p)
{
    int PNeighborNumber=m_mesh->neighbors[p].size();
	//P的邻接顶点排序
	vector<int> PNeighbor=m_mesh->neighbors[p];
	vector<int> SortNeighbor;
	SortNeighbor.push_back(PNeighbor[0]);
	vector<int>::iterator iter;
    iter=find(PNeighbor.begin(),PNeighbor.end(),PNeighbor[0]);
	PNeighbor.erase(iter);
	int fid;
  while(PNeighbor.size()>0)
  {
	
	int i;
		for (i=0;i<m_mesh->neighbors[SortNeighbor[SortNeighbor.size()-1]].size();i++)
		{ 
			fid=m_mesh->neighbors[SortNeighbor[SortNeighbor.size()-1]][i];
			iter=find(PNeighbor.begin(),PNeighbor.end(),fid);
			if (iter!=PNeighbor.end()) break;
		}
		if (i==m_mesh->neighbors[SortNeighbor[SortNeighbor.size()-1]].size())  AfxMessageBox("参数化失败3");
		SortNeighbor.push_back(fid);
		PNeighbor.erase(iter);
  }
	
	/*for (int k=0;k<m_mesh->adjacentfaces[p].size();k++)
	{  
		int q=m_mesh->neighbors[p][k];
		TriMesh::Face AdjacentFaces;
		AdjacentFaces=m_mesh->faces[m_mesh->adjacentfaces[p][k]];

		vector<int>v1v2v3;
		for (int a=0;a<3;a++)v1v2v3.push_back(AdjacentFaces[a]);

		vector<int>::iterator v;
		v=find(v1v2v3.begin(),v1v2v3.end(),p);
		v1v2v3.erase(v);//剩余的两个顶点组成一条边 

		for (int a=0;a<NeighborNumber;a++)
		{
			if ((v1v2v3[0]==m_mesh->neighbors[p][a])||(v1v2v3[1]==m_mesh->neighbors[p][a])) continue;

		}
	}//for*/
//把p点的邻接顶点展平到二维平面,P点为坐标原点
	//计算每个点的角度
	vector<float> Angle2D(PNeighborNumber,0.0);//极角
	Angle2D[0]=0.0;
	float SumAngle=0.0;

	for (int i=1;i<SortNeighbor.size();i++)
	{
      point pa=m_mesh->vertices[SortNeighbor[i-1]]-m_mesh->vertices[p];
	  point pb=m_mesh->vertices[SortNeighbor[i]]-m_mesh->vertices[p];
	  float angle=(pa DOT pb)/(len(pa)*len(pb));
	   SumAngle+=acos(angle);
	   Angle2D[i]=SumAngle;
	}
	point pa=m_mesh->vertices[SortNeighbor[PNeighborNumber-1]]-m_mesh->vertices[p];
	point pb=m_mesh->vertices[SortNeighbor[0]]-m_mesh->vertices[p];
	float angle=(pa DOT pb)/(len(pa)*len(pb));
	SumAngle+=acos(angle); 
	for (int i=0;i<PNeighborNumber;i++)
	{
		Angle2D[i]=Angle2D[i]*2.0*3.1415926/SumAngle;
	}
	//计算极坐标的径向长度
	vector<float> Radius(PNeighborNumber,0.0);
	for(int i=0;i<PNeighborNumber;i++)
	{
	  point pq=m_mesh->vertices[SortNeighbor[i]]-m_mesh->vertices[p];
	  Radius[i]=len(pq);
	}
 
    //计算二维坐标
	vector<vec3> P2Dcoordinate(PNeighborNumber);
	vec3  pSeed(0.0,0.0,0.0);
    for(int i=0;i<PNeighborNumber;i++)
	{
		P2Dcoordinate[i][0]=10*Radius[i]*cos(Angle2D[i]);
		P2Dcoordinate[i][1]=10*Radius[i]*sin(Angle2D[i]);
		P2Dcoordinate[i][2]=0.0;
	}
	//计算个点邻接顶点的权值
	int p1,p2,p3;
	vec3 pp1,pp2,pp3;

	vector<vector<float>>Weight;
	Weight.resize(PNeighborNumber);
	for (int i=0;i<PNeighborNumber;i++)
	{
		Weight[i].reserve(PNeighborNumber+2);
	}
	for (int i=0;i<PNeighborNumber;i++)
	{   
		p3=i;
		pp3=P2Dcoordinate[i]-pSeed;
		float Inaccuracy=10000.0;
		int accuratep1,accuratep2;
		float u=0.0;
		float v=0.0;
		float w=0.0;
		for (int j=0;j<PNeighborNumber;j++)
		{   
			
			if (j<PNeighborNumber-1)
			{   
				p1=j ; 
				pp1=P2Dcoordinate[j]-pSeed;
				p2=j+1;
				pp2=P2Dcoordinate[j+1]-pSeed;
			}
			else 
			{   
				p1=j;
				pp1=P2Dcoordinate[j]-pSeed;
				p2=0;
				pp2=P2Dcoordinate[0]-pSeed;
			}
			if ((p1!=p3)&&(p2!=p3)) 
			{
				
				//判断P点是否在三角形p1p2p3内部
				vec3  p1p2=P2Dcoordinate[p2]-P2Dcoordinate[p1];
				vec3  p1p3=P2Dcoordinate[p3]-P2Dcoordinate[p1];
				float AreaP1PP2=0.5*len(pp1 CROSS pp2);
				float AreaP2PP3=0.5*len(pp2 CROSS pp3);
				float AreaP3PP1=0.5*len(pp3 CROSS pp1);
				float AreaP1P2P3=0.5*len(p1p2 CROSS p1p3);
				float AreaSum=AreaP1PP2+AreaP2PP3+AreaP3PP1;
                
				if(Inaccuracy>(AreaSum-AreaP1P2P3))
				{   
					Inaccuracy=AreaSum-AreaP1P2P3;
					accuratep1=p1;
					accuratep2=p2;
					u=AreaP2PP3/AreaSum;
					v=AreaP3PP1/AreaSum;
					w=AreaP1PP2/AreaSum;
				}
			}//if
		}//for
		Weight[accuratep1].push_back(u);
		Weight[accuratep2].push_back(v);
		Weight[p3].push_back(w);
	}//for
	//计算各顶点的平均权值,但此权值是根据排序后顶点的顺序排序的
	vector<float> AverageWeight0(PNeighborNumber,0.0);
	for (int i=0;i<PNeighborNumber;i++)
	{
      for (int j=0;j<Weight[i].size();j++)
      {
		  AverageWeight0[i]+=Weight[i][j];
      }
	  AverageWeight0[i]=AverageWeight0[i]/PNeighborNumber;
	}
	//回归未排序的权值  即最终的权值
	vector<float> AverageWeight(PNeighborNumber,0.0);
	PNeighbor=m_mesh->neighbors[p];
    for (int i=0;i<PNeighborNumber;i++)
    {
      iter=find(PNeighbor.begin(),PNeighbor.end(),SortNeighbor[i]);
	  if (iter==PNeighbor.end()) AfxMessageBox("参数化失败4");//Index=distance(m_InteriorVertex.begin(),iter);
	  int dis=distance(PNeighbor.begin(),iter);
	  AverageWeight[dis]=AverageWeight0[i];
    }
	
    	
return AverageWeight;
}


//中值坐标参数化
vector<float> CParameterization::MeanValueHarmonyParameterization(int p)
{   
	int NeighborNumber=m_mesh->neighbors[p].size();
	vector<float>w(NeighborNumber,0.0);//存储最后的系数
	for (int k=0;k<NeighborNumber;k++)
	{
		int q=m_mesh->neighbors[p][k];
		vector<TriMesh::Face> CommonFaces;
		for(int a=0;a<m_mesh->adjacentfaces[p].size();a++)
		{   //寻找边ij的两个三角面片

			vector<int> &JAdjacentfaces=m_mesh->adjacentfaces[q];
			vector<int>::iterator CommonFaceIter;
			CommonFaceIter=find(JAdjacentfaces.begin(),JAdjacentfaces.end(),m_mesh->adjacentfaces[p][a]);
			if (CommonFaceIter!=JAdjacentfaces.end()) CommonFaces.push_back(m_mesh->faces[m_mesh->adjacentfaces[p][a]]);   
		}
		if(CommonFaces.size()!=2) AfxMessageBox("参数化失败5");//每条边必有两个三角面片
		//寻找ij边的两个对顶点

		for (int a=0;a<2;a++)
		{  
			vector<int> v1v2v3;
			for(int b=0;b<3;b++) v1v2v3.push_back(CommonFaces[a][b]);
			vector<int>::iterator v;
			v=find(v1v2v3.begin(),v1v2v3.end(),p);
			v1v2v3.erase(v);
			v=find(v1v2v3.begin(),v1v2v3.end(),q);
			v1v2v3.erase(v);
			if (v1v2v3.size()!=1)
			{
				AfxMessageBox("参数化失败6");
			}
			vec pa=m_mesh->vertices[p]-m_mesh->vertices[v1v2v3[0]];
			vec pq=m_mesh->vertices[p]-m_mesh->vertices[q];
			vec qa=m_mesh->vertices[p]-m_mesh->vertices[v1v2v3[0]];
			//中值坐标参数化
			if (m_ParameterType==3)
			{
				double angle=pa DOT pq;
				angle=angle/(len(pa)*len(pq));
				angle=tan(acos(angle)/2.0)/len(pq);
				w[k]+=angle;
			}
			//调和映射
			else if (m_ParameterType==2)
			{   
				w[k]+=(len2(pa)+len2(qa)-len2(pq))*2.0/len(pa CROSS pq);
			}
			
		}
	}//k for
	float sumw=0.0;
	for (int k=0;k<w.size();k++)sumw+=w[k];
	for (int i=0;i<NeighborNumber;i++)
	{
		w[i]=w[i]/sumw;
	}

return  w;
}

//判断参数化类型,并调用相应的参数化函数
vector<vec2> CParameterization::ComputeParameterResult()
{   
	FindBorderInnerVertex();
	ParameterBorderVertex();
	ParameterInnerVertex();
	return m_ParameterResult;
}

往事不堪回首,当时菜鸟一枚,现在看到那样的代码,真的是很惭愧啊。

本文地址:http://blog.csdn.net/hjimce/article/details/46415051     作者:hjimce     联系qq:1393852684   更多资源请关注我的博客:http://blog.csdn.net/hjimce                原创文章,版权所有,转载请保留本行信息。

参考文献:

1、Floater M S. Parameterization and smooth approximation of surface triang-ulations.Computer Aided Geometric Design, 1997,14(3): 231250.
2、 M.Floater and K.Hormann "Surface parameterization: A tutorial and surve- y," in Advances in Multiresolution for Georrzetric Modelling, pp. 157-186 2005.


  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
序号 CAD命令 简写 用途 1 3D   创建三维实体 2 3DARRAY 3A 三维阵列 3 3DCLIP   设置剪切平面位置 4 3DCORBLT   继续执行3DORBIT命令 5 3DDISTANCE   距离调整 6 3DFACE 3F 绘制三维曲面 7 3DMESH   绘制三维自由多边形网格 8 3DORBLT 3DO 三维动态旋转 9 3DPAN   三维视图平移 10 3DPLOY 3P 绘制三维多段线 11 3DSIN   插入一个3DS文件 12 3DSOUT   输出图形数据到一个3DS文件 13 3DSWIVEL   旋转相机 14 3DZOOM   三维视窗下视窗缩放 15 ABOUT   显示AutoCAD的版本信息 16 ACISIN   插入一个ACIS文件 17 ACISOUT   将AutoCAD三维实体目标输出到ACIS文件 18 ADCCLOSE   关闭AutoCAD设计中心 19 ADCENTER ADC 启动AutoCAD设计中心 20 ADCNAVIGATE ADC 启动设计中心并访问用户设置的文件名、路径或网上目录 21 ALIGN AL 图形对齐 22 AMECONVERT   将AME实体转换成AutoCAD实体 23 APERTURE   控制目标捕捉框的大小 24 APPLOAD AP 装载AutoLISP、ADS或ARX程序 25 ARC A 绘制圆弧 26 AREA AA 计算所选择区域的周长和面积 27 ARRAY AR 图形阵列 28 ARX   加载、卸载Object ARX程序 29 ATTDEF ATT、DDATTDEF 创建属性定义 30 ATTDISP   控制属性的可见性 31 ATTEDIT ATE 编辑图块属性值 32 ATTEXT DDATTEXT 摘录属性定义数据 33 ATTREDEF   重定义一个图块及其属性 34 AUDIT   检查并修复图形文件的错误 35 BACKGROUND   设置渲染背景 36 BASE   设置当前图形文件的插入点 37 BHATCH BH或H 区域图样填充 38 BLIPMODE   点记模式控制 39 BLOCK B或–B 将所选的实体图形定义为一个图块 40 BLOCKICON   为R14或更早版本所创建的图块生成预览图像 41 BMPOUT   将所选实体以BMP文件格式输出 42 BOUNDARY BO或–BO 创建区域 43 BOX   绘制三维长方体实体 44 BRDAK BR 折断图形 45 BROWSER   网络游览 46 CAL   AutoCAD计算功能 47 CAMERA   相机操作 48 CHAMFER CHA 倒直角 49 CHANGE –CH 属性修改 50 CH PROP   修改基本属性 51 CIRCLE C 绘制圆 52 CLOSE   关闭当前图形文件 53 COLOR COL 设置实体颜色 54 COMPILE   编译(Shape)文件和PostScript文件 55 CONE   绘制三维圆锥实体 56 CONVERT   将R14或更低版本所作的维多段线(或关联性区域图样填充)转换成AutoCAD2000格式 57 COPY CO或CP 复制实体 58 COPYBASE   固定基点以复制实体 59 COPYCLIP   复制实体到WINDOWS剪贴板 60 COPYHIST   复制命令窗口历史信息到WINDOWS剪贴板 61 COPYLINK   复制当前视窗至WINDOWS剪贴板 62 CUTCLIP   剪切实体至WINDOWS剪贴板 63 CYLINDER   绘制一个三维圆柱实体 64 DBCCLOSE   关闭数据库连接管理 65 DBCONNECT DBC 启动数据库连接管理 66 DBLIST   列表显示当前图形文件中每个实体的信息 67 DDEDIT ED 以对话框方式编辑文本或属性定义 68 DDPTYPE   设置点的形状及大小 69 DDVPOINT VP 通过对话框选择三维视点 70 DELAY   设置演示(Script)延时时间 71 DIM AND DIM1   进入尺寸标注状态 72 DIMALIGNED DAL或DIMALI 标注平齐尺寸 73 DIMANGULAR DAN或DIMANG 标注角度 74 DIMBASELINE DBA或DIMBASE 基线标注 75 DIMCENTER DCE 标注圆心 76 DIMCONTINUE DCO或DIMCONT 连续标注 77 DIMDIAMETER DDI或DIMDLA 标注直径 78 DIMEDIT DED或DIMED 编辑尺寸标注 79 DIMLINEAR DLI或DIMLIN 标注长度尺寸 80 DIMORDINATE DOR或DIMROD 标注坐标值 81 DIMOVERRIDE DOR或DIMOVER 临时覆盖系统尺寸变量设置 82 DIMRADIUS DRA或DIMRAD 标注半径 83 DIMSTYLE DST或DIMSTY 创建或修改标注样式 84 DIMTEDIT DIMTED 编辑尺寸文本 85 DIST DI 测量两点之间的距离 86 DIVIDE DIV 等分实体 87 DONUT DO 绘制圆环 88 DRAGMODE   控制是否显示拖动对象的过程 89 DRAWORDER DR 控制两重叠(或有部分重叠)图象的显示次序 90 DSETTINGS DS、SE 设置栅格和捕捉、角度和目标捕捉点 自动 跟踪以及自动目标捕捉选项功能 91 DSVIEWER AV 鹰眼功能 92 DVIEW DV 视点动态设置 93 DWGPROPS   设置和显示当前图形文件的属性 94 DXBIN   将DXB文件插入到当前文件中 95 EDGE   控制三维曲面边的可见性 96 EDGESURF   绘制四边定界曲面 97 ELEV   设置绘图平面的高度 98 ELLIPSE EL 绘制椭圆或椭圆弧 99 ERASE E 删除实体 100 EXPLODE X 分解实体 101 EXPORT EXP 文件格式输出 102 EXPRESSTOOLS   如果当前AutoCAD环境中无[快捷工具]这一工具,可 启动该命令以安装AutoCAD快捷工具 103 EXTEND EX 延长实体 104 EXETRUDE EXT 将维图形拉伸成三维实体 105 FILL F 控制实体的填充状态 106 FILLET   倒圆角 107 FILTER FI 过滤选择实体 108 FIND   查找与替换文件 109 FOG   三维渲染的雾度配置 110 GRAPHSCR   在图形窗口和文本窗口间切换 111 GRID   显示栅格 112 GROUP G或-G 创建一个指定各称的目标选择组 113 HATCH –H 通过命令行进行区域填充图样 114 HATCHEDIT HE 编辑区域填充图样 115 HELP   显示AutoCAD在线帮助信息 116 HIDE   消隐 117 HYPERLINK   插入超级链接 118 HYPERLINKOPTION HI 控制是否显示超级链接标签 119 ID   显示点的坐标 120 IMAGE I 将图像文件插入到当前图形文件中 121 IMAGEADJUST LAD 调整所选图像的明亮度、对比度和灰度 122 IMAGEATTACH LAT 附贴一个图像至当前图形文件 123 IMAGECLIP ICL 调整所选图像的边框大小 124 IMAGFRAME   控制是否显示图像的边框 125 IMAGEQUALITY   控制图像的显示质量 126 IMPORT TMP 插入其他格式文件 127 INSERT I 把图块(或文件)插入到当前图形文件 128 INSERTOBJ IO 插入OLE对象 129 INTERFERE INF 将两个或两个以上的三维实体的相交部分创 建为一个单独的实体 130 INTERSECT IN 对三维实体求交 131 ISOPLANE   定义基准面 132 LAYER LA或–LA 图层控制 133 LAYOUT LO 创建新布局或对已存在的布局进行更名、复制、保存 或删除等操作 133 JOIN J 合并 134 LAYOUTWIZARD   布局向导 135 LEADER LE或LEAD 指引标注 136 LENGTHEN LEN 改变实体长度 137 LIGHT   光源设置 138 LIMTS   设置图形界限 139 LINS L 绘制直线 140 LINETYPE LT或–LTLTYPE 创建、装载或设置线型 141 LIST LS 列表显示实体信息 142 LOAD   装入已编译过的形文件 143 LOGFILEOFF   关闭登录文件 144 LOGFILEON   将文本窗口的内容写到一个记录文件中 145 LSEDIT   场景编辑 146 LSLIB   场景库管理 147 LSNEW   添加场景 148 LTSCALE LTS 设置线型比例系数 149 LWEIGHT LW 设置线宽 150 MASSPROP   查询实体特性 151 MATCHPROP MA 属性匹配 152 MATLIB   材质库管理 153 MEASURE ME 定长等分实体 154 MENU   加载菜单文件 155 MENULOAD   加载部份主菜单 156 MENUUNLOAD   卸载部份主菜单 157 MINSERT   按矩形阵列方式插入图块 158 MIRROR MI 镜像实体 159 MIRROR3D   三维镜像 160 MLEDIT   编辑平行线 161 MLINE ML 绘制平行线 162 MLSTYLE   定义平行线样式 163 MODEL   从图纸空间切换到模型空间 164 MOVE M 移动实体 165 MSLIDE   创建幻灯片 166 MSPACE MS 从图纸空间切换到模型空间 167 MTEXT MT或T 多行文本标注 168 MULTIPLE   反复多次执行上一次命令直到 执行别的命令或按Esc键 169 MVIEW MV 创建多视窗 170 MVSETUP   控制视口 171 NEW   新建图形文件 172 OFFSET O 偏移复制实体 173 OLELINKS   更新、编辑或取消已存在的OLE链接 174 OLESCALE   显示OLE属性管理器 175 OOPS   恢复最后一次被删除的实体 176 OPEN   打开图形文件 177 OPTIONS OP、PR 设置AutoCAD系统配置 178 ORTHO   F8 切换正交状态 179 OSNAP OS 或–OS 设置目标捕捉方式及捕捉框大小 180 PAGESETUP   页面设置 181 PAN P或–P 视图平移 182 PARTIALOAD   部分装入 183 PARTIALOPEN   部分打开 184 PASTEBLOCK   将已复制的实体目标粘贴成图块 185 PASTECLIP   将剪贴板上的数据粘贴 至当前图形文件中 186 PASTEORLG   固定点粘贴 187 PASTESPEC PA 将剪贴板上的数据粘贴至当前图形文件中并控制其数据格式 188 PCINWINEARD   导入PCP或PC2配置文件的向导 189 PEDIT PE 编辑多段线和三维多边形网格 190 PFACE   绘制任意形状的三维曲面 191 PLAN   设置UCS平面视图 192 PLINE PL 绘制多段线 193 PLOT PRINT 图形输出 194 PLOTSTYLE   设置打印样式 195 PLOTTERMANAGER   打印机管理器 196 POINT PO 绘制点 197 POLYGON POL 绘制正多边形 198 PREVIEW PRE   199 PROPERTLES CH、MO、PRO 、PS、DDMODI、FX、DDCHPR OR 打印预览 目标属性管理器 200 PROPERTLESCLOSE PRCLOSE 关闭属性管理器 201 PSDRAG   控制PostScript图像显示 202 PSETUPIN   导入自定义页面设置 203 PSFILL   用PostScript图案填充维多段线 204 PSIN   输入PostScript文件 205 PSOUT   输出PostScript文件 206 PSPACE PS 从模型空间切换到图纸空间 207 PURGE PU 消除图形中无用的对象,如图块、尺寸标注 样式、图层、线型、形和文本标注样式等 208 QDIM   尺寸快速标注 209 QLEADER LE 快速标注指引线 210 QSAVE   保存当前图形文件 211 QSELECT   快速选择实体 212 QTEXT   控制文本显示方式 213 QUIT EXIT 退出AutoCAD 214 RAY   绘制射线 215 RECOVER   修复损坏的图形文件 216 RECTANG REC 绘制矩形 217 REDEFINE   恢复一条已被取消的命令 218 REDO   恢复由Undo(或U)命令取消的最后一条命令 219 REDRAW R 重新显示当前视窗中的图形 220 REDRAWALL RA 重新显示所有视窗中的图形 221 REFCLOSE   外部引用在位编辑时保存退出 222 REFEDIT   外部引用在位编辑 223 REFSET   添加或删除外部引用中的项目 224 REGEN RE 重新生成当前视窗中的图形 225 REGENALL REA 重新刷新生成所有视窗中的图形 226 REGGNAUTO   自动刷新生成图形 227 REGION REG 创建区域 228 REINIT   重新初始化AutoCAD的通信端口 229 RENAME REN 更改实体对象的名称 230 RENDER RR 渲染 231 RENDSCK   重新显示渲染图片 232 REPLAY   显示BMP、TGA或TIEF图像文件 233 RESUME   继续已暂停或中断的脚本文件 234 REVOLVE REV 将维图形旋转成三维实体 235 REVSURF   绘制旋转曲面 236 RMAT   材质设置 237 ROTATE RO 旋转实体 238 ROTATE3D   三维旋转 239 RPREF RPR 设置渲染参数 240 RSCRIPT   创建连续的脚本文件 241 RULESURF   绘制直纹面 242 SAVE   保存图形文件 243 SAVE AS   将当前图形另存为一个新文件 244 SAVEIMG   保存渲染文件 245 SCALE SC 比例缩放实体 246 SCENE   场景管理 247 SCRIPT SCR 自动批处理AutoCAD命令 248 SECTION SEC 生成剖面 249 SELECT   选择实体 250 SETUV   设置渲染实体几何特性 251 SETVAR SET 设置AutoCAD系统变量 252 SHADE SHA 着色处理 253 SHAPE   插入形文件 254 SHELL SH 切换到DOS环境下 255 SHOWMAT   显示实体材质类型 256 SKETCH   徒手画线 257 SLICE SL 将三维实体切开 258 SNAP SN 设置目标捕捉功能 259 SOLDRAW   生成三维实体的轮廓图形 260 SOLID SO 绘制实心多边形 261 SOLIDEIDT   三维实体编辑 262 SOLPROF   绘制三维实体的轮廓图像 263 SOLVIEW   创建三维实体的平面视窗 264 SPELL SP 检查文体对象的拼写 265 SPHERE   绘制球体 266 SPLINE SPL 绘制一条光滑曲线 267 SPLINEDIT SPE 编制一条光滑曲线 268 STATS   显示渲染实体的系统信息 269 STATUS   查询当前图形文件的状态信息 270 STLOUT   将三维实体以STL格式保存 271 STRETCH S 拉伸实体 272 STYLE ST 创建文体标注样式 273 STYLESMANAGER   显示打印样式管理器 274 SUBTRACT SU 布尔求差 275 SYSWINDOWS   控制AutoCAD 文体窗口 276 TABLET TA 设置数字化仪 277 TABSURF   绘制拉伸曲面 278 TEXT   标注单行文体 279 TEXTSCR   切换到AutoCAD文体窗口 280 TIME   时间查询 281 TOLERANCE TOL 创建尺寸公差 282 TOOLBAR TO 增减工具栏 283 TORUS TOR 创建圆环实体 284 TRACE   绘制轨迹线 285 TRANSPARENCY   透水波设置 286 TREESTAT   显示当前图形文体件路径信息 287 TRIM TR 修剪 288 U   撤消上一操作 289 UCS   建立用户坐标系统 290 UCSICON   控制坐标图形显示 291 UCSMAN   UCS管理器 292 UNDEFINE   允许用户将自定义命令覆盖AutoCAD内部命令 293 UNDO   撤消上一组操作 294 UNION UNI 布 尔求并 295 UNITS –UN 或UN 设置长度及角度的单位格式和精度等级 296 VBAIDE   VBA集成开发环境 297 VBALOAD   加载VBA项目 298 VBAMAN   VBA管理器 299 VBARUN   运行VBA宏 300 VBASTMT   运行VBA语句 301 VBAUNLOAD   卸载VBA工程 302 VIEW –V 视窗管理 303 VIEWRES   设置当前视窗中目标重新生成的分辨率 304 VLISP VLIDE 打开Visual LISP集成开发环境 305 VPCLIP   复制视图实体 306 VPLAYER   设置视窗中层的可见性 307 VPOINT –VP或VP 设置三维视点 308 VPORTS   视窗分割 309 VSLIDE   显示幻灯文件 310 WBLOCK W 图块存盘 311 WEDGE WE 绘制楔形体 312 WHOHAS   显示已打开的图形文件的所属信息 313 WMFIN   输入Windows应用软件格式的文件 314 WMFOPTS   设置WMFIN命令选项 315 WMFOUT   WMF格式输出 316 XATTACH XA 粘贴外部文件至当前图形 317 XBIND –XB或XB 将一个外部引用的依赖符永久地溶入 当前图形文件中 318 XCLIP XC 设置图块或处理引用边界 319 XLINE XL 绘制无限长直线 320 XPLODE   分解图块并设置属性参数 321 XREF XR或–XR 外部引用 322 ZOOM Z 视图缩放透明命令
程序设计课程设计 李 晶 [email protected] 孙鹏飞 [email protected] 杨金翠 [email protected] 刁婷 [email protected] 李峥 [email protected] 参考资料 C语言程序设计的教材及相关课堂资料 搜索引擎 时间表(物联网) 实践要求 C语言 两个题目,任选其一; 分组完成,五人一组,专业内自愿组合﹔ 开发环境:VC/Visual Studio/Dev C++/C Free等。 要求: 提供命令行操作,无需图形界面模块化结构 遵守编程规范界面友好运行正确具有容错机制 实践内容 航空售票系统 订餐系统 航空售票系统系统 服务人群︰ 购票用户。购票用户信息包含∶用户ID、姓名、性别、电话、密码、邮箱 航空公司管理员。每个航空公司一名管理员,航空公司管理员信息包含∶管理员ID、所属航空公司、姓名、邮箱、密码 要求∶ 用户ID、管理员ID均为字母数字组合的字符串,长度6-10个字符 电话号码为11位数字 邮箱必须符合规范**@*. 航空售票系统 航班信息包含∶ 航班号、所属航空公司、起飞地、降落地、起飞时间、预计空中飞行时间、舱位等级及相应座位号、机型、准点率、各等级票价、飞行员(两名)以及相应舱位的余票数等。 要求︰ 航班号∶2位字母+4位数字飞行时间︰符合时间格式hh:mm起飞地、降落地∶为国内真实城市 座位号∶符合飞机座位号形式,例如经济舱Y34A准点率∶百分比的形式 机型∶例如波音737等假设∶ 系统内的所有航班的每天执飞一次,且发生在每天的固定时间。 航空售票系统 购票用户功能∶ 登陆∶输入用户ID和密码登陆系统。 航班查询∶根据系统提供的信息进行航班查询。根据航班号以及出发时间查询; 根据出发城市、到达城市以及出发时间查询; 可用起飞时间段、航空公司、舱位、机型等过滤查询结果根据起飞时间排序所有航班; 同一航班因为有不同舱位等级,可能有不同价格,根据航班的最低价格排序所有航班,但每个航班的不同舱位价格都应显示出来; 查询之后允许用户购票﹔ 系统也可以有热门航班推荐,可根据价格或热点旅游地城市等来推荐,此处可自行确定用什么规则来推荐。 航空售票系统 购票用户功能︰ 用户购票:用户根据需要浏览并可选择感兴趣的航班。 假设∶ 系统只提供直飞航班; 同一个订单可包含多个航班,可以包含多个乘机人。同一名用户购买的自己乘坐的多个航班的时间不能冲突﹔规定一名用户一天最多购买五张航班机票; 每个航班购票人数不能超过座位总数; 同一天内同一个乘机人的不同航班,要保证时间顺序上前一段航程的目的地与后一段航程的出发地在允许的时间范围内可到达。 航空售票系统购票 用户功能: 个人信息管理 对个人信息中的电话、密码及邮箱进行修改取消订单 在未付款之前用户可以取消自己的订单假设∶可模拟付款 查询购票后的订单 查看用户曾经的购票记录 航空售票系统 航空公司管理员功能︰ 登陆:输入管理员ID和密码登陆系统。订单管理︰ 查看用户订单情况∶ ·查询管理员自己所属航空公司的航班的订票情况(各航班已被订票的详细信息,如何时哪个用户购买了哪个航班的哪个座位) 统计用户订单信息∶ ·按已购票人数排序还未起飞的本航空公司所有的航班信息按飞机上座率排序已经飞行结束的所有历史航班信息(可以按日期分区段进行排序显示) ·按航班总票价收入排序已经飞行结束的所有历史航班信息(可以按曰期分区段进行排序显示),并可计算显示出总票价收入 航空售票系统 航空公司管理员功能∶ 航班管理:针对管理员本航空公司开设的航班 航班查询:查询所有开设的航班信息 添加航班︰添加一个新的航班 ·同一名飞行员的飞行时间不能冲突﹔ 同一名飞行员执飞的前一个航班的目的地与后一个航班的出发地在时间上保证可到达﹔ 航班号不能重复; 添加航班的最后一步为发布,发布之前可以修改和取消添加。 个人信息管理 对个人信息中的密码及邮箱进行修改 作业提交 设计报告内容︰ 系统总体设计 系统总体功能描述(包含模块图及整个系统的总体功能描述)接口定义规范(按照什么原则来命名接口) 系统的数据结构描述(系统需要处理什么样的数据,这些数据以什么形式存储及程序运行过程中使用的数据结构描述) 系统的开发环境及运行环境描述(包含软硬件环境)模块详细设计 功能概述 处理流程(包含流程图及详细的处理流程) 模块的输入输出(包含输入输出的数据描述及数据结构或存储格式描述)模块的接口描述(包含接口名字、接口参数名、参数类型、参数描述,返回值名,返回值类型、返回值描述,接口的作用) 每个功能的边界情况描述及处理方法 作业提交 提交方式 .2021年9月6日19:00之前 .上传到爱课堂 .上传文件为0字节的无效
北交《计算机图形学》在线作业 一、单选题(共 20 道试题,共 50 分。) 1. 透视投影中主灭点最多可以有( )个 A. 1 B. 2 C. 3 D. 4 正确答案: 2. 在下列有关曲线和曲面概念的叙述语句中,错误的论述为( ) A. 实体模型和曲面造型是CAD系统中常用的主要造型方法,曲面造型是用参数曲面描述来表 示一个复杂的物体 B. 在曲线和曲面定义时,使用的基函数应有两个重要性质:凸包性和仿射不变性 C. 从描述复杂性和形状灵活性考虑,最常用的参数曲面是3次有理多项式的曲面 D. 参数形式和隐含形式都是精确的解析表示法,在计算机图形学中,它们一样好用 正确答案: 3. 下列设备中哪一种是图形输出设备( ) A. 绘图仪 B. 数字化仪 C. 扫描仪 D. 键盘 正确答案: 4. 在中点画圆算法中,那些说法是错误的( ) A. 为了减轻画圆的工作量,中点画圆利用了圆的四对称性性质 B. 中点画圆算法是一个增量算法 C. 中点画圆算法只用到整数的加减法和左移运算,故效率高且适合硬件实现 D. 中点还原算法与中点画线算法类似,用一个函数值来选择两个像素点中最逼近圆弧的像 素点 正确答案: 5. 关于计算机图形标准化的论述,哪个是错误的( ) A. CGM和CGI是面向图形设备的接口标准 B. GKS、IGES、STEP均是ISO标准 C. IGES和STEP是数据模型和文件格式的标准 D. PHIGS具有模块化的功能结构 正确答案: 6. 分辨率为1080×1024的显示器各需要多少字节位平面数为24的帧缓存( ) A. 512KB B. 1.6MB C. 2.7MB D. 3.9MB 正确答案: 7. Sutherland- Hodgeman多边形裁剪(逐边裁剪)算法中,对于多边形的某条边(方向为从端点S到端点 P )与裁剪窗口的某条边的比较结果共有以下四种情况,分别需输出一些点,请问哪种情况 下输出的点是错误的( ) A. S在裁剪边外侧而P在裁剪边内侧,则输出该边与裁剪边的交点I和P点 B. S与P均在裁剪边内侧,则输出P点 C. S在裁剪边内侧而P在裁剪边外侧,则输出该边与裁剪边的S点和交点I D. S与P均在裁剪边外侧,则不输出点 正确答案: 8. 在光亮度插值算法中,下列论述哪个是错误的( ) A. Gouraud明暗模型计算中,多边形与扫描平面相交区段上每一采样点的光亮度值是由扫描 平面与多边形边界交点的光亮度插值得到的 B. Phong明暗处理模型中,采用了双线性插值和构造法向量函数的方法模拟高光 C. Gouraud明暗模型和Phong明暗处理模型主要是为了处理由多个平面片近似表示曲面物体 的绘制问题 D. Phong明暗模型处理的物体表面光亮度呈现不连续跃变 正确答案: 9. 编辑3D文字时,怎样得到能够在三维空间内旋转3D文字的角度控制框( ) A. 利用"选择"工具单击3D文字 B. 利用"交互立体"工具单击3D文字 C. 利用"交互立体"工具双击3D文字 D. 利用"交互立体"工具先选中3D文字,然后再单击 正确答案: 10. 如果要将辅助线按15度固定角度旋转,需要按住下列哪一个键( ) A. ALT B. CTRL C. SHIFT D. ESC 正确答案: 11. 用编码裁剪算法裁剪维线段时,若直线段两端点M、N的编码分别为1000和1010,则对 该线段采用的处理方法是( ) A. 直接保留 B. 直接放弃 C. 对MN在求交分割 D. 不能判断 正确答案: 12. 在多边形的逐边裁剪算法中,对于某条多边形的边(方向为从端点S到端点P)与某条裁 剪线(窗口的某一边)的比较结果共有以下4种情况,分别须输出一些顶点。请问哪种情 况下输出的顶点是错误的( ) A. S和P均在可见的一侧,则输出S和P B. S和P均在不可见的一侧,则输出0个顶点 C. S在可见一侧,P在不可见一侧,则输出线段SP与裁剪线的交点 D. S在不可见一侧,P在可见一侧,则输出线段SP与裁剪线的交点和P 正确答案: 13. 要为两个选定的对象复制已有的 Blend 效果,但需要确保"主对象"做更改时不会影响到此复制对象,应执行什么命令( ) A. "Effects-Copy Effect-Blend From" B. "Effects-Clone Effect-Blend From" C. "Edit-Duplicate" D. "Edit-Copy" 正确答案: 14. 以下关于图形变换的论述那些是错误的( ) A. 错切变换虽然可引起图形角度的改变,但不会发生图形畸变 B. 平移变换不改变图形大小和形状,只改变图形位置 C. 拓扑关系不变的几何变换不改变图形的连接关系和平行关系 D. 旋转变换后各图形部分间的
1. 算法的基本概念 利用计算机算法为计算机解题的过程实际上是在实施某种算法。 (1)算法的基本特征 算法一般具有4个基本特征:可行性、确定性、有穷性、拥有足够的情报。 (2)算法的基本运算和操作 算法的基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输。 (3)算法的3种基本控制结构 算法的3种基本控制结构是:顺序结构、选择结构、循环结构。 (4)算法基本设计方法 算法基本设计方法:列举法、归纳法、递推、递归、减半递推技术、回溯法。 (5)指令系统 所谓指令系统指的是一个计算机系统能执行的所有指令的集合。 (2)数据结构研究的3个方面 ① 数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构; ② 在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构; ③ 对各种数据结构进行的运算。 2. 逻辑结构 数据的逻辑结构是对数据元素之间的逻辑关系的描述,它可以用一个数据元素的集合和定义在此集合中的若干关系来表示。数据的逻辑结构有两个要素:一是数据元素的集合,通常记为D;是D上的关系,它反映了数据元素之间的前后件关系,通常记为R。一个数据结构可以表示成:B=(D,R) 其中,B表示数据结构。为了反映D中各数据元素之间的前后件关系,一般用元组来表示。 例如,如果把一年四季看作一个数据结构,则可表示成:B =(D,R) D ={春季,夏季,秋季,冬季} R ={(春季,夏季),(夏季,秋季),(秋季,冬季)} 3. 存储结构 数据的逻辑结构在计算机存储空间中的存放形式称为数据的存储结构(也称数据的物理结构)。 由于数据元素在计算机存储空间中的位置关系可能与逻辑关系不同,因此,为了表示存放在计算机存储空间中的各数据元素之间的逻辑关系(即前后件关系),在数据的存储结构中,不仅要存放各数据元素的信息,还需要存放各数据元素之间的前后件关系的信息。 一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序、链接等存储结构。 顺序存储方式主要用于线性的数据结构,它把逻辑上相邻的数据元素存储在物理上相邻的存储单元里,结点之间的关系由存储单元的邻接关系来体现。 链式存储结构就是在每个结点中至少包含一个指针域,用指针来体现数据元素之间逻辑上的联系。 1.2.2 线性结构和非线性结构 根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大类型:线性结构与非线性结构。 (1)如果一个非空的数据结构满足下列两个条件: ① 有且只有一个根结点; ② 每一个结点最多有一个前件,也最多有一个后件。 则称该数据结构为线性结构。线性结构又称线性表。在一个线性结构中插入或删除任何一个结点后还应是线性结构。栈、队列、串等都为线性结构。 如果一个数据结构不是线性结构,则称之为非线性结构。数组、广义表、树和图等数据结构都是非线性结构。 (2)线性表的顺序存储结构具有以下两个基本特点: ① 线性表中所有元素所占的存储空间是连续的; ② 线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。 元素ai的存储地址为:ADR(ai)=ADR(a1)+(i-1)k,ADR(a1)为第一个元素的地址,k代表每个元素占的字节数。 (3)顺序表的运算有查找、插入、删除3种。 1.3 栈 1. 栈的基本概念 栈(stack)是一种特殊的线性表,是限定只在一端进行插入与删除的线性表。 在栈中,一端是封闭的,既不允许进行插入元素,也不允许删除元素;另一端是开口的,允许插入和删除元素。通常称插入、删除的这一端为栈顶,另一端为栈底。当表中没有元素时称为空栈。栈顶元素总是最后被插入的元素,从而也是最先被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。 栈是按照“先进后出”或“后进先出”的原则组织数据的。例如,枪械的子弹匣就可以用来形象的表示栈结构。子弹匣的一端是完全封闭的,最后被压入弹匣的子弹总是最先被弹出,而最先被压入的子弹最后才能被弹出。 级公共基础知识速学教程 2. 栈的顺序存储及其运算 栈的基本运算有3种:入栈、退栈与读栈顶元素。 ① 入栈运算:在栈顶位置插入一个新元素; ② 退栈运算:取出栈顶元素并赋给一个指定的变量; ③ 读栈顶元素:将栈顶元素赋给一个指定的变量。 1.4 队列 1. 队列的基本概念 队列是只允许在一端进行删除,在另一端进行插入的顺序表,通常将允许删除的这一端称为队头,允许插入的这一端称为队尾。当表中没有元素时称为空队列。 队列的修改是依照先进先出的原则进行的,因此队列也称为先进先出的线性表,或者后进后出的线性表。例如:火车进遂道,最先进遂道的是火车头,最后是火车尾,而火车出遂道的时候也是火车头先出,最后出的是火车尾。若有队列: Q =(q1,q2,…,qn) 那么,q1为队头元素(排头
计算机网络作业三及解答 计算机网络作业三及解答 一、单项选择题 1.下列说法正确的是( )。 A.信道与通信电路类似,一条可通信的电路往往包含一个信道 B.调制是指把模拟数据转换为数字信号的过程 C.信息传输速率是指通信信道上每秒传输的码元数 D.在数值上,波特率等于比特率与每符号含的比特数的比值 2.利用模拟通信信道传输数字信号的方法称为( )。 A.同步传输 B.异步传输 C.基带传输 D.频带传输 3.测得一个以太网数据的波特率是40M Baud,那么其数据率是( )。 A.10Mbit/s B.20Mbit/s C.40Mbit/s D.80Mbit/s 4.已知某信道的信号传输速率为64kbit/s,一个载波信号码元有4个有效离散值,则该 信道的波特率为( )。 A.16kBaud B.32kBaud C.64kBaud D.1 28kBaud 5.某信道的波特率为1000Baud,若令其数据传输速率达到4kbit/s,则一个信号码元所 取的有效离散值个数为( ) 。 A.2 B.4 C.8 D. 1 6 6.对于某带宽为4000Hz的低通信道,采用1 6种不同的物理状态来表示数据。按照奈奎斯特定理,信道的最大传输速率是( )。 A.4kbit/s B.8kbit/s C.1 6kbit/s D.32kbit/s 7.有一条无噪声的8kHz信道,每个信号包含8级,每秒采样24k次,那么可以获得的最大 传输速率是( )。 A.24kbit/s B.32kbit/s C.48kbit/s D.72kbit/s 8.影响信道最大传输速率的因素主要有( )。 A.信道带宽和信噪比 B.码元传输速率和噪声功率 C.频率特性和带宽 D.发送功率和噪声功率 9.电话系统的典型参数是信道带宽为3000Hz,信噪比为30dB,则该系统的最大数据传输 速率为( )。 A.3kbit/s B.6kbit/s C.30kbit/s D.64kbit/s 10.进制信号在信噪比为127:1的4kHz信道上传输,最大的数据速率可达到( )。 A.28000bit/s B.8000bit/s C.4000bit/s D.可以是无限大 11.下列有关曼彻斯特编码的叙述正确的是( )。 A.每个信号起始边界作为时钟信号有利于同步 B.将时钟与数据取值都包含在信号中 C.这种模拟信号的编码机制特别适合于传输声音 D.每位的中间不跳变表示信号的取值为O 12.在网络中,把语音与计算机产生的数字、文字、图形与图像同时传输,必须先把语 音信号数字化。下列可以把语音信号数字化的技术是( )。 A.曼彻斯特编码 B.QAM C.差分曼彻斯特编码 D.脉冲编码调 C.1 28kbit/s D.1 024kbit/s 1 7.一个信道每1/8s采样一次,传输信号共有1 6种变化状态,最大数据传输率是( )。 A.。1 6bit/s B.32bit/s C.48bit/s D.64bit/s 1 8.将1路模拟信号分别编码为数字信号后,和另外7路数字信号采用同步TDM方式复用到 一条通信线路上。1路模拟信号的频率变化范围为O~l kHz,每个采样点采用PCM方 式编码为4位的进制数,另外7路数字信号的数据率均为7.2kbit/s。复用线路需要的 最小通信能力是( )。 A.7.2kbit/s B.8kbit/s C.64kbit/s D.5 1 2kbit/s . 19.在下列数据交换方式中,数据经过网络的传输延迟长而且是不固定的,不能用于语 音数据传输的是( )。 A.电路交换 B.报文交换 C.数据报交换 D.虚电路交换 20.Internet本质上属于( )。 A.电路交换网络 B.报文交换网络 C.分组交换网络 D.虚电路网络 21.不同的数据交换方式有不同的性能。为了使数据在网络中的传输时延最小,首选的 交换方式是( );为保证数据无差错地传送,不应选用的交换方式是( );分组交换 对报文交换的主要改进是( ),这种改进产生的直接结果是( );在出错率很高的传 输系统中,选用( )更合适。 A.电路交换 B.报文交换 C.分组交换 D.信元交换 A.电路交换 B.报文交换 C.分组交换 D.信元交换 A.传输单位更小且有固定的最大长度 B.传输单位更大且有固定的最大长度 C.差错控制更完善 D.路由算法更简单 A.降低了误码率 B.提高了数据传输速率 C.减少传输时延 D.增加传输时延 A.虚电路方式 B.数据报方式 C.报文交换 D.电路交换 22.下列关于三种数据交换方式的叙述,错误的是( )。 A.电路交换不提供差错控制功能 B.分组交换的分组有最大长度的限制 C.虚电路是面向连接的,它提供的是一种可靠的服务 D.在出错率很高的传输系统中,选择虚电

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值