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.

210 lines
4.4 KiB

#include "pch.h" // use stdafx.h in Visual Studio 2017 and earlier
#include "Clip.h"
KDtree kdtree;
Clip::Clip(){
emc=0;bundleNodeID=0;
maxDia=MAXDia;id=0;
used=0;
}
void Clip::clear(){
diaset.clear();
bundleNodeID=0;
used=0;
}
//�ڿ���������ֱ��Ϊd������
void Clip::addwire(double d) {
diaset.push_back(d);
dia = sqrt(dia * dia + d * d);
}
//����ͨ��������������ֱ��
double Clip::getDia() {
double dia1 = 1.154 * dia;
if (dia1 >= 10)dia1 *= 1.235 / 1.154;
return dia1;
}
//�ж�ֱ��Ϊd�������ܷ�ͨ��
bool Clip::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
int Clip::inDir(P p) {
double angle = Angle(coord - p, dir);
if (angle > pi / 2)return 1;
return 0;
}
ClipSet::ClipSet(){
clipnum=0;
}
void ClipSet::clearWire(){
for(int i=1;i<=clipnum;i++)c[i].clear();
}
//�¼���һ������
void ClipSet::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;
}
//����ͨ�������ĵ���
void ClipSet::addwire(int id, double d) {
c[id].addwire(d);
}
void ClipSet::addwire(P& p, double d) {
int id = clipid[p];
c[id].addwire(d);
}
Clip * ClipSet::getClipPointer(int id,int bundleNodeID){
if(bundleNodeID!=-1)c[id].bundleNodeID=bundleNodeID;
return &c[id];
}
//�ж����������Ƿ�����Ϊ����(��֪i�����Ŀ�����j)
bool ClipSet::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;
}
//�жϿ����ܷ�ͨ��
bool ClipSet::transitable(int id, int emc, double d) {
if (c[id].emc != emc)return false;
return c[id].transitable(d);
}
//���ݿ���λ�ù��Ʒɻ��Ľ���������
void ClipSet::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;
}
//��ӡ�����������������ߵľ���
void ClipSet::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;
}
}
//���ݿ���λ���ȴ���һ�����Ƶ�ͨ����ÿ����������������������������
void ClipSet::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򿨹
*/
void ClipSet::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;
}
}