|
|
|
#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;
|