如下图所示,有些直线和直线在视觉上看是关联的,我们也给每条直线建立了节点。但是下图中的横向的直线,左侧有一个节点,但是这个节点同纵向的直线没有关系,也就是说横向的直线在逻辑上是独立的。
要建立横向直线和纵向直线的关联关系,考虑的一个解决方案是将纵向的直线拆成两条,下半部的终点是横向直线的左侧节点,上半部的起点是横向直线的左侧节点,在逻辑关系上相当于一个三通。
在程序处理上,循环判断每个节点,如果节点同直线的距离小于某个值,则认为节点是在直线上的,可以拆分直线。这里之所以要判断距离小于某个值,是因为在视觉上看,节点在直线上,实际在数据级别上,他们之间还是有一定的距离的。
public double NODE_DISTINCE_MIN = 500;//节点拆分直线,节点到直线的最小距离
public int splitLine(Yxxf D){
int iCount = 0;//拆分的数量
//遍历所有图元
YxxfEntBlock blk = D.secEntities.insMSpace.block;
YxxfEnt ent = null;
int nextToDraw = 0;
while (true)
{
ent = (YxxfEnt)blk.nextEntity(nextToDraw);
if (ent == null)
break;
if(ent.getClass()==YxxfEntLine.class){
YxxfEntLine entLine = (YxxfEntLine)ent;
//该节点是直线的起点,不处理
if(entLine.begObj.getClass() == YxxfEntNode.class){
YxxfEntNode nodeObj = (YxxfEntNode)entLine.begObj;
if(nodeObj.id.equals(id)){
nextToDraw++;
continue;
}
}
//该节点是直线的终点,不处理
if(entLine.endObj.getClass() == YxxfEntNode.class){
YxxfEntNode nodeObj = (YxxfEntNode)entLine.endObj;
if(nodeObj.id.equals(id)){
nextToDraw++;
continue;
}
}
//计算点到直线的距离
double distance = PointToSegDist(x,y,entLine.begpnt.x,entLine.begpnt.y,entLine.endpnt.x,entLine.endpnt.y);
if(distance<</span>D.NODE_DISTINCE_MIN){//点在直线上
//计算新直线的长度
int length = 0;//总长度
int newLength = 0;//本点到终点的长度
try{
length = new Integer(entLine.pipeLength).intValue();
double tmp1 = Math.sqrt(Math.pow(entLine.endpnt.x-x, 2)+Math.pow(entLine.endpnt.y-y, 2));//本点到直线终点的长度
double tmpAll = Math.sqrt(Math.pow(entLine.endpnt.x-entLine.begpnt.x, 2)+Math.pow(entLine.endpnt.y-entLine.begpnt.y, 2));//直线总长度
if(tmpAll!=0)
newLength = new Double(length * tmp1 / tmpAll).intValue();
}catch(Exception e){
}
//新的直线
YxxfEntLine new_line = new YxxfEntLine();
new_line.id = D.getEntId();//赋值id
new_line.begpnt.x = x;
new_line.begpnt.y = y;
new_line.begpnt.z = 0;
new_line.endpnt.x = entLine.endpnt.x;
new_line.endpnt.y = entLine.endpnt.y;
new_line.endpnt.z = entLine.endpnt.z;
new_line.thickness = entLine.thickness;
new_line.xtruDir.x = entLine.xtruDir.x;
new_line.xtruDir.y = entLine.xtruDir.y;
new_line.xtruDir.z = entLine.xtruDir.z;
new_line.begObj = this;
new_line.endObj = entLine.endObj;
new_line.diameter = entLine.diameter;
new_line.pipeLength = String.valueOf(newLength);
//计算java坐标
new_line.begPoint.x = D.calcPointX(entLine.begpnt.x);
new_line.begPoint.y = D.calcPointY(entLine.begpnt.y);
new_line.endPoint.x = entLine.endPoint.x;
new_line.endPoint.y = entLine.endPoint.y;
blk.addEntity(new_line);
//原来的直线
entLine.endpnt.x = x;
entLine.endpnt.y = y;
entLine.endpnt.z = 0;
entLine.endObj = this;
entLine.pipeLength = String.valueOf(length-newLength);
entLine.endPoint.x = D.calcPointX(entLine.endpnt.x);
entLine.endPoint.y = D.calcPointY(entLine.endpnt.y);
iCount++;
}
}
nextToDraw++;
}
return iCount;
}