⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 femmviewview.cpp

📁 一个2D电磁场FEM计算的VC++源程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				c[n][2]=(1.-y)*p[2][0] + y*p[2][1];
				if ((z>=0) && (z<20)) n++; 
				if(n>=64) return;
			}
		else
			for(z=floor(p[2][0]);z>p[2][1];z--)
			{
				y=(z-p[2][0])/(p[2][1]-p[2][0]);
				c[n][0]=(1.-y)*p[0][0] + y*p[1][0];
				c[n][1]=(1.-y)*p[0][1] + y*p[1][1];
				c[n][2]=(1.-y)*p[2][0] + y*p[2][1];
				if ((z>=0) && (z<20)) n++; 
				if(n>=64) return;
			}

	}

	// subtriangle vertices are now listed in the c[][] array.
	// there are n vertices.  Now, plot out these subtriangles;

	do{
		// find lowest vertex & neighbors;
		for(i=1,j=0;i<n;i++) if (c[i][2]<c[j][2]) j=i;
		i=j-1; if(i<0) i=n-1;
		k=j+1; if(k>=n) k=0;

		// plot triangle;
		b=(c[i][2]+c[j][2]+c[k][2])/3.;
		lav=19-((int) b);
		if(lav>19) lav=19;
		if(lav<0) lav=0;

		{
			CPen FillPen,*pOldPen;
			CBrush FillBrush,*pOldBrush;
			BOOL DrawIt=TRUE;

			if (GreyContours==FALSE){
				if(mymap[lav]==BackColor) DrawIt=FALSE;
				else{
					FillBrush.CreateSolidBrush(mymap[lav]);
					FillPen.CreatePen(PS_SOLID,1,mymap[lav]);
				}
			}
			else{
				if(greymap[lav]==BackColor) DrawIt=FALSE;
				else{
					FillBrush.CreateSolidBrush(greymap[lav]);
					FillPen.CreatePen(PS_SOLID,1,greymap[lav]);
				}
			}
			if(DrawIt==TRUE)
			{
				pOldBrush = pDC->SelectObject( &FillBrush );
				pOldPen = pDC->SelectObject( &FillPen );
				ps[0].x=(long) c[i][0]; ps[0].y=(long) c[i][1];
				ps[1].x=(long) c[j][0]; ps[1].y=(long) c[j][1];
				ps[2].x=(long) c[k][0]; ps[2].y=(long) c[k][1];
				pDC->Polygon(ps,3);	
				pDC->SelectObject(pOldPen);
				pDC->SelectObject(pOldBrush);
			}
		}

		// remove middle point from the list;
		for(i=j;i<n-1;i++)
			for(k=0;k<3;k++)
				c[i][k]=c[i+1][k];
		n--;

	} while (n>2);
}

///////////////

void CFemmviewView::PlotSelectedElm(CDC *pDC,CElement &elm)
{
	int i;
	POINT p[3];
	CFemmviewDoc *pDoc=GetDocument();

	if (elm.lbl!=DrawSelected)
		if (pDoc->blocklist[elm.lbl].IsSelected==FALSE) return;

	for(i=0;i<3;i++){
			p[i].x=pDoc->meshnode[elm.p[i]].xs;
			p[i].y=pDoc->meshnode[elm.p[i]].ys;
		}

	CPen FillPen,*pOldPen;
	CBrush FillBrush,*pOldBrush;
	if (pDoc->blocklist[elm.lbl].IsSelected==TRUE)
	{
		FillBrush.CreateSolidBrush(RegionColor);
		FillPen.CreatePen(PS_SOLID,1,RegionColor);
	}
	else{
		FillBrush.CreateSolidBrush(0x00ffffff);
		FillPen.CreatePen(PS_SOLID,1,0x00ffffff);
	}
	pOldBrush = pDC->SelectObject( &FillBrush );
	pOldPen = pDC->SelectObject( &FillPen );
	pDC->Polygon(p,3);	
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}

