You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
5.0 KiB
240 lines
5.0 KiB
10 months ago
|
#include "stdafx.h"
|
||
|
#include "KDtree.h"
|
||
|
#include<cmath>
|
||
|
#include<vector>
|
||
|
#include<queue>
|
||
|
#include<map>
|
||
|
#include<iostream>
|
||
|
#include<fstream>
|
||
|
#include<sstream>
|
||
|
using namespace std;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//������Ϣ
|
||
|
struct Clip{
|
||
|
string name; //����
|
||
|
P coord,dir; //�����ͷ���,dir�ķ�����Ϊ����
|
||
|
int emc; //��������,δȷ��Ϊ0
|
||
|
double dia; //ͨ��������������ֱ��
|
||
|
double maxDia; //��������ͨ��������������ֱ��
|
||
|
int id; //��������
|
||
|
int bundleNodeID; //������ʱ�����ĸ�Bundle
|
||
|
vector<double> diaset; //�Ѿ�ͨ�����������°뾶����
|
||
|
vector<int> channelEdge; //�ڽ���ͨ�������ӵ��Ŀ�������
|
||
|
bool used; //�����Ƿ���ʹ��
|
||
|
|
||
|
Clip(){
|
||
|
emc=0;bundleNodeID=0;
|
||
|
maxDia=MAXDia;id=0;
|
||
|
used=0;
|
||
|
}
|
||
|
|
||
|
//��������ͨ���������ߺ�ͨ����Ϣ
|
||
|
void clear(){
|
||
|
diaset.clear();
|
||
|
bundleNodeID=0;
|
||
|
used=0;
|
||
|
}
|
||
|
|
||
|
//�ڿ���������ֱ��Ϊd������
|
||
|
inline void addwire(double d){
|
||
|
diaset.push_back(d);
|
||
|
dia=sqrt(dia*dia+d*d);
|
||
|
|
||
|
}
|
||
|
|
||
|
//����ͨ��������������ֱ��
|
||
|
inline double getDia(){
|
||
|
double dia1=1.154*dia;
|
||
|
if(dia1>=10)dia1*=1.235/1.154;
|
||
|
return dia1;
|
||
|
}
|
||
|
|
||
|
//�ж�ֱ��Ϊd�������ܷ�ͨ��
|
||
|
inline bool transitable(double d){
|
||
|
double dia1=sqrt(d*d+dia*dia);
|
||
|
dia1=1.154*dia;
|
||
|
if(dia1>=10)dia1*=1.235/1.154;
|
||
|
|
||
|
if(dia1<=maxDia)return true;
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
//�жϴ�p�㵽������Ӧ�ô���һ�����룬����Ϊ0������Ϊ1
|
||
|
inline int inDir(P p){
|
||
|
double angle=Angle(coord-p,dir);
|
||
|
if(angle>pi/2)return 1;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
//���������������еĿ�����Ϣ
|
||
|
struct ClipSet{
|
||
|
Clip c[N]; //�������ϣ��±���1~clipnum
|
||
|
int clipnum; //�����ܺ�,�������ŷ�Χ1`clipnum
|
||
|
map<P,int>clipid; //���ݵ������ҵ���������
|
||
|
|
||
|
|
||
|
ClipSet(){
|
||
|
clipnum=0;
|
||
|
}
|
||
|
|
||
|
//����ͨ��������������Ϣ
|
||
|
void clearWire(){
|
||
|
for(int i=1;i<=clipnum;i++)c[i].clear();
|
||
|
}
|
||
|
|
||
|
//�¼���һ������
|
||
|
inline void addclip(P p,P d,string name,int emc){
|
||
|
clipnum++;
|
||
|
c[clipnum].coord=p;
|
||
|
c[clipnum].coord.ref=clipnum;
|
||
|
c[clipnum].coord.type=0;
|
||
|
c[clipnum].coord.setDir(p-d);
|
||
|
|
||
|
c[clipnum].id=clipnum;
|
||
|
c[clipnum].dir=p-d;
|
||
|
c[clipnum].name=name;
|
||
|
c[clipnum].emc=emc;
|
||
|
clipid[p]=clipnum;
|
||
|
}
|
||
|
|
||
|
//����ͨ�������ĵ���
|
||
|
inline void addwire(int id,double d){
|
||
|
c[id].addwire(d);
|
||
|
}
|
||
|
inline void addwire(P & p,double d){
|
||
|
int id=clipid[p];
|
||
|
c[id].addwire(d);
|
||
|
}
|
||
|
|
||
|
//��ȡָ������Ϊid�Ŀ�����ָ��
|
||
|
Clip * getClipPointer(int id,int bundleNodeID){
|
||
|
if(bundleNodeID!=-1)c[id].bundleNodeID=bundleNodeID;
|
||
|
return &c[id];
|
||
|
}
|
||
|
|
||
|
//�ж����������Ƿ�����Ϊ����(��֪i�����Ŀ�����j)
|
||
|
inline bool bothConnect(int i,int j){
|
||
|
if(c[j].channelEdge.empty())return false;
|
||
|
if(c[j].channelEdge[0]==i)return true;
|
||
|
if(c[j].channelEdge.size()==2&&
|
||
|
c[j].channelEdge[1]==i)return true;
|
||
|
return false;
|
||
|
|
||
|
}
|
||
|
|
||
|
//�жϿ����ܷ�ͨ��
|
||
|
inline bool transitable(int id,int emc,double d){
|
||
|
if(c[id].emc!=emc)return false;
|
||
|
return c[id].transitable(d);
|
||
|
}
|
||
|
|
||
|
//���ݿ���λ�ù��Ʒɻ��Ľ���������
|
||
|
inline void computeCenter(){
|
||
|
Ycenter=0;Zcenter=0;
|
||
|
for(int i=1;i<=clipnum;i++){
|
||
|
Clip clip=c[i];
|
||
|
P tp=c[i].coord;
|
||
|
Ycenter+=tp.y;
|
||
|
Zcenter+=tp.z;
|
||
|
MAXX=max(MAXX,tp.x);
|
||
|
MINX=min(MINX,tp.x);
|
||
|
|
||
|
MAXY=max(MAXY,tp.y);
|
||
|
MINY=min(MINY,tp.y);
|
||
|
|
||
|
MAXZ=max(MAXZ,tp.z);
|
||
|
MINZ=min(MINZ,tp.z);
|
||
|
}
|
||
|
Ycenter/=clipnum;
|
||
|
Zcenter/=clipnum;
|
||
|
|
||
|
}
|
||
|
|
||
|
//��ӡ�����������������ߵľ���
|
||
|
inline void printDis(){
|
||
|
for(int i=1;i<=clipnum;i++){
|
||
|
Clip clip=c[i];
|
||
|
P tp=c[i].coord;
|
||
|
double dis=(Ycenter-tp.y)*(Ycenter-tp.y)+(Zcenter-tp.z)*(Zcenter-tp.z);
|
||
|
cout<<sqrt(dis)<<endl;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//���ݿ���λ���ȴ���һ�����Ƶ�ͨ����ÿ����������������������������
|
||
|
inline void buildChannel(){
|
||
|
vector<int> pointSet;
|
||
|
bool flag=false; //flag=trueʱ��������������Ҫ���¼���
|
||
|
double sumDis=300;
|
||
|
int sum=1;
|
||
|
for(int i=1;i<=clipnum;i++){
|
||
|
if(pointSet.empty()||flag){
|
||
|
pointSet=kdtree.search_by_dis(c[i].coord,segmentLength);
|
||
|
c[i].channelEdge.clear();
|
||
|
|
||
|
}
|
||
|
vector<pair<double,int> > vp;
|
||
|
for(int j=0;j<pointSet.size();j++){
|
||
|
int cid=pointSet[j];
|
||
|
if(cid==i)continue;
|
||
|
if(c[i].coord==c[cid].coord)continue;
|
||
|
double dis=distan(c[i].coord,c[cid].coord);
|
||
|
vp.push_back(make_pair(dis,cid));
|
||
|
|
||
|
}
|
||
|
sort(vp.begin(),vp.end());
|
||
|
P dir;
|
||
|
for(int j=0;j<vp.size();j++){
|
||
|
int cid=vp[j].second;
|
||
|
if(vp[j].first>2*sumDis/sum)break;
|
||
|
if(j==0){
|
||
|
c[i].channelEdge.push_back(cid);
|
||
|
dir=c[cid].coord-c[i].coord;
|
||
|
sum++;
|
||
|
sumDis+=vp[j].first;
|
||
|
}
|
||
|
else {
|
||
|
P dir2=c[cid].coord-c[i].coord;
|
||
|
if(Angle(dir,dir2)>=pi/2-minAngle){
|
||
|
c[i].channelEdge.push_back(cid);
|
||
|
sum++;
|
||
|
sumDis+=vp[j].first;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if(c[i].channelEdge.size()<2&&!flag)flag=true,i--;
|
||
|
else flag=false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//��ӡ���п�����Ϣ��clipDir�ļ��������������������Ͽ�������
|
||
|
/*
|
||
|
0��������
|
||
|
1������ֱ��
|
||
|
2������������
|
||
|
*/
|
||
|
inline void print(){
|
||
|
ofstream ofs;
|
||
|
ofs.open("clipDir.txt", ios::out);
|
||
|
for(int i=1;i<=clipnum;i++){
|
||
|
Clip clip=c[i];
|
||
|
P tp=c[i].coord;
|
||
|
P dirtp=c[i].dir;
|
||
|
ofs<<tp.x<<" "<<tp.y<<" "<<tp.z;
|
||
|
double angel=Angle(dirtp,DX);
|
||
|
//if(angel>pi/2)angel=pi-angel;
|
||
|
//angel=min(angel,pi/2-angel);
|
||
|
if(angel<=minAngle||angel>=pi-minAngle)ofs<<0<<endl;
|
||
|
else if(angel>=pi/2-minAngle&&angel<=pi/2+minAngle)ofs<<1<<endl;
|
||
|
else ofs<<2<<endl;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}clipSet;
|