Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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