От сплайнов к полилиниям: простое преобразование кривых

В компьютерной графике и приложениях САПР для изображения кривых обычно используются сплайны и полилинии. В то время как сплайны обеспечивают плавное и точное управление кривыми, полилинии обеспечивают простоту и эффективность. В этом сообщении блога мы рассмотрим различные методы преобразования нескольких сплайнов в полилинии, что позволит вам использовать преимущества обоих представлений кривых. Итак, давайте углубимся и откроем для себя несколько полезных приемов!

Метод 1: линейная интерполяция
Самый простой способ преобразования сплайнов в полилинии — это линейная интерполяция. Вот базовый фрагмент кода на Python, иллюстрирующий эту концепцию:

def spline_to_polyline(spline_points):
    polyline_points = []
    for i in range(len(spline_points) - 1):
        start_point = spline_points[i]
        end_point = spline_points[i + 1]
        polyline_points.append(start_point)

        # Linearly interpolate between start and end points
        step = 0.1  # Set the desired step size
        for t in range(1, int(1 / step)):
            interpolated_point = start_point + (end_point - start_point) * t * step
            polyline_points.append(interpolated_point)

    polyline_points.append(spline_points[-1])  # Add the last point of the spline
    return polyline_points

Метод 2: алгоритм Дугласа-Пейкера
Алгоритм Дугласа-Пейкера — популярный метод аппроксимации кривой. Он упрощает кривую, рекурсивно удаляя точки, минимально отклоняющиеся от исходной формы. Вот пример реализации на Python:

def douglas_peucker(points, tolerance):
    if len(points) < 3:
        return points

    # Find the point with the maximum distance
    dmax = 0
    index = 0
    end = len(points) - 1

    for i in range(1, end):
        d = perpendicular_distance(points[i], points[0], points[end])
        if d > dmax:
            index = i
            dmax = d

    # Recursive call for the two resulting parts
    if dmax > tolerance:
        recursive_results1 = douglas_peucker(points[:index + 1], tolerance)
        recursive_results2 = douglas_peucker(points[index:], tolerance)

        # Concatenate the results
        results = recursive_results1[:-1] + recursive_results2
    else:
        results = [points[0], points[end]]

    return results
def spline_to_polyline(spline_points, tolerance):
    return douglas_peucker(spline_points, tolerance)

Метод 3: алгоритм Чайкина
Алгоритм Чайкина — еще один популярный метод преобразования сплайнов в полилинии. Он итеративно аппроксимирует кривую, добавляя новые точки вдоль сегментов кривой. Вот пример реализации на Python:

def chaikin_subdivide(points, subdivision_iter):
    for _ in range(subdivision_iter):
        subdivided_points = []
        n = len(points)
        for i in range(n):
            p0 = points[i]
            p1 = points[(i + 1) % n]

            # Add the original points
            subdivided_points.append(p0)

            # Add the midpoints
            mid = (p0 + p1) * 0.5
            subdivided_points.append(mid)

        points = subdivided_points

    return points
def spline_to_polyline(spline_points, subdivision_iter):
    return chaikin_subdivide(spline_points, subdivision_iter)

Преобразование сплайнов в полилинии позволяет найти баланс между точностью кривой и эффективностью вычислений. В этой статье мы исследовали три популярных метода: линейную интерполяцию, алгоритм Дугласа-Пейкера и алгоритм Чайкина. В зависимости от ваших конкретных требований вы можете выбрать наиболее подходящий метод для вашего проекта. Так что смело экспериментируйте с этими приемами и наслаждайтесь гибкостью работы с полилиниями!