新手请教:根据数据,使用opengl画三维实体 现有一系列空间点矩阵,各点形式为(x,y,z,w),x,y,z为空间坐标,w为此点权重。现想把这些点在空间组成的三维图形绘出,并根据w取不同的颜色。请各位指路,谢谢,分不够可再加 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 // DelaunayTIN.cpp: implementation of the CDelaunayTIN class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "Reconstruction.h"#include "DelaunayTIN.h"#include "MyMath.h"#include <math.h>#include "ListControl.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CDelaunayTIN::CDelaunayTIN(){}CDelaunayTIN::~CDelaunayTIN(){}///////////////////////////////////////////////////////////////////////////////函数名: CreateDelaunayTIN//编写者: Polaris//参考资料://功能: 用给定的数据链表数据,组建Delaunay不规则三角网//输入参数:数据链表list;区域范围(XMin,YMin),(XMax,YMax)//输出参数:不规则三角网首三角形地址//备注: /////////////////////////////////////////////////////////////////////////////struct Triangle * CDelaunayTIN::CreateDelaunayTIN(List *list){ //组建第一个三角形 CMyMath MyMath; CListControl ListControl; struct List *node; struct Pixel *pt1,*pt2,*pt3; bool flag; struct Triangle *TIN; pt1=list->pixel; pt2=list->next->pixel; node=list->next->next; while(node!=NULL) { if(MyMath.Calculate2PtDistanceIn3D (pt1->x,pt1->y,pt1->z,node->pixel->x,node->pixel->y,node->pixel->z) <MyMath.Calculate2PtDistanceIn3D (pt1->x,pt1->y,pt1->z,pt2->x,pt2->y,pt2->z)) { pt2=node->pixel; } node=node->next; } node=list->next; pt3=NULL; while(node!=NULL) { if(node->pixel==pt1 || node->pixel==pt2) { node=node->next; continue; } if(pt3==NULL) { pt3=node->pixel; } else { if((pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,node->pixel->x,node->pixel->y),2)+pow(MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,node->pixel->x,node->pixel->y),2)-pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt2->x,pt2->y),2))/(2*MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,node->pixel->x,node->pixel->y)*MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,node->pixel->x,node->pixel->y)) <(pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt3->x,pt3->y),2)+pow(MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,pt3->x,pt3->y),2)-pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt2->x,pt2->y),2))/(2*MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt3->x,pt3->y)*MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,pt3->x,pt3->y))) { pt3=node->pixel; } } node=node->next; } //LineList Linelist *linehead,*linenode,*linelast; Line *ln1,*ln2,*ln3; linenode=new Linelist; linenode->line=new Line; linenode->line->pixel1=pt1; linenode->line->pixel2=pt2; linenode->line->pixel3=pt3; linenode->line->flag=false; linenode->next=NULL; linehead=linelast=linenode; ln1=linenode->line; linenode=new Linelist; linenode->line=new Line; linenode->line->pixel1=pt2; linenode->line->pixel2=pt3; linenode->line->pixel3=pt1; linenode->line->flag=false; linenode->next=NULL; linelast->next=linenode; linelast=linenode; ln2=linenode->line; linenode=new Linelist; linenode->line=new Line; linenode->line->pixel1=pt3; linenode->line->pixel2=pt1; linenode->line->pixel3=pt2; linenode->line->flag=false; linenode->next=NULL; linelast->next=linenode; linelast=linenode; ln3=linenode->line; //first Triangle Triangle *tglhead,*tglnode,*tgllast; tglnode=new Triangle; tglnode->line1=ln1; tglnode->line2=ln2; tglnode->line3=ln3; tglnode->next=NULL; tglhead=tgllast=tglnode; /*//test TIN=tglhead; TINCreateOK=true; PostMessage(WM_PAINT); AfxMessageBox("ok"); //test end*/ //expend tin; Linelist *linetmp,*linetemp; List *pixeltmp; double x1,y1,x2,y2,x3,y3; linetmp=linehead; while(linetmp!=NULL) { if(linetmp->line->flag==true) { linetmp=linetmp->next; continue; } ln1=linetmp->line; pt1=linetmp->line->pixel1; pt2=linetmp->line->pixel2; x1=linetmp->line->pixel1->x; y1=linetmp->line->pixel1->y; x2=linetmp->line->pixel2->x; y2=linetmp->line->pixel2->y; x3=linetmp->line->pixel3->x; y3=linetmp->line->pixel3->y; pixeltmp=list; pt3=NULL; while(pixeltmp!=NULL) { if(pixeltmp->pixel==pt1 || pixeltmp->pixel==pt2) { pixeltmp=pixeltmp->next; continue; } if(((y2-y1)*pixeltmp->pixel->x+(x1-x2)*pixeltmp->pixel->y+(x2*y1-x1*y2)) *((y2-y1)*x3+(x1-x2)*y3+(x2*y1-x1*y2))>=0) { pixeltmp=pixeltmp->next; continue; } if(pt3==NULL)pt3=pixeltmp->pixel; else { if((pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pixeltmp->pixel->x,pixeltmp->pixel->y),2)+pow(MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,pixeltmp->pixel->x,pixeltmp->pixel->y),2)-pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt2->x,pt2->y),2))/(2*MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pixeltmp->pixel->x,pixeltmp->pixel->y)*MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,pixeltmp->pixel->x,pixeltmp->pixel->y)) <(pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt3->x,pt3->y),2)+pow(MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,pt3->x,pt3->y),2)-pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt2->x,pt2->y),2))/(2*MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt3->x,pt3->y)*MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,pt3->x,pt3->y))) { pt3=pixeltmp->pixel; } } pixeltmp=pixeltmp->next; } if(pt3!=NULL) { linetemp=linehead; flag=false; while(linetemp!=NULL) { if((pt1==linetemp->line->pixel1 && pt3==linetemp->line->pixel2) || (pt3==linetemp->line->pixel1 && pt1==linetemp->line->pixel2)) { linetemp->line->flag=true; flag=true; break; } linetemp=linetemp->next; } if(!flag) { linenode=new Linelist; linenode->line=new Line; linenode->line->pixel1=pt3; linenode->line->pixel2=pt1; linenode->line->pixel3=pt2; linenode->line->flag=false; linenode->next=NULL; linelast->next=linenode; linelast=linenode; ln2=linenode->line; } linetemp=linehead; flag=false; while(linetemp!=NULL) { if((pt2==linetemp->line->pixel1 && pt3==linetemp->line->pixel2) || (pt3==linetemp->line->pixel1 && pt2==linetemp->line->pixel2)) { linetemp->line->flag=true; flag=true; break; } linetemp=linetemp->next; } if(!flag) { linenode=new Linelist; linenode->line=new Line; linenode->line->pixel1=pt2; linenode->line->pixel2=pt3; linenode->line->pixel3=pt1; linenode->line->flag=false; linenode->next=NULL; linelast->next=linenode; linelast=linenode; ln3=linenode->line; } tglnode=new Triangle; tglnode->line1=ln1; tglnode->line2=ln2; tglnode->line3=ln3; tglnode->next=NULL; tgllast->next=tglnode; tgllast=tglnode; /*//test TIN=tglhead; TINCreateOK=true; PostMessage(WM_PAINT); AfxMessageBox("ok"); //test end*/ } linetmp->line->flag=true; linetmp=linetmp->next; } TIN=tglhead; return TIN;} VC文件夹浏览问题-SHBrowseForFolder函数问题 改版以后回复和发帖都慢得要死。 用webkit内核自己做浏览器 如何得到控件对应的类的实例? 庆祝升到5星,散分200 VC中,怎么样能得到一个只有DLL的COM组件的 CLSID? 如何在程序中嵌入IE控件及其工具栏? 请问如何用CFile读入一个html页,并将里面的所有<input name=XXX >中的XXX存入CString型数组中?谢谢! 如何让父窗口来处理子窗口的消息 把一个字符串每个字符都转成十六进数后组成新的字符串 OpenGL生成太阳光晕的问题 请问:CTabCtrl的Items之间怎么会且换不了呀
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "Reconstruction.h"
#include "DelaunayTIN.h"#include "MyMath.h"
#include <math.h>
#include "ListControl.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CDelaunayTIN::CDelaunayTIN()
{}CDelaunayTIN::~CDelaunayTIN()
{}/////////////////////////////////////////////////////////////////////////////
//函数名: CreateDelaunayTIN
//编写者: Polaris
//参考资料:
//功能: 用给定的数据链表数据,组建Delaunay不规则三角网
//输入参数:数据链表list;区域范围(XMin,YMin),(XMax,YMax)
//输出参数:不规则三角网首三角形地址
//备注:
/////////////////////////////////////////////////////////////////////////////
struct Triangle * CDelaunayTIN::CreateDelaunayTIN(List *list)
{
//组建第一个三角形
CMyMath MyMath;
CListControl ListControl;
struct List *node;
struct Pixel *pt1,*pt2,*pt3;
bool flag;
struct Triangle *TIN;
pt1=list->pixel;
pt2=list->next->pixel;
node=list->next->next;
while(node!=NULL)
{
if(MyMath.Calculate2PtDistanceIn3D
(pt1->x,pt1->y,pt1->z,node->pixel->x,node->pixel->y,node->pixel->z)
<MyMath.Calculate2PtDistanceIn3D
(pt1->x,pt1->y,pt1->z,pt2->x,pt2->y,pt2->z))
{
pt2=node->pixel;
}
node=node->next;
}
node=list->next;
pt3=NULL;
while(node!=NULL)
{
if(node->pixel==pt1 || node->pixel==pt2)
{
node=node->next;
continue;
}
if(pt3==NULL)
{
pt3=node->pixel;
}
else
{
if((pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,node->pixel->x,node->pixel->y),2)+pow(MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,node->pixel->x,node->pixel->y),2)-pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt2->x,pt2->y),2))/(2*MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,node->pixel->x,node->pixel->y)*MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,node->pixel->x,node->pixel->y))
<(pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt3->x,pt3->y),2)+pow(MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,pt3->x,pt3->y),2)-pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt2->x,pt2->y),2))/(2*MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt3->x,pt3->y)*MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,pt3->x,pt3->y)))
{
pt3=node->pixel;
}
}
node=node->next;
}
//LineList
Linelist *linehead,*linenode,*linelast;
Line *ln1,*ln2,*ln3;
linenode=new Linelist;
linenode->line=new Line;
linenode->line->pixel1=pt1;
linenode->line->pixel2=pt2;
linenode->line->pixel3=pt3;
linenode->line->flag=false;
linenode->next=NULL;
linehead=linelast=linenode;
ln1=linenode->line;
linenode=new Linelist;
linenode->line=new Line;
linenode->line->pixel1=pt2;
linenode->line->pixel2=pt3;
linenode->line->pixel3=pt1;
linenode->line->flag=false;
linenode->next=NULL;
linelast->next=linenode;
linelast=linenode;
ln2=linenode->line;
linenode=new Linelist;
linenode->line=new Line;
linenode->line->pixel1=pt3;
linenode->line->pixel2=pt1;
linenode->line->pixel3=pt2;
linenode->line->flag=false;
linenode->next=NULL;
linelast->next=linenode;
linelast=linenode;
ln3=linenode->line;
//first Triangle
Triangle *tglhead,*tglnode,*tgllast;
tglnode=new Triangle;
tglnode->line1=ln1;
tglnode->line2=ln2;
tglnode->line3=ln3;
tglnode->next=NULL;
tglhead=tgllast=tglnode; /*//test
TIN=tglhead;
TINCreateOK=true;
PostMessage(WM_PAINT);
AfxMessageBox("ok");
//test end*/ //expend tin;
Linelist *linetmp,*linetemp;
List *pixeltmp;
double x1,y1,x2,y2,x3,y3;
linetmp=linehead;
while(linetmp!=NULL)
{
if(linetmp->line->flag==true)
{
linetmp=linetmp->next;
continue;
}
ln1=linetmp->line;
pt1=linetmp->line->pixel1;
pt2=linetmp->line->pixel2;
x1=linetmp->line->pixel1->x;
y1=linetmp->line->pixel1->y;
x2=linetmp->line->pixel2->x;
y2=linetmp->line->pixel2->y;
x3=linetmp->line->pixel3->x;
y3=linetmp->line->pixel3->y; pixeltmp=list;
pt3=NULL;
while(pixeltmp!=NULL)
{
if(pixeltmp->pixel==pt1 || pixeltmp->pixel==pt2)
{
pixeltmp=pixeltmp->next;
continue;
}
if(((y2-y1)*pixeltmp->pixel->x+(x1-x2)*pixeltmp->pixel->y+(x2*y1-x1*y2))
*((y2-y1)*x3+(x1-x2)*y3+(x2*y1-x1*y2))>=0)
{
pixeltmp=pixeltmp->next;
continue;
}
if(pt3==NULL)pt3=pixeltmp->pixel;
else
{
if((pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pixeltmp->pixel->x,pixeltmp->pixel->y),2)+pow(MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,pixeltmp->pixel->x,pixeltmp->pixel->y),2)-pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt2->x,pt2->y),2))/(2*MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pixeltmp->pixel->x,pixeltmp->pixel->y)*MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,pixeltmp->pixel->x,pixeltmp->pixel->y))
<(pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt3->x,pt3->y),2)+pow(MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,pt3->x,pt3->y),2)-pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt2->x,pt2->y),2))/(2*MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt3->x,pt3->y)*MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,pt3->x,pt3->y)))
{
pt3=pixeltmp->pixel;
}
}
pixeltmp=pixeltmp->next;
}
if(pt3!=NULL)
{
linetemp=linehead;
flag=false;
while(linetemp!=NULL)
{
if((pt1==linetemp->line->pixel1 && pt3==linetemp->line->pixel2)
|| (pt3==linetemp->line->pixel1 && pt1==linetemp->line->pixel2))
{
linetemp->line->flag=true;
flag=true;
break;
}
linetemp=linetemp->next;
}
if(!flag)
{
linenode=new Linelist;
linenode->line=new Line;
linenode->line->pixel1=pt3;
linenode->line->pixel2=pt1;
linenode->line->pixel3=pt2;
linenode->line->flag=false;
linenode->next=NULL;
linelast->next=linenode;
linelast=linenode;
ln2=linenode->line;
}
linetemp=linehead;
flag=false;
while(linetemp!=NULL)
{
if((pt2==linetemp->line->pixel1 && pt3==linetemp->line->pixel2)
|| (pt3==linetemp->line->pixel1 && pt2==linetemp->line->pixel2))
{
linetemp->line->flag=true;
flag=true;
break;
}
linetemp=linetemp->next;
}
if(!flag)
{
linenode=new Linelist;
linenode->line=new Line;
linenode->line->pixel1=pt2;
linenode->line->pixel2=pt3;
linenode->line->pixel3=pt1;
linenode->line->flag=false;
linenode->next=NULL;
linelast->next=linenode;
linelast=linenode;
ln3=linenode->line;
}
tglnode=new Triangle;
tglnode->line1=ln1;
tglnode->line2=ln2;
tglnode->line3=ln3;
tglnode->next=NULL;
tgllast->next=tglnode;
tgllast=tglnode; /*//test
TIN=tglhead;
TINCreateOK=true;
PostMessage(WM_PAINT);
AfxMessageBox("ok");
//test end*/
}
linetmp->line->flag=true;
linetmp=linetmp->next;
}
TIN=tglhead;
return TIN;
}