cogoutput.cxx
来自「有限元学习研究用源代码(老外的),供科研人员参考」· CXX 代码 · 共 244 行
CXX
244 行
//#include <iostream.h>
#include "wzoutput.hxx"
#include <math.h>
#include <stdio.h>
extern "C"{
#include <GL/gl.h>
#include "glrender.h"
}
#include "cogoutput.hxx"
static cogeometry geom;
void cogRendererCallback(iglRenderer rnd, void *data);
void DrawTriangle(double *p1, double *p2, double *p3)
{
const int on12=0,non12=3,non23=4,non13=5,n123=6,nno=7;
int face;
wzColor col;
cogPoint x1(p1[0],p1[1],p1[2]);
cogPoint x2(p2[0],p2[1],p2[2]);
cogPoint x3(p3[0],p3[1],p3[2]);
cogPoint c1,c2,c3,c0,co,mm;
cogIndex rc;
cogFlag1 f1(c1,c0,co),f2(c2,c0,co),f3(c3,c0,co);
geom->Point(x1); geom->Point(x2); geom->Point(x3);
face = nno;
if(x1.segment() != x2.segment()){
face= on12;
rc=geom->Line(f3,cogLine(x1,x2));
if(rc!=cogRCFaceFound) wzOutput::Default<<"not found\n";
}
if(x1.segment() != x3.segment()){
if(face==on12) {
if (x2.segment() == x3.segment()) face = non23;
else face = n123;
}else face=non12;
rc = geom->Line(f2,cogLine(x1,x3));
if(rc!=cogRCFaceFound) wzOutput::Default<<"not found\n";
}
if(x2.segment() != x3.segment()){
if(face==on12) face=non13;
rc=geom->Line(f1,cogLine(x3,x2));
if(rc!=cogRCFaceFound) wzOutput::Default<<"not found\n";
}
switch (face){
case non13:
col=x1.segment().region().color();
glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0);
glVertex3f(p3[0],p3[1],p3[2]);
glVertex3f(p1[0],p1[1],p1[2]);
glVertex3f(c3[0],c3[1],c3[2]);
col=x1.segment().region().color();
glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0);
glVertex3f(c3[0],c3[1],c3[2]);
glVertex3f(c1[0],c1[1],c1[2]);
glVertex3f(p3[0],p3[1],p3[2]);
col=x2.segment().region().color();
glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0);
glVertex3f(c1[0],c1[1],c1[2]);
glVertex3f(c3[0],c3[1],c3[2]);
glVertex3f(p2[0],p2[1],p2[2]);
break;
case non23:
col=x2.segment().region().color();
glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0);
glVertex3f(p2[0],p2[1],p2[2]);
glVertex3f(p3[0],p3[1],p3[2]);
glVertex3f(c2[0],c2[1],c2[2]);
col=x2.segment().region().color();
glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0);
glVertex3f(c2[0],c2[1],c2[2]);
glVertex3f(c3[0],c3[1],c3[2]);
glVertex3f(p2[0],p2[1],p2[2]);
col=x1.segment().region().color();
glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0);
glVertex3f(c3[0],c3[1],c3[2]);
glVertex3f(c2[0],c2[1],c2[2]);
glVertex3f(p1[0],p1[1],p1[2]);
break;
case non12:
col=x1.segment().region().color();
glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0);
glVertex3f(p1[0],p1[1],p1[2]);
glVertex3f(p2[0],p2[1],p2[2]);
glVertex3f(c1[0],c1[1],c1[2]);
col=x1.segment().region().color();
glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0);
glVertex3f(c1[0],c1[1],c1[2]);
glVertex3f(c2[0],c2[1],c2[2]);
glVertex3f(p1[0],p1[1],p1[2]);
col=x3.segment().region().color();
glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0);
glVertex3f(c2[0],c2[1],c2[2]);
glVertex3f(c1[0],c1[1],c1[2]);
glVertex3f(p3[0],p3[1],p3[2]);
break;
case n123:
mm[0] = (c1[0]+c2[0]+c3[0])/3;
mm[1] = (c1[1]+c2[1]+c3[1])/3;
mm[2] = (c1[2]+c2[2]+c3[2])/3;
col=x1.segment().region().color();
glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0);
glVertex3f(p1[0],p1[1],p1[2]);
glVertex3f(c3[0],c3[1],c3[2]);
glVertex3f(c2[0],c2[1],c2[2]);
glVertex3f(mm[0],mm[1],mm[2]);
glVertex3f(c2[0],c2[1],c2[2]);
glVertex3f(c3[0],c3[1],c3[2]);
col=x2.segment().region().color();
glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0);
glVertex3f(p2[0],p2[1],p2[2]);
glVertex3f(c1[0],c1[1],c1[2]);
glVertex3f(c3[0],c3[1],c3[2]);
glVertex3f(mm[0],mm[1],mm[2]);
glVertex3f(c3[0],c3[1],c3[2]);
glVertex3f(c1[0],c1[1],c1[2]);
col=x3.segment().region().color();
glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0);
glVertex3f(p3[0],p3[1],p3[2]);
glVertex3f(c2[0],c2[1],c2[2]);
glVertex3f(c1[0],c1[1],c1[2]);
glVertex3f(mm[0],mm[1],mm[2]);
glVertex3f(c1[0],c1[1],c1[2]);
glVertex3f(c2[0],c2[1],c2[2]);
break;
default:
col=x1.segment().region().color();
glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0);
glVertex3f(p1[0],p1[1],p1[2]);
glVertex3f(p2[0],p2[1],p2[2]);
glVertex3f(p3[0],p3[1],p3[2]);
break;
}
}
void cogRendererCallback(iglRenderer rnd, void *data)
{double a[3],aa,x1[3],x2[3],x3[3],x4[3],xm[3],xp[3],b,c,d,f[3];
int n,dy,dz,dir,hold,triang;
geom = *(cogeometry *) &data;
glBegin(GL_TRIANGLES);
iglrGetVolume(rnd,&xm[0],&xp[0],&xm[1],&xp[1],&xm[2],&xp[2]);
iglrGetPlane(rnd,&a[0],&a[1],&a[2],&d);
iglrGetDrawLevel(rnd,&hold,&triang);
n = (int) (sqrt((double)triang)/2); if(n<=2) n=2;
if (a[0]>0.5) {dir=0;dy=1;dz=2;aa=a[0];}
else if (a[1]>0.5) {dir=1;dy=0;dz=2;aa=a[1];}
else {dir=2;dy=0;dz=1;aa=a[2];}
f[dy]= (xp[dy]-xm[dy])/n; // h[dy]=f[dy]/2;
f[dz]= (xp[dz]-xm[dz])/n; // h[dz]=f[dz]/2;
b=a[dy]; c=a[dz]; aa *= xp[dir]-xm[dir];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
x1[dy]=xm[dy]+f[dy]*i; x1[dz]=xm[dz]+f[dz]*j;
x2[dy]=xm[dy]+f[dy]*(i+1); x2[dz]=xm[dz]+f[dz]*j;
x3[dy]=xm[dy]+f[dy]*i; x3[dz]=xm[dz]+f[dz]*(j+1);
x4[dy]=xm[dy]+f[dy]*(i+1); x4[dz]=xm[dz]+f[dz]*(j+1);
x1[dir]=-(d+b*x1[dy]+c*x1[dz]);
x2[dir]=-(d+b*x2[dy]+c*x2[dz]);
x3[dir]=-(d+b*x3[dy]+c*x3[dz]);
x4[dir]=-(d+b*x4[dy]+c*x4[dz]);
DrawTriangle(x1,x2,x3);
DrawTriangle(x3,x2,x4);
}
glEnd();
geom = 0;
}
void cogToGL(cogeometry g)
{
cogView.add(g,"test","test");
cogView.show();
cogView.reset();
}
void cogToGL(cogeometry g, cogeometry g1)
{
cogView.add(g,"test","test");
cogView.add(g1,"test","test");
cogView.show();
cogView.reset();
}
void cogToGL(cogeometry g, cogeometry g1, cogeometry g2)
{
cogView.add(g,"test","test");
cogView.add(g1,"test","test");
cogView.add(g2,"test","test");
cogView.show();
cogView.reset();
}
void cogToGL(cogeometry g, cogeometry g1, cogeometry g2, cogeometry g3)
{
cogView.add(g,"test","test");
cogView.add(g1,"test","test");
cogView.add(g2,"test","test");
cogView.add(g3,"test","test");
cogView.show();
cogView.reset();
}
/*{
iglRenderer rnd;
rnd=iglrCreate(title,"","",0,0,500,500);
iglrDefineObject(rnd,1,
'g',"geometry","shows the geometry","geometry.html",
(iglrDrawCallback)cogRendererCallback,*(void**)&g);
iglrender(rnd);
iglrDestroy(rnd);
}*/
cogGLViewer::cogGLViewer(char* title)
{
rnd= (void*) iglrCreate(title,"","",0,0,500,500);
i=1;
}
void cogGLViewer::add(cogeometry g, char* name, char* title)
{
char s[256];
sprintf(s,"%s.html",name);
iglrDefineObject((iglRenderer)rnd,i,
name[0],name,title,s,
(iglrCallback)cogRendererCallback,*(void**)&g);
i++;
}
void cogGLViewer::show()
{
iglrSetDataValid((iglRenderer)rnd,0 );
iglrender((iglRenderer)rnd);
}
void cogGLViewer::reset()
{
i=1;
}
cogGLViewer::~cogGLViewer()
{
iglrDestroy((iglRenderer) rnd);
}
cogViewer& cogView(* new cogGLViewer());
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?