def path_of_white_ball(p1, p2, r):
    pathBallW[:] = []
    middle_ray = Line(p1, p2)
    cue_circle = Circle(p1, r)
    normal_line = middle_ray.perpendicular_line(p1)
    points = intersection(cue_circle, normal_line)
    pathBallW.append(middle_ray.parallel_line(points[0]))
    pathBallW.append(middle_ray)
    pathBallW.append(middle_ray.parallel_line(points[1]))
예제 #2
0
def calc_prompt_perpendicular_line(p_1: QPointF, p_2: QPointF,
                                   p_mouse: QPointF):
    if p_1 == p_2:
        return None, None
    mouse = Point(p_mouse.x(), p_mouse.y())
    p_1 = Point(p_1.x(), p_1.y())
    p_2 = Point(p_2.x(), p_2.y())
    line = Line(p_1, p_2)
    para_line = line.parallel_line(mouse)
    perp_line_1 = line.perpendicular_line(p_1)
    perp_line_2 = line.perpendicular_line(p_2)
    conj_p1 = para_line.intersection(perp_line_1)
    conj_p2 = para_line.intersection(perp_line_2)
    qp1 = QPointF(conj_p1[0].x, conj_p1[0].y)
    qp2 = QPointF(conj_p2[0].x, conj_p2[0].y)
    return qp1, qp2
예제 #3
0
def calc_baseline(p1: QPointF, p2: QPointF, p_mouse: QPointF):
    if p1 == p2:
        return p1, p2
    p1_s = Point(p1.x(), p1.y())
    p2_s = Point(p2.x(), p2.y())
    p_m = Point(p_mouse.x(), p_mouse.y())
    line = Line(p1_s, p2_s)
    if line.contains(p_m):
        return p1, p2
    perpendicular_1 = line.perpendicular_line(p1_s)
    perpendicular_2 = line.perpendicular_line(p2_s)
    para = line.parallel_line(p_m)
    prompt_p_1 = para.intersection(perpendicular_1)
    prompt_p_2 = para.intersection(perpendicular_2)
    q_p_1 = QPointF(prompt_p_1[0].x, prompt_p_1[0].y)
    q_p_2 = QPointF(prompt_p_2[0].x, prompt_p_2[0].y)
    return q_p_1, q_p_2
예제 #4
0
        plotpolygon(ax, obstacles[i])
        width = np.append(width, 2.4)

cindex = 0
count = 0
convexcells = list(cells)
for cell in cells:
    cutpt = []
    if not (cell.is_convex()):
        for vertice in cell.vertices:
            if (cell.angles[vertice] > math.pi):
                cutpt.append(vertice)
        pts = pointtoarray(cutpt)
        pts = pts[pts[:, 0].argsort()]
        for pt in pts:
            cut = yaxis.parallel_line(Point(pt))
            cross = convexcells[cindex + count].intersection(cut)
            if (len(cross) == 2):
                cell1, cell2 = splitpolygon(convexcells[cindex + count], cut)
                convexcells.remove(convexcells[cindex + count])
                convexcells.insert(cindex + count, cell2)
                convexcells.insert(cindex + count, cell1)
                width = np.insert(width, cindex + count, width[cindex + count])
                plotpolygon(ax, cell1)
                count = count + 1
            elif (len(cross) == 3):
                seg1 = Segment(cross[0], cross[1])
                cell1, cell2 = splitpolygon(convexcells[cindex + count], seg1)
                convexcells.remove(convexcells[cindex + count])
                convexcells.insert(cindex + count, cell2)
                convexcells.insert(cindex + count, cell1)
starttime = time.time()
xaxis = Line((0, 0), (1, 0))
yaxis = Line((0, 0), (0, 1))
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.set_aspect('equal', 'box')
allinnerpt = np.array(allinnerpt)
allpt = allinnerpt[:]
num = len(boundary.vertices)
#find all critical points and decompose the area
criticalpoints = []
remain = boundary
bounds = remain.bounds
leftbound = bounds[0]
rightbound = bounds[2]
cut = yaxis.parallel_line(Point(leftbound, 0))
cross = boundary.intersection(cut)
if (isinstance(cross[0], Point)):
    criticalpoints.append(cross[0])
else:
    criticalpoints.append(cross[0].midpoint)