void CFemmviewView::DrawUserContour(BOOL flag)
{
	// FALSE == just draw last line in contour;
	// TRUE  == draw all lines in contour;
	int i,xs,ys,xso,yso;

	CFemmviewDoc *pDoc=GetDocument();
	CDC *pDC=GetDC();
	RECT r;
	GetClientRect(&r);

	for(i=0;i<pDoc->contour.GetSize();i++){
		DwgToScreen(pDoc->contour[i].re,pDoc->contour[i].im,&xs,&ys,&r);
		if((flag==TRUE) || (i==pDoc->contour.GetSize()-1))
		{
			if(i==0){
				SpecialLine(pDC,xs-2,ys,xs+2,ys,FALSE);
				SpecialLine(pDC,xs,ys-2,xs,ys+2,FALSE);
				xso=xs;yso=ys;
			}
			else{
				SpecialLine(pDC,xso,yso,xs,ys,FALSE);
				xso=xs; yso=ys;
			}
		}
		else{ xso=xs; yso=ys; }
	}
	ReleaseDC(pDC);
}

void CFemmviewView::EraseUserContour(BOOL flag)
{
	// FALSE == just draw last line in contour;
	// TRUE  == draw all lines in contour;
	int i,xs,ys,xso,yso;

	CFemmviewDoc *pDoc=GetDocument();
	CDC *pDC=GetDC();
	RECT r;
	GetClientRect(&r);

	for(i=0;i<pDoc->contour.GetSize();i++){
		DwgToScreen(pDoc->contour[i].re,pDoc->contour[i].im,&xs,&ys,&r);
		if((flag==TRUE) || (i==pDoc->contour.GetSize()-1))
		{
			if(i==0){
				SpecialLine(pDC,xs-2,ys,xs+2,ys,TRUE);
				SpecialLine(pDC,xs,ys-2,xs,ys+2,TRUE);
				xso=xs;yso=ys;
			}
			else{
				SpecialLine(pDC,xso,yso,xs,ys,TRUE);
				xso=xs; yso=ys;
			}
		}
		else{ xso=xs; yso=ys; }
	}
	ReleaseDC(pDC);
}

