📄 femmviewview.cpp
字号:
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 + -