for i in range(num):
    pt = boundary.vertices[i]
    cut = yaxis.parallel_line(pt)
    cross = boundary.intersection(cut)
    crosspt = []
    for item in cross:
        if (isinstance(item, Point)):
            crosspt.append(item)
        else:
            i = 0
예제 #6
0
ymax = (-a * bounding_box[0][1] - c) / b
ymin = (-a * bounding_box[0][0] - c) / b
scatter.add_scatter(x=[bounding_box[0][0], bounding_box[0][1]],
                    y=[ymin, ymax],
                    mode="lines",
                    hoveron="points")
scatter.show()
# %% padding
print(ymax)
perp_line = classif_line.perpendicular_line(classif_line.p1)
p1 = np.array([float(perp_line.p1[0]), float(perp_line.p1[1])])
p2 = np.array([float(perp_line.p2[0]), float(perp_line.p2[1])])
v = p1 - p2
u = v / np.linalg.norm(v, ord=1)
next_point = p1 + 2 * u
parallel_line1 = classif_line.parallel_line(classif_line.p1 + Point(0, 0.2))
a1, b1, c1 = parallel_line1.coefficients
ymax1 = float((-a1 * bounding_box[0][1] - c1) / b1)
ymin1 = float((-a1 * bounding_box[0][0] - c1) / b1)
scatter.add_scatter(x=[bounding_box[0][0], bounding_box[0][1]],
                    y=[ymin1, ymax1],
                    mode="lines",
                    hoveron="points")
parallel_line2 = classif_line.parallel_line(classif_line.p1 + Point(0, -0.2))
a2, b2, c2 = parallel_line2.coefficients
ymax2 = float((-a2 * bounding_box[0][1] - c2) / b2)
ymin2 = float((-a2 * bounding_box[0][0] - c2) / b2)
scatter.add_scatter(x=[bounding_box[0][0], bounding_box[0][1]],
                    y=[ymin2, ymax2],
                    mode="lines",
                    hoveron="points")
예제 #7
0
 if (rightupindex < leftupindex):
     uppoints = list(vertices[rightupindex:leftupindex + 1])
 else:
     uppoints = list(vertices[rightupindex:len(vertices)])
     uppoints.extend(vertices[0:leftupindex + 1])
 if (leftdownindex < rightdownindex):
     downpoints = list(vertices[leftdownindex:rightdownindex + 1])
 else:
     downpoints = list(vertices[leftdownindex:len(vertices)])
     downpoints.extend(vertices[0:leftupindex + 1])
 index = findbound(uppoints)
 buttomindex = index[1]  #upper min y
 if (index[1] == index[3]):  #upper part is segment
     up1 = None
 else:
     cut = xaxis.parallel_line(uppoints[buttomindex])
     up1, temp = splitpolygon(polygon, cut)
 index = findbound(downpoints)
 topindex = index[3]  #lower max y
 if (index[1] == index[3]):  #lower part is segment
     down1 = None
 else:
     cut = xaxis.parallel_line(downpoints[topindex])
     temp, down1 = splitpolygon(polygon, cut)
 waypoint = []
 if (up1 and down1):
     waypoint = createwaypoint(up1, down1, pointpos[i])
 elif (up1):  #lower part is segment
     upbound = up1.bounds
     upmin = upbound[1]  #ymin
     upmax = upbound[3]  #ymax
예제 #8
0
copiedcell=[]
for f in var:
    if (var[f].X!=0):
        if(f[0]=='x'):
            copiedcell.append(f[1])
 #update ane matrix   
copiedcell.sort() 
copiedcell.reverse()   
newane=ane  
for c in copiedcell:
    newane=np.insert(newane,c,ane[:,c],axis=1)  
copiedcell.reverse()   
criticalpoints=[]  
for pos in criticalpos:
    cutpt=[]
    cut=yaxis.parallel_line(Point(pos,0))
    cross=boundary.intersection(cut)
    if (len(cross)==1):
        if(isinstance(cross[0],Point)):
            criticalpoints.append(cross[0])
            continue
        else:
            criticalpoints.append(cross[0].midpoint)
            continue
    for obstacle in obstacles:
        cross=obstacle.intersection(cut)
        if not(len(cross)==0):
            if(isinstance(cross[0],Point)):
                cutpt.append(cross[0])
            else:
                cutpt.append(cross[0].midpoint)