Python 如何在橙色虚线上绘制或显示特定点?

Python 如何在橙色虚线上绘制或显示特定点?,python,matplotlib,Python,Matplotlib,我试图在橙色虚线上显示以下点[control=[0.20,0.40,0.60,0.80]]。这些点表示橙色虚线每个分段的一段内的位置。根据下图,我做了一个注释,它在旁边显示了它们,但我需要它们作为我在上面做的红色x,但对于所有小节。如何突出显示橙色虚线上的所有这些点 更改: for y in control: if y == control[0]: mid_control = [(vis[x+sta

我试图在橙色虚线上显示以下点[
control=[0.20,0.40,0.60,0.80]
]。这些点表示橙色虚线每个分段的一段内的位置。根据下图,我做了一个注释,它在旁边显示了它们,但我需要它们作为我在上面做的红色x,但对于所有小节。如何突出显示橙色虚线上的所有这些点

更改:

            for y in control:
                if y == control[0]:
                    mid_control = [(vis[x+start,0]+(vis[x+(start+1),0]-vis[x+start,0])*y), (vis[x+start,1]+(vis[x+(start+1),1]-vis[x+start,1])*y)]
                    plt.annotate("*", mid_control)
                    bezier_line = calc_bezier_path(np.array([current_control,vis[x+start], mid_control]))
                    path_x = np.append(path_x, bezier_line.T[0])
                    path_y = np.append(path_y, bezier_line.T[1])
                    current_control = mid_control
                else:
                    mid_control = [(vis[x+start,0]+(vis[x+(start+1),0]-vis[x+start,0])*y), (vis[x+start,1]+(vis[x+(start+1),1]-vis[x+start,1])*y)]
                    plt.annotate("*", mid_control)
                    bezier_line = calc_bezier_path(np.array([current_control, mid_control]))
                    path_x = np.append(path_x, bezier_line.T[0])
                    path_y = np.append(path_y, bezier_line.T[1])
                    current_control = mid_control
致:

总而言之:

import numpy as np
import scipy.special
import matplotlib.pyplot as plt

def calc_bezier_path(control_points, n_points=100):
    """
    Compute bezier path (trajectory) given control points.
    :param control_points: (numpy array)
    :param n_points: (int) number of points in the trajectory
    :return: (numpy array)
    """
    traj = []
    for t in np.linspace(0, 1, n_points):
        traj.append(bezier(t, control_points))

    return np.array(traj)


def bernstein_poly(n, i, t):
    """
    Bernstein polynom.
    :param n: (int) polynom degree
    :param i: (int)
    :param t: (float)
    :return: (float)
    """
    return scipy.special.comb(n, i) * t ** i * (1 - t) ** (n - i)


def bezier(t, control_points):
    """
    Return one point on the bezier curve.
    :param t: (float) number in [0, 1]
    :param control_points: (numpy array)
    :return: (numpy array) Coordinates of the point
    """
    n = len(control_points) - 1
    return np.sum([bernstein_poly(n, i, t) * control_points[i] for i in range(n + 1)], axis=0)

def line_bezier(visx, visy, control, mod="nothing"):
    vis = np.column_stack((visx,visy))
    path_x, path_y = np.array([]),np.array([])
    setting = {"nothing":[len(vis)-2, 1, 1], "start":[len(vis)-1, 0, 0], "end":[len(vis)-1, 1, 0], "both":[len(vis), 0, -1]}
    epoch = setting[mod][0]
    start = setting[mod][1]
    end = setting[mod][2]
    if len(vis) > 2:
        current_control = vis[0]
        for x in range(epoch):
            if x != (epoch-1):
                for y in control:
                    mid_control = [(vis[x+start,0]+(vis[x+(start+1),0]-vis[x+start,0])*y), (vis[x+start,1]+(vis[x+(start+1),1]-vis[x+start,1])*y)]
                    mid_control2 = [(vis[x+start,0]+(vis[x+(start+1),0]-vis[x+start,0])*y-0.1), (vis[x+start,1]+(vis[x+(start+1),1]-vis[x+start,1])*y-0.1)]
                    if y == control[0]:
                        plt.annotate("*", mid_control2)
                        bezier_line = calc_bezier_path(np.array([current_control,vis[x+start], mid_control]))
                        path_x = np.append(path_x, bezier_line.T[0])
                        path_y = np.append(path_y, bezier_line.T[1])
                        current_control = mid_control
                    else:
                        plt.annotate("*", mid_control2)
                        bezier_line = calc_bezier_path(np.array([current_control, mid_control]))
                        path_x = np.append(path_x, bezier_line.T[0])
                        path_y = np.append(path_y, bezier_line.T[1])
                        current_control = mid_control
                        
            else:
                if mod == "end" or mod == "both":
                    bezier_line = calc_bezier_path(np.array([current_control, vis[x+(end+1)]]))
                else:
                    bezier_line = calc_bezier_path(np.array([current_control, vis[x+end], vis[x+(end+1)]]))
                path_x = np.append(path_x, bezier_line.T[0])
                path_y = np.append(path_y, bezier_line.T[1])
    else:
        path_x, path_y = visx, visy
    return path_x, path_y

visx, visy = [1,2,10,15,20,25,21], [0,5,1,4,2,3,3]
control = [0.20,0.40,0.60,0.80]
path_x, path_y = line_bezier(visx, visy, control,mod="end")
plt.plot(path_x, path_y)
plt.plot(visx, visy, "--o")
for xy in range(len(visx)):
    plt.annotate(f"P{xy}", [visx[xy], visy[xy]])

plt.xlabel('X')
plt.ylabel('Y')
plt.show()
输出:

您可以看到,在您的
if
语句中,每个块中都有
mid_control=[…]
,这是不必要的,您可以在
if
else
语句中定义
mid_control=[…]

在每个条件块内(
if y==control[0]
else
)使用变量
mid\u control
两次,一次用于
“*”
,一次用于
计算贝塞尔路径()

如您所知,
calc_bezier_path()
的绘图准确无误,而
“*”
的绘图右移

如果修改
mid\u control
,则
“*”
绘图将被更正,但
计算贝塞尔路径()
绘图将被破坏

因此,我创建了另一个变量,将
mid\u control
分配给它,并为
“*”
绘图修改一个变量,为
calc\u bezier\u path()绘图保留另一个变量。

更改:

            for y in control:
                if y == control[0]:
                    mid_control = [(vis[x+start,0]+(vis[x+(start+1),0]-vis[x+start,0])*y), (vis[x+start,1]+(vis[x+(start+1),1]-vis[x+start,1])*y)]
                    plt.annotate("*", mid_control)
                    bezier_line = calc_bezier_path(np.array([current_control,vis[x+start], mid_control]))
                    path_x = np.append(path_x, bezier_line.T[0])
                    path_y = np.append(path_y, bezier_line.T[1])
                    current_control = mid_control
                else:
                    mid_control = [(vis[x+start,0]+(vis[x+(start+1),0]-vis[x+start,0])*y), (vis[x+start,1]+(vis[x+(start+1),1]-vis[x+start,1])*y)]
                    plt.annotate("*", mid_control)
                    bezier_line = calc_bezier_path(np.array([current_control, mid_control]))
                    path_x = np.append(path_x, bezier_line.T[0])
                    path_y = np.append(path_y, bezier_line.T[1])
                    current_control = mid_control
致:

总而言之:

import numpy as np
import scipy.special
import matplotlib.pyplot as plt

def calc_bezier_path(control_points, n_points=100):
    """
    Compute bezier path (trajectory) given control points.
    :param control_points: (numpy array)
    :param n_points: (int) number of points in the trajectory
    :return: (numpy array)
    """
    traj = []
    for t in np.linspace(0, 1, n_points):
        traj.append(bezier(t, control_points))

    return np.array(traj)


def bernstein_poly(n, i, t):
    """
    Bernstein polynom.
    :param n: (int) polynom degree
    :param i: (int)
    :param t: (float)
    :return: (float)
    """
    return scipy.special.comb(n, i) * t ** i * (1 - t) ** (n - i)


def bezier(t, control_points):
    """
    Return one point on the bezier curve.
    :param t: (float) number in [0, 1]
    :param control_points: (numpy array)
    :return: (numpy array) Coordinates of the point
    """
    n = len(control_points) - 1
    return np.sum([bernstein_poly(n, i, t) * control_points[i] for i in range(n + 1)], axis=0)

def line_bezier(visx, visy, control, mod="nothing"):
    vis = np.column_stack((visx,visy))
    path_x, path_y = np.array([]),np.array([])
    setting = {"nothing":[len(vis)-2, 1, 1], "start":[len(vis)-1, 0, 0], "end":[len(vis)-1, 1, 0], "both":[len(vis), 0, -1]}
    epoch = setting[mod][0]
    start = setting[mod][1]
    end = setting[mod][2]
    if len(vis) > 2:
        current_control = vis[0]
        for x in range(epoch):
            if x != (epoch-1):
                for y in control:
                    mid_control = [(vis[x+start,0]+(vis[x+(start+1),0]-vis[x+start,0])*y), (vis[x+start,1]+(vis[x+(start+1),1]-vis[x+start,1])*y)]
                    mid_control2 = [(vis[x+start,0]+(vis[x+(start+1),0]-vis[x+start,0])*y-0.1), (vis[x+start,1]+(vis[x+(start+1),1]-vis[x+start,1])*y-0.1)]
                    if y == control[0]:
                        plt.annotate("*", mid_control2)
                        bezier_line = calc_bezier_path(np.array([current_control,vis[x+start], mid_control]))
                        path_x = np.append(path_x, bezier_line.T[0])
                        path_y = np.append(path_y, bezier_line.T[1])
                        current_control = mid_control
                    else:
                        plt.annotate("*", mid_control2)
                        bezier_line = calc_bezier_path(np.array([current_control, mid_control]))
                        path_x = np.append(path_x, bezier_line.T[0])
                        path_y = np.append(path_y, bezier_line.T[1])
                        current_control = mid_control
                        
            else:
                if mod == "end" or mod == "both":
                    bezier_line = calc_bezier_path(np.array([current_control, vis[x+(end+1)]]))
                else:
                    bezier_line = calc_bezier_path(np.array([current_control, vis[x+end], vis[x+(end+1)]]))
                path_x = np.append(path_x, bezier_line.T[0])
                path_y = np.append(path_y, bezier_line.T[1])
    else:
        path_x, path_y = visx, visy
    return path_x, path_y

visx, visy = [1,2,10,15,20,25,21], [0,5,1,4,2,3,3]
control = [0.20,0.40,0.60,0.80]
path_x, path_y = line_bezier(visx, visy, control,mod="end")
plt.plot(path_x, path_y)
plt.plot(visx, visy, "--o")
for xy in range(len(visx)):
    plt.annotate(f"P{xy}", [visx[xy], visy[xy]])

plt.xlabel('X')
plt.ylabel('Y')
plt.show()
输出:

您可以看到,在您的
if
语句中,每个块中都有
mid_control=[…]
,这是不必要的,您可以在
if
else
语句中定义
mid_control=[…]

在每个条件块内(
if y==control[0]
else
)使用变量
mid\u control
两次,一次用于
“*”
,一次用于
计算贝塞尔路径()

如您所知,
calc_bezier_path()
的绘图准确无误,而
“*”
的绘图右移

如果修改
mid\u control
,则
“*”
绘图将被更正,但
计算贝塞尔路径()
绘图将被破坏


因此,我创建了另一个变量,将
mid_control
分配给它,并为
“*”
绘图修改一个变量,为
calc_bezier_path()
绘图保留另一个变量。

同样的问题,亲爱的,你能在图片上添加一些点来演示所需的结果吗?你能告诉我你到底做了什么吗?你为什么要添加第二个mi_控制点?我在帖子中添加了一个描述。我感谢你的帮助。同样的问题,亲爱的,你能在你的图片中添加一些点来演示想要的结果吗?你能告诉我你到底做了什么吗?你为什么要添加第二个mi_控制点?我在帖子中添加了一个描述。我感谢你的帮助。