www.pudn.com > buildct.zip > CHAIN.H, change:2004-02-25,size:8070b
#ifndef __FILECHAIN_H
#define __FILECHAIN_H
//#include <iostream.h>
#include <stdio.h>
#define NULL 0
#define MAX 2000L
#define BOUND2 1000
//提取轮廓线特征点
#define KEYLENGTH2 2500
#define KEYAREA2 250L
/*指示结点的状态
0:初始值
1:已连线
2:线头,(通常一入一出)
3:
-1:不必处理(行头或,可能处理过了)
*/
/*
typedef struct tagPoint1
{
int x;
int y;
}POINT;
*/
class LineChain;
class Chain;
class ChainNode
{
friend Chain ;
friend LineChain;
private:
POINT data;
/*指示该结点的状态
0:初始值
1:已连线
2:线头,(通常一入一出)
3:
-1:不必处理(行头或,可能处理过了)
*/
int tag;
//link指示行间链接(竖向),双向指针
ChainNode *link;
ChainNode *linkBack;
//横向
ChainNode *next;
//
public:
ChainNode(){data.x=0;data.y=0;link=NULL;linkBack=NULL;next=NULL;setTag(0);}
ChainNode(int x,int y){data.x=x;data.y=y;link=NULL;linkBack=NULL;next=NULL;setTag(0);}
~ChainNode(){};
int getX(){return data.x;}
int getY(){return data.y;}
void setXY(int x,int y)
{data.x=x;data.y=y;}
int getTag(){return tag;}
int setTag(int newTag)
{int oldtag=tag;tag=newTag;return oldtag;}
ChainNode *getLink(){return link;}
ChainNode *getBackLink(){return linkBack;}
int setLink(ChainNode *newlink)
{
if(newlink==NULL)
{
link=newlink;
return -1;
}
link=newlink;newlink->linkBack=this;
return 0;
}
ChainNode *getNext(){return next;}
//将node插到本结点为头的next链末尾,不考虑node的指针状态
int appendNode(ChainNode *node);
//将node插到本结点为头的link链后面,不考虑node的指针状态
int insertLinkAfter(ChainNode *node)
{
if(node==NULL)return -1;
ChainNode *p=this->link;
setLink(node);
node->setLink(p);
return 0;
}
//链接结点个数
int getLinkCount();
//链表结点个数,计算一行的结点数
int getNextCount();
long getDistance2(int x,int y)
{
long xx=getX()-x;
long yy=getY()-y;
return xx*xx+yy*yy;
}
//计算面积的2倍的绝对值
long getTwiceArea(ChainNode *b,ChainNode *c)
{
if(b==NULL ||c==NULL)return 0;
long xx1=b->getX()-getX();
long yy1=b->getY()-getY();
long xx2=c->getX()-getX();
long yy2=c->getY()-getY();
long area=yy1*xx2-xx1*yy2;
if(area<0)area=-area;
return area;
}
/*在轮廓线(link的封闭链)中查找最近点,若没有返回NULL*/
ChainNode *getNearestInLink(int x,int y, long &dist2);
};
class Chain
{
public:
Chain(){first=NULL;}
Chain(ChainNode *head)
{first=head;}
Chain(Chain *old)
{
if(old==NULL)first=NULL;
else
first=old->removeFirst();
}
void setFirst(ChainNode *head)
{
erase();
first=head;
}
~Chain();
int isEmpty()const{return first==0;}
//链接结点个数
int getLinkCount()
{
if(first==NULL)return 0;
return first->getLinkCount();
}
//链表结点个数,计算一行的结点数
int getNextCount()
{
if(first==NULL)return 0;
return first->getNextCount();
}
Chain &append(ChainNode *node);
ChainNode *getFirst(){return first;}
int linkNearestNodes(ChainNode *s,LineChain *lines);
//摘下first结点
ChainNode *removeFirst()
{ ChainNode *node=first;first=NULL;return node;}
ChainNode *getLast(void);
//释放所有结点所占内存,first=NULL
void erase(void);
//释放非LINKED的节点所占内存,以节省内存空间
void freeNotLinked();
//void Output(ostream &out)const;
void debugPrint(void);
void throwOutOfBounds()
{printf("throwOutOfBounds\n");}
private:
ChainNode *first;//指向第一个节点的指针
//私有方法
ChainNode *getPreHead(int y);
ChainNode *getTheHead(int y);
ChainNode *getNextHead(int y);
//ChainNode *getNearestNode(int x,int y,long &dist2);
//在整个链表中查找最近点
ChainNode *getNearestInChain(int x,int y, long &dist2);
//过滤相似行,减少处理量
// int postFiltering();
/* 选择逆时针方向的点 */
ChainNode *getClockWiseNearer(int x,int y, long &dist2);
};
/**
LineHeader: 轮廓线头结点
Perimeter为轮廓线的周长,用于启发式计算累加周长构建三角面片算法,周长在拓扑检查时计算。
*/
class LineHeader:public ChainNode
{
public:
CRect bound;
double perimeter;
LineHeader(){}
BOOL isContained(int x,int y)
{
POINT pp;
pp.x =x;
pp.y =y;
return bound.PtInRect (pp);
}
double getPerimeter()
{
return perimeter;//(bound.right-bound.left+bound.bottom-bound.top)*2;
}
};
class LineChain
{
public:
LineChain(){first=NULL;setLayerNo(0);}
LineChain(LineHeader *head)
{first=head;setLayerNo(0);}
LineChain(LineChain *old)
{
if(old==NULL)first=NULL;
else
first=old->removeFirst();
setLayerNo(0);
}
void setFirst(LineHeader *head)
{
erase();
first=head;
}
LineHeader *removeFirst()
{ LineHeader *node=first;first=NULL;return node;}
~LineChain()
{erase();}
int isEmpty()const{return first==0;}
//链接结点个数
int getCount()
{
if(first==NULL)return 0;
return first->getLinkCount();
}
//创建一个链,指向node
LineChain &append(ChainNode *node);
LineHeader *getFirst(){return first;}
LineHeader *getTheHead(int index);
ChainNode *getTheData(int index);
ChainNode *getLast(void);
void erase(void);
//void Output(ostream &out)const;
void debugPrint(void);
CString simplePrint();
void throwOutOfBounds()
{printf("throwOutOfBounds\n");}
int setLayerNo(int num)
{
int old=layerNum;
layerNum=num;
return old;
};
int getLayerNo()
{
return layerNum;
}
private:
LineHeader *first;//指向第一个节点的指针
int layerNum;
public:
//检查拓扑完整性
int checkTopo();
//int graphicsDebugPrint();
int graphicsDebugPrint(CBitmap *pBmp);
//提取轮廓线上的特征点
ChainNode *getNearKeyNode(ChainNode *node,ChainNode *start);
ChainNode *getFittestLine(ChainNode *line);
};
class Triangle;
class TriangleFacet
{
friend Triangle;
private:
int x1,y1,z1,x2,y2,z2,x3,y3,z3;
TriangleFacet *next;
public:
TriangleFacet(int px1,int py1,int pz1,int px2,int py2,int pz2,int px3,int py3,int pz3)
{
x1=px1;
y1=py1;
z1=pz1;
x2=px2;
y2=py2;
z2=pz2;
x3=px3;
y3=py3;
z3=pz3;
next=NULL;
}
~TriangleFacet(){}
};
class Triangle
{
public:
bool drawFacet(TriangleFacet * facet,CDC *pdc,int type);
bool isAvailable();
void setAvailable(bool avail);
Triangle(){first=NULL;setAvailable(false);}
Triangle(TriangleFacet *head)
{first=head;setAvailable(false);}
//将node插到本结点为头的next链末尾,不考虑node的指针状态
int appendFacet(TriangleFacet *face);
int appendFacet(int x1,int y1,int z1,int x2,int y2,int z2,int x3,int y3,int z3)
{
return appendFacet(new TriangleFacet(x1,y1,z1*3,x2,y2,z2*3,x3,y3,z3*3));
//return appendFacet(new TriangleFacet(x1,y1,z1*10,x2,y2,z2*10,x3,y3,z3*10));
// return appendFacet(new TriangleFacet(x1,y1,z1,x2,y2,z2,x3,y3,z3));
//printf("<%d,%d,%d %d,%d,%d %d,%d,%d>\n",x1,y1,z1,x2,y2,z2,x3,y3,z3);
//return 0;
}
~Triangle();
void debugPrint();
void printToFile(char *outname);
CString simplePrint();
int graphicsDebugPrint(CBitmap *pBmp,int type);
private:
bool available;
TriangleFacet *first;//指向第一个节点的指针
};
//extern int graphicsBufferPrint(unsigned char data[][IMAGEW/8]);
#endif