void CFemmviewView::OnDraw(CDC* pDC)
{
	CFemmviewDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	RECT r;
	static RECT oldr;
	GetClientRect(&r);
	int i,j,k;				// usual iterators...
	int xs,ys,nx,ny;
	double xd,yd,dt,R;
	double xss,yss,rss,rt;
	CComplex p,c,s;

	const COLORREF mymap[]={
		Color00,Color01,Color02,Color03,Color04,
		Color05,Color06,Color07,Color08,Color09,
		Color10,Color11,Color12,Color13,Color14,
		Color15,Color16,Color17,Color18,Color19
	};	

	const COLORREF greymap[]={
		Grey00,Grey01,Grey02,Grey03,Grey04,
		Grey05,Grey06,Grey07,Grey08,Grey09,
		Grey10,Grey11,Grey12,Grey13,Grey14,
		Grey15,Grey16,Grey17,Grey18,Grey19
	};

	CFont fntArial,*pOldFont;
	fntArial.CreateFont(16,6,0,0,0,0,0,0,0,0,0,0,0,"Arial");
	pOldFont=pDC->SelectObject(&fntArial);

	BeginWaitCursor();

	if(pDoc->FirstDraw<0)
	{
		pDoc->Smooth=d_Smooth;
		pDoc->FirstDraw=FALSE;
	}

	if(pDoc->FirstDraw==TRUE){
		// Apply default behaviors
		ox=0.; oy=0.; mag=100.;	
		GridSize=0.25;			
		Coords=FALSE;
		ZoomWndFlag=FALSE;
		DrawSelected=-1;
		VectorScaleFactor=1;
		EditAction=d_EditAction;
		GridFlag=d_GridFlag;	
		SnapFlag=d_SnapFlag;	
		MeshFlag=d_MeshFlag;
		ShowNames=d_ShowNames;
		LegendFlag=d_LegendFlag;
		GreyContours=d_GreyContours;		
		NumContours=d_NumContours;
		ShowAr=d_ShowAr;
		ShowAi=d_ShowAi;
		ShowMask=d_ShowMask;
		DensityPlot=d_DensityPlot;
		VectorPlot=d_VectorPlot;
		PtsFlag=d_PtsFlag;
		pDoc->Smooth=d_Smooth;

		// catch inconsistent default settings
		if(pDoc->Frequency==0)
		{
			if (DensityPlot==2) DensityPlot=1;
			if (DensityPlot>1) DensityPlot=0;
			d_ShowAi=FALSE;
		}
		
		OnZoomNatural();
		LinePix.RemoveAll();
		oldr=r;
		OnViewInfo();
	}

	if((oldr.right!=r.right) || (oldr.bottom!=r.bottom))
	{
		LinePix.RemoveAll();
		oldr=r;
	}

	if (pDC->IsPrinting()!=FALSE){
		CSize sz;
		RECT cr;
		int wd=pDC->GetDeviceCaps( HORZRES );
		int hd=pDC->GetDeviceCaps( VERTRES );
		int ww=r.right-r.left;
		int hw=r.bottom-r.top;
		int x=wd/ww;
		int y=hd/hw;
		if (y<x) x=y;
		pDC->SetMapMode(MM_ISOTROPIC);
		sz.cx=ww; sz.cy=hw;
		pDC->SetWindowExt(sz);
		sz.cx=x*ww; sz.cy=x*hw;
		pDC->SetViewportExt(sz);
		pDC->GetClipBox(&cr);
		pDC->IntersectClipRect(&r);
	}
	// just give up and make sure that the right
	// buttons are checked every time through OnDraw;
	// otherwise, it's just too easy to get the buttons
	// so that they don't match the actual mode.
	else CheckIt();
	
	CPen *pOldPen;
	CPen penBlue,penRed,penBlack,penGreen,
		penMesh,penReal,penImag,penMask,
		penNode,penText,penRealVector,penImagVector;
	penBlue.CreatePen(PS_SOLID,1,LineColor);
	penRed.CreatePen(PS_SOLID,1,SelColor);
	penReal.CreatePen(PS_SOLID,1,RealFluxLineColor);
	penImag.CreatePen(PS_SOLID,1,ImagFluxLineColor);
	penMask.CreatePen(PS_SOLID,1,MaskLineColor);
	penGreen.CreatePen(PS_SOLID,1,BlockColor);
	penMesh.CreatePen(PS_SOLID,1,MeshColor);
	penNode.CreatePen(PS_SOLID,1,NodeColor);
	penText.CreatePen(PS_SOLID,1,TextColor);
	penRealVector.CreatePen(PS_SOLID,1,RealVectorColor);
	penImagVector.CreatePen(PS_SOLID,1,ImagVectorColor);

	// Convert node coordinates to screen coordinates
	for(i=0;i<pDoc->nodelist.GetSize();i++)
	  if(DwgToScreen(pDoc->nodelist[i].x,pDoc->nodelist[i].y,
				  &(pDoc->nodelist[i].xs),&(pDoc->nodelist[i].ys),&r)==FALSE)
	{
		mag/=2.;
		i=-1;
	}
			
	// Convert meshnode coordinates to screen coordinates
	for(i=0;i<pDoc->meshnode.GetSize();i++)
	  DwgToScreen(pDoc->meshnode[i].x,pDoc->meshnode[i].y,
				  &(pDoc->meshnode[i].xs),&(pDoc->meshnode[i].ys),&r);
	
	// get center and radius of the screen in drawing coords.
	// can then use to find out whether elements are off the screen.
	xs=(r.right+r.left)/2;
	ys=(r.top+r.bottom)/2;
	ScreenToDwg(xs,ys, &xss, &yss, &r);
	rss=sqrt(pow((double)r.bottom,2.) + pow((double)r.right,2.))/(2.*mag);

	// Draw selected area...
	if (EditAction==2)
	{
		for(i=0;i<pDoc->meshelem.GetSize();i++){
			if((pDoc->meshelem[i].lbl==DrawSelected) || (DrawSelected==-1)){
				rt=sqrt( pow(xss-pDoc->meshelem[i].ctr.re,2.) +
				     pow(yss-pDoc->meshelem[i].ctr.im,2.) );
				if( rt < ( sqrt(pDoc->meshelem[i].rsqr) + rss) )
					PlotSelectedElm(pDC,pDoc->meshelem[i]);
			}
		}
	}

	// Draw flux densities if they are enabled...
	if(DensityPlot!=0){
		for(i=0;i<pDoc->meshelem.GetSize();i++){
			if((pDoc->meshelem[i].lbl==DrawSelected) || (DrawSelected==-1)){
				rt=abs(CComplex(xss,yss)-pDoc->meshelem[i].ctr);
				if( rt < ( sqrt(pDoc->meshelem[i].rsqr) + rss) )
				{
					PlotFluxDensity(pDC,i,DensityPlot);
				}
			}
		}
	}

	// Draw grid if it is enabled...
	if (GridFlag==TRUE)
	{
		int skip;
		BOOL drawgrid=TRUE;
	
		ScreenToDwg((int) r.right, (int) r.top, &xd, &yd, &r);
		nx=(int) (floor(xd/GridSize) - ceil(ox/GridSize));
		ny=(int) (floor(yd/GridSize) - ceil(oy/GridSize));
		
		if (nx>0){
			if((r.right/nx)<2) drawgrid=FALSE;
		}

		if (drawgrid==FALSE){
			StatBar->SetPaneText(0,"Grid too dense to display.",TRUE);
		}
		else{
			skip=__min((nx/20)+1,(ny/20)+1);
			skip=(int) pow(2.,floor(log((double) skip)/log(2.)));
			for(i=0,xd=GridSize*ceil(ox/GridSize);i<=nx;i++,xd+=GridSize)
			{
				for(j=0,yd=GridSize*ceil(oy/GridSize);j<=ny;j++,yd+=GridSize)
				{
					if((i==skip*(i/skip)) || (j==skip*(j/skip)))
					{
						DwgToScreen(xd,yd,&xs,&ys,&r);
						pDC->SetPixel((int) xs, (int) ys, GridColor );
					}
				}
			}
		}
	}

	// Draw mesh if it is enabled...
	if (MeshFlag==TRUE)
	{
		int pi,po,OnBoundary;

		pOldPen = pDC->SelectObject( &penMesh );
		for(i=0;i<pDoc->meshelem.GetSize();i++)
		{
			if((pDoc->meshelem[i].lbl==DrawSelected) || (DrawSelected==-1)){
				
				OnBoundary=FALSE;
				for(j=0;j<3;j++)
					if ((pDoc->meshelem[i].n[j] & 0x80000000) != FALSE)
						OnBoundary=TRUE;
		
				for(j=0;j<3;j++)
				{
					k=j+1; if (k==3) k=0;
					pi=pDoc->meshelem[i].p[j];
					po=pDoc->meshelem[i].p[k];
				
					if((po>pi) || (OnBoundary==TRUE))
					{
						MyMoveTo(pDC,pDoc->meshnode[pi].xs,
							pDoc->meshnode[pi].ys);
						MyLineTo(pDC,pDoc->meshnode[po].xs,
							pDoc->meshnode[po].ys);
					}
				}
			}
		}
		pDC->SelectObject( pOldPen );
	}

	// Draw contour lines, if they are enabled.
	pOldPen = pDC->SelectObject( &penReal );
	if (ShowAr==TRUE)
		for(i=0;i<pDoc->meshelem.GetSize();i++){
			if((pDoc->meshelem[i].lbl==DrawSelected) || (DrawSelected==-1)){
				rt=sqrt( pow(xss-pDoc->meshelem[i].ctr.re,2.) +
					     pow(yss-pDoc->meshelem[i].ctr.im,2.) );
				if( rt < ( sqrt(pDoc->meshelem[i].rsqr) + rss) )
					for(j=0;j<3;j++)
						DoContours(pDC,pDoc->meshelem[i].p,j,0);
			}
		}

	pDC->SelectObject(&penImag);
	if (ShowAi==TRUE)
		for(i=0;i<pDoc->meshelem.GetSize();i++){
			if((pDoc->meshelem[i].lbl==DrawSelected) || (DrawSelected==-1)){
				rt=sqrt( pow(xss-pDoc->meshelem[i].ctr.re,2.) +
					     pow(yss-pDoc->meshelem[i].ctr.im,2.) );
				if( rt < ( sqrt(pDoc->meshelem[i].rsqr) + rss) )
					for(j=0;j<3;j++)
						DoContours(pDC,pDoc->meshelem[i].p,j,1);
			}
		}

	pDC->SelectObject(&penMask);
	if (ShowMask==TRUE)
		for(i=0;i<pDoc->meshelem.GetSize();i++){
			if((pDoc->meshelem[i].lbl==DrawSelected) || (DrawSelected==-1)){
				rt=sqrt( pow(xss-pDoc->meshelem[i].ctr.re,2.) +
					     pow(yss-pDoc->meshelem[i].ctr.im,2.) );
				if( rt < ( sqrt(pDoc->meshelem[i].rsqr) + rss) )
					for(j=0;j<3;j++)
						DoContours(pDC,pDoc->meshelem[i].p,j,2);
			}
		}

	pDC->SelectObject( pOldPen );

	// Draw lines linking nodes
	for(i=0;i<pDoc->linelist.GetSize();i++)
	if (pDoc->linelist[i].Hidden==FALSE){
		if(pDoc->linelist[i].IsSelected==FALSE)
			pOldPen = pDC->SelectObject( &penBlue );
		else pOldPen = pDC->SelectObject( &penRed );

		MyMoveTo(pDC,pDoc->nodelist[pDoc->linelist[i].n0].xs,
					pDoc->nodelist[pDoc->linelist[i].n0].ys);
		MyLineTo(pDC,pDoc->nodelist[pDoc->linelist[i].n1].xs,
					pDoc->nodelist[pDoc->linelist[i].n1].ys);
		
		pDC->SelectObject( pOldPen );
	}

	// Draw Arc Segments;
	for(i=0;i<pDoc->arclist.GetSize();i++)
	if (pDoc->arclist[i].Hidden==FALSE){
		if(pDoc->arclist[i].IsSelected==FALSE)
			pOldPen = pDC->SelectObject( &penBlue );
		else pOldPen = pDC->SelectObject( &penRed );
		k=(int) ceil(pDoc->arclist[i].ArcLength/pDoc->arclist[i].MaxSideLength);
		dt=pDoc->arclist[i].ArcLength*PI/(((double) k)*180.);

		pDoc->GetCircle(pDoc->arclist[i],c,R);
		p.Set(pDoc->nodelist[pDoc->arclist[i].n0].x,
			  pDoc->nodelist[pDoc->arclist[i].n0].y);
		DwgToScreen(p.re,p.im,&xs,&ys,&r);
		MyMoveTo(pDC,xs,ys);
		s=exp(I*dt);
		for(j=0;j<k;j++){
			p=(p-c)*s+c;
			DwgToScreen(p.re,p.im,&xs,&ys,&r);
			MyLineTo(pDC,xs,ys);
		}
		pDC->SelectObject( pOldPen );
	}

	// Draw node points
	if(PtsFlag==TRUE) for(i=0;i<pDoc->nodelist.GetSize();i++)
	{
		xs=pDoc->nodelist[i].xs;
		ys=pDoc->nodelist[i].ys;

		if(pDoc->nodelist[i].IsSelected==FALSE)
			pOldPen = pDC->SelectObject( &penNode );
		else pOldPen = pDC->SelectObject( &penRed );

		MyMoveTo(pDC,xs-2,ys-2);
		MyLineTo(pDC,xs-2,ys+2);
		MyLineTo(pDC,xs+2,ys+2);
		MyLineTo(pDC,xs+2,ys-2);
		MyLineTo(pDC,xs-2,ys-2);

		pDC->SelectObject( pOldPen );
	}

	// Draw vectors
	if ((VectorPlot>0) && (pDoc->nodelist.GetSize()>0))
	{
		CPointVals u;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -