def feasibleVector(self,all_vectors,touching_edges): ''' 该段代码需要重构,过于复杂 ''' res_vector=[] # print("\nall_vectors:",all_vectors) for vector in all_vectors: feasible=True # print("\nvector:",vector,"\n") for touching in touching_edges: vector1=[] vector2=[] # 判断方向并进行转向 if touching["stationary_start"]==True: vector1=touching["vector1"] else: vector1=[-touching["vector1"][0],-touching["vector1"][1]] if touching["orbiting_start"]==True: vector2=touching["vector2"] else: vector2=[-touching["vector2"][0],-touching["vector2"][1]] vector12_product=GeoFunc.crossProduct(vector1,vector2) # 叉积,大于0在左侧,小于0在右侧,等于0平行 vector_vector1_product=GeoFunc.crossProduct(vector1,vector) # 叉积,大于0在左侧,小于0在右侧,等于0平行 vector_vector2_product=GeoFunc.crossProduct(vector2,vector) # 叉积,大于0在左侧,小于0在右侧,等于0平行 # 最后两种情况 if touching["type"]==4 and (vector_vector1_product*vector12_product)<0: feasible=False if touching["type"]==5 and (vector_vector2_product*(-vector12_product))>0: feasible=False # 正常的情况处理 if vector12_product>0: if vector_vector1_product<0 and vector_vector2_product<0: feasible=False if vector12_product<0: if vector_vector1_product>0 and vector_vector2_product>0: feasible=False # 平行情况,需要用原值逐一判断 if vector12_product==0: inter=GeoFunc.newLineInter(touching["edge1"],touching["edge2"]) if inter["geom_type"]=="LineString": if inter["length"]>0.01: # 如果有相交,则需要在左侧 if (touching["orbiting_start"]==True and vector_vector2_product<0) or (touching["orbiting_start"]==False and vector_vector2_product>0): feasible=False else: # 如果方向相同,且转化直线也平行,则其不能够取a的方向 if touching["orbiting_start"]==True != touching["stationary_start"]==False and vector_vector1_product==0: if touching["vector1"][0]*vector[0]>0: # 即方向相同 feasible=False if feasible==True: res_vector=vector break return res_vector
def newLineInter(line1,line2): vec1=GeoFunc.lineToVec(line1) vec2=GeoFunc.lineToVec(line2) vec12_product=GeoFunc.crossProduct(vec1,vec2) Line1=LineString(line1) Line2=LineString(line2) inter={ "length":0, "geom_type":None } # 只有平行才会有直线重叠 if vec12_product==0: # copy避免影响原值 new_line1=GeoFunc.copyPoly(line1) new_line2=GeoFunc.copyPoly(line2) if vec1[0]*vec2[0]<0 or vec1[1]*vec2[1]<0: new_line2=GeoFunc.reverseLine(new_line2) # 如果存在顶点相等,则选择其中一个 if GeoFunc.almostEqual(new_line1[0],new_line2[0]) or GeoFunc.almostEqual(new_line1[1],new_line2[1]): inter["length"]=min(Line1.length,Line2.length) inter["geom_type"]='LineString' return inter # 排除只有顶点相交情况 if GeoFunc.almostEqual(new_line1[0],new_line2[1]): inter["length"]=new_line2[1] inter["geom_type"]='Point' return inter if GeoFunc.almostEqual(new_line1[1],new_line2[0]): inter["length"]=new_line1[1] inter["geom_type"]='Point' return inter # 否则判断是否包含 line1_contain_line2_pt0=GeoFunc.almostContain(new_line1,new_line2[0]) line1_contain_line2_pt1=GeoFunc.almostContain(new_line1,new_line2[1]) line2_contain_line1_pt0=GeoFunc.almostContain(new_line2,new_line1[0]) line2_contain_line1_pt1=GeoFunc.almostContain(new_line2,new_line1[1]) # Line1直接包含Line2 if line1_contain_line2_pt0 and line1_contain_line2_pt1: inter["length"]=Line1.length inter["geom_type"]='LineString' return inter # Line2直接包含Line1 if line1_contain_line2_pt0 and line1_contain_line2_pt1: inter["length"]=Line2.length inter["geom_type"]='LineString' return inter # 相互包含交点 if line1_contain_line2_pt0 and line2_contain_line1_pt1: inter["length"]=LineString([line2[0],line1[1]]).length inter["geom_type"]='LineString' return inter if line1_contain_line2_pt1 and line2_contain_line1_pt0: inter["length"]=LineString([line2[1],line1[0]]).length inter["geom_type"]='LineString' return inter return inter