Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 09.12.2021
Сообщений: 63

Градиентный сдвиг точек внутри области не работает корректно - почему точки не перемещаются?

09.06.2024, 14:26. Показов 420. Ответов 0

Студворк — интернет-сервис помощи студентам
Здравствуйте, я столкнулся с проблемой при попытке реализовать сдвиг граничных точек внутри области, определяемой функцией F(x;y)=y-x^2 с помощью градиента. Суть задачи заключается в том, чтобы сдвигать точки, которые находятся внутри области, по направлению градиента gradF=(-2x;y). Однако граничные точки не перемещаются корректно к границе области, при этом внутренние точки не сдвигаются! не знаете, в чем может быть причина?
Прилагаются скриншоты визуализации.
Исходный код программы:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import matplotlib.pyplot as plt
import numpy as np
from scipy.spatial import Delaunay
 
# Определяем граничные функции
def F(x, y):
    return y - x ** 2
 
def is_point_in_region(x, y):
    return F(x, y) < 0
 
# Генерация начальных точек для трех треугольников
initial_points = np.array([
    [-0.5, 0.25], [0.5, 0.25], [0, 1],  # Первый треугольник
    [-1, 1], [1, 1]                    # Второй и третий треугольники
])
 
# Создаем начальную триангуляцию
triangulation = Delaunay(initial_points)
 
# Функция для измельчения треугольников
def refine_triangulation(points, simplices):
    new_points = []
    new_simplices = []
    midpoint_cache = {}
 
    def midpoint(p1, p2):
        key = tuple(sorted((p1, p2)))
        if key not in midpoint_cache:
            midpoint_cache[key] = (points[p1] + points[p2]) / 2
        return midpoint_cache[key]
 
    for simplex in simplices:
        midpoints = [midpoint(simplex[i], simplex[(i + 1) % 3]) for i in range(3)]
        midpoints_indices = []
        for mid in midpoints:
            if any((mid == x).all() for x in new_points):
                midpoints_indices.append(np.where(np.all(new_points == mid, axis=1))[0][0])
            else:
                new_points.append(mid)
                midpoints_indices.append(len(points) + len(new_points) - 1)
 
        # Create four new triangles
        for i in range(3):
            new_simplices.append([simplex[i], midpoints_indices[i], midpoints_indices[(i + 2) % 3]])
        new_simplices.append(midpoints_indices)
 
    return np.vstack([points, new_points]), np.array(new_simplices)
 
# Измельчаем триангуляцию
refined_points, refined_simplices = refine_triangulation(initial_points, triangulation.simplices)
refined_triangulation = Delaunay(refined_points)
 
# Функция для сдвига граничных точек
def move_boundary_points(points, alpha, epsilon):
    moved_points = points.copy()
    for i, (x, y) in enumerate(points):
        if F(x, y) < -epsilon:  # Проверяем условие для сдвига
            grad_x = -2 * x  # Градиент по x для F(x, y) = y - x^2
            grad_y = y       # Градиент по y для F(x, y) = y - x^2
            new_x = x + alpha * grad_x
            new_y = y + alpha * grad_y
            if is_point_in_region(new_x, new_y):
                moved_points[i] = [new_x, new_y]
    return moved_points
 
# Применяем сдвиг к граничным точкам
alpha = 0.1
epsilon = 0.01
moved_points = move_boundary_points(refined_points, alpha, epsilon)
refined_triangulation_after_move = Delaunay(moved_points)
 
# Построение графиков
fig, axs = plt.subplots(1, 4, figsize=(32, 8))
axs[0].set_aspect('equal')
axs[0].set_xlim(-1.5, 1.5)
axs[0].set_ylim(-0.5, 1.5)
axs[1].set_aspect('equal')
axs[1].set_xlim(-1.5, 1.5)
axs[1].set_ylim(-0.5, 1.5)
axs[2].set_aspect('equal')
axs[2].set_xlim(-1.5, 1.5)
axs[2].set_ylim(-0.5, 1.5)
axs[3].set_aspect('equal')
axs[3].set_xlim(-1.5, 1.5)
axs[3].set_ylim(-0.5, 1.5)
 
x_boundary = np.linspace(-1, 1, 100)
y_boundary = x_boundary**2
 
for ax in axs:
    ax.plot(x_boundary, y_boundary, 'r-', label='y = x^2')
    ax.plot(x_boundary, np.ones_like(x_boundary), 'b-', label='y = 1')
 
# Построение триангуляции до измельчения точек
axs[0].triplot(initial_points[:, 0], initial_points[:, 1], triangulation.simplices, color='purple')
axs[0].scatter(initial_points[:, 0], initial_points[:, 1], color='blue')
axs[0].set_title("Триангуляция до применения алгоритма измельчения")
axs[0].grid(False)
 
# Построение триангуляции после измельчения точек
axs[1].triplot(refined_points[:, 0], refined_points[:, 1], refined_triangulation.simplices, color='purple')
axs[1].scatter(refined_points[:, 0], refined_points[:, 1], color='blue')
axs[1].set_title("Триангуляция после измельчения точек")
axs[1].grid(False)
 
# Построение триангуляции после перемещения точек
axs[2].triplot(moved_points[:, 0], moved_points[:, 1], refined_triangulation_after_move.simplices, color='purple')
axs[2].scatter(moved_points[:, 0], moved_points[:, 1], color='blue')
axs[2].set_title("Триангуляция после перемещения точек")
axs[2].grid(False)
 
# Визуализация направлений градиентов
axs[3].triplot(refined_points[:, 0], refined_points[:, 1], refined_triangulation.simplices, color='purple')
axs[3].scatter(refined_points[:, 0], refined_points[:, 1], color='blue')
axs[3].set_title("Визуализация направлений градиентов")
axs[3].grid(False)
for i, (x, y) in enumerate(refined_points):
    if F(x, y) < -epsilon:  # Если точка на границе области
        grad_x = -2 * x  # Градиент по x для F(x, y) = y - x^2
        grad_y = y       # Градиент по y для F(x, y) = y - x^2
        axs[3].arrow(x, y, alpha * grad_x, alpha * grad_y, head_width=0.02, head_length=0.04, fc='green', ec='green')
 
# Добавление меток и легенды
for ax in axs:
    ax.legend()
 
plt.show()



0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.06.2024, 14:26
Ответы с готовыми решениями:

Определить радиус и центр наибольшей окружности в области заданных точек, внутри которой нет точек
Определить радиус и центр наибольшей окружности в области заданных точек, внутри которой нет точек задать точки через массив и оформить...

Определить радиус и центр наибольшей окружности в области заданных точек, внутри которой нет точек
Определить радиус и центр наибольшей окружности в области заданных точек, внутри которой нет точек Помогите пожалуйста,точки нужно задать...

Из множества точек на плоскости найти точки, образующие параллелограмм с наибольшим количеством точек внутри
&quot;Даны N точек на плоскости. Найти среди них точки являющиеся вершинами фигуры, содержащей максимальное число заданных точек. Фигура -...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.06.2024, 14:26
Помогаю со студенческими работами здесь

Выбрать три точки из множества точек на плоскости так, чтобы была минимальной разность между количествами точек внутри и вне треугольника
Выбрать три различные точки из заданного множества точек на плоскости так, чтобы была минимальной разность между количествами ...

Из заданного множества точек на плоскости выбрать три разные точки А В С так, чтобы внутри треугольника АВС содержалось максимальное количество точек.
Помогите написать программный модуль для решения задачи. Из заданного множества точек на плоскости выбрать три разные точки А В С так,...

Выбрать три различные точки из заданного множества точек на плоскости так, чтобы была минимальной разность между количествами точек, внутри и снаружи.
Написать программный модуль для решения следующей задачи. Выбрать три различные точки из заданного множества точек на плоскости так,...

Из множества точек выбрать такие три точки А, В, С, чтобы внутри треугольника АВС содержалось максимальное количество точек этого множества
Из заданного множества точек на плоскости выбрать такие три точки А, В, С, чтобы внутри треугольника АВС содержалось максимальное...

Почему не корректно используется strtok внутри другого
Пытаюсь найти повторяющиеся слова в тексте. Действую таким образом: первым стртоком разделяю текст на слова и с каждым словом ищу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru