def cut_x(point_list, x): """ 截取x以右的线段 :param point_list: list[Point] :param x: thread x :return: new_point_list[Point] """ new_point_list = [] last_point = None cut = False for point in point_list: if point.px < x: pass elif not cut: if last_point is None: new_point_list.append(point) cut = True else: cur_seg = Segment(last_point, point) par = Segment(Point(x, 0), Point(x, 1)) _, px, py = get_cross_point(cur_seg, par) new_point_list.append(Point(px, py)) cut = True else: new_point_list.append(point) last_point = point return new_point_list
def get_parallel(segment_point0, segment_point1, d): """ 获取离线段距离为d的两条平行线段 :param segment_point0: 线段端点0, Point :param segment_point1: 线段端点1, Point :param d: 距离d :return: segment1(Segment), segment2, """ x0, y0 = segment_point0.px, segment_point0.py x1, y1 = segment_point1.px, segment_point1.py vec = np.array([x1 - x0, y1 - y0]) y = np.linalg.norm(vec) z = vec / y h0 = np.array([z[1], -z[0]]) # 右手边 h1 = np.array([-z[1], z[0]]) # 左手边 xh0, yh0 = x0 + h0[0] * d, y0 + h0[1] * d xh1, yh1 = x1 + h0[0] * d, y1 + h0[1] * d p0, p1 = Point(xh0, yh0), Point(xh1, yh1) segment0 = Segment(begin_point=p0, end_point=p1, name='') # segment0 = [[xh0, yh0], [xh1, yh1]] xh0, yh0 = x0 + h1[0] * d, y0 + h1[1] * d xh1, yh1 = x1 + h1[0] * d, y1 + h1[1] * d # segment1 = [[xh0, yh0], [xh1, yh1]] p0, p1 = Point(xh0, yh0), Point(xh1, yh1) segment1 = Segment(begin_point=p0, end_point=p1, name='') return segment0, segment1
def cut_from_segment(segment, d): """ 从segment里面切开距离为d的线段 :param segment: Segment :param d: :return: segment0, segment1 """ x0, y0 = segment.begin_point.px, segment.begin_point.py x1, y1 = segment.end_point.px, segment.end_point.py vec = np.array([x1 - x0, y1 - y0]) y = np.linalg.norm(vec) z0 = vec / y # 单位向量 xd, yd = x0 + z0[0] * d, y0 + z0[1] * d cr = Point(xd, yd) s0 = Segment(segment.begin_point, cr) s1 = Segment(cr, segment.end_point) return s0, s1
def cut_y(point_list, y): """ 截取y以下的线段 :param point_list: list[Point] :param y: thread y :return: new_point_list[Point] """ new_point_list = [] last_point = None for point in point_list: if point.py < y: new_point_list.append(point) else: cur_seg = Segment(last_point, point) par = Segment(Point(0, y), Point(1, y)) _, px, py = get_cross_point(cur_seg, par) new_point_list.append(Point(px, py)) break last_point = point return new_point_list
def par_offset(road0, road1): """ 边缘点的起点或终点从路中央偏移到路上 一定偏移到偶数序号的道路(中心线右手边) :param road0: Road 待修正的道路道路 :param road1: Road 偏移到的(与road0垂直)道路 :return: """ OFFSET = 80 if road1.rid & 1: return # 当端点接近某道路且该道路没有路口交点时,需要偏移该端点,延长至下一个道路 # 端点必须没有和其他线段相交 bp, ep = road0.point_list[0], road0.point_list[-1] # 首先是起点 min_dist = 1e10 sel_seg = None for seg in road1.seg_list: dist = point2segment2(bp, seg) if dist < min_dist: min_dist, sel_seg = dist, seg # 寻找延长至的道路线段 if min_dist < OFFSET: if road0.bs == 1: return min_dist = 1e10 for pt in road1.cross_list: dist = get_dist(pt, bp) min_dist = min(dist, min_dist) if min_dist > OFFSET: _, px, py = get_cross_point(sel_seg, road0.seg_list[0]) cr = Point(px, py) # 该延长线应落在预计道路sel_seg上 # 不然与其余道路有可能偏离在50米内 extended_segment = Segment(cr, bp) if not is_segment_cross(extended_segment, sel_seg): return pt_list = [cr] pt_list.extend(road0.point_list[:]) road0.set_point_list(pt_list) road0.gene_segment() return min_dist = 1e10 sel_seg = None for seg in road1.seg_list: dist = point2segment2(ep, seg) if dist < min_dist: min_dist, sel_seg = dist, seg if min_dist < OFFSET: if road0.es == 1: return min_dist = 1e10 for pt in road1.cross_list: dist = get_dist(pt, ep) min_dist = min(dist, min_dist) if min_dist > OFFSET: _, px, py = get_cross_point(sel_seg, road0.seg_list[-1]) cr = Point(px, py) extended_segment = Segment(cr, bp) if not is_segment_cross(extended_segment, sel_seg): return road0.point_list.append(cr) road0.gene_segment() return