现有一系列空间点矩阵,各点形式为(x,y,z,w),x,y,z为空间坐标,w为此点权重。现想把这些点在空间组成的三维图形绘出,并根据w取不同的颜色。请各位指路,谢谢,分不够可再加

解决方案 »

  1.   

    // 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_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;
    }