М.Двач / Программирование

анон, помоги решить проблему. вот у меня есть 2 отрезка A1B1 и A2B2, координаты их конечных точек я 29 мая, 16:23 3465204 В конец треда | Веб

35 Кб, 1720x7183,3 Мб, mp4,
1920x1080, 0:35126 Кб, 784x511

анон, помоги решить проблему. вот у меня есть 2 отрезка A1B1 и A2B2, координаты их конечных точек я знаю. эти 2 отрезка между собой всегда параллельны. все что я могу делать - это вращать вместе эти 2 отрезка вокруг точки О1. аналогично с отрезками C1D1 и C2D2, и точкой вращения O2. единственное отличие, сама точка O1 и соответственно прямые A1B1 и A2B2 могут вращаться вокруг другой оси O3.

задача: насколько возможно оптимальным способом сразу высчитать углы поворота для A1B1 A2B2 и для C1D1 C2D2 таким образом, чтобы ни один отрезок из A1B1 A2B2 не пересекал C1D1 C2D2. т.е. чтобы черные отрезки не пересекались с зелеными, а были между ними всегда, для этого надо как-то высчитать углы поворотов для двух компонент.

чтобы было более понятно, мне надо симулировать подобный механизм (пик 2 и 3). надеюсь понятно объяснил

Ответы652256737271977

1,9 Мб, 498x280
2 29 мая, 16:24 2 3465206

3 29 мая, 16:36 3 3465225

>>3465204 (OP)
Ну так вращай A1B1 A2B2 как хочешь и проверяй на пересечение с C1D1 C2D2

Ответы6523065232

4 29 мая, 16:36 4 3465227

единственное что приходит мне на ум. это вращать вокруг O3, пока не нарушится условие НЕ пересечения отрезков. затем вращать вокруг O1 черные отрезки на какой-то минимальный градус типа 0,01, проверять НЕ пересечение. тоже самое делать с другой компонентой, вращать вокруг О2, проверять. по сути это метод перебора, он не эффективен. и есть шанс что когда-нибудь этого шага градуса в 0,01 станет много, нужно будет делать его еще меньше, что приведет к еще большим рассчетам. короче это хуйня, но я другого пути не знаю

5 29 мая, 16:37 5 3465230

>>3465225
>Ну так вращай A1B1 A2B2 как хочешь и проверяй на пересечение с C1D1 C2D2
Вращай A1B1 и проверяй на пересечение C1D1
фикс

6 29 мая, 16:41 6 3465232

>>3465225
это будет как перебор, нужно будет городить кучу костылей, чтобы при случае чего сделать откат к какому-то углу и пробовать поворачивать зеленые отрезки. это будет как угадайка. не эффективно. вот я поэтому думал может можно как-то геометрически рассчитать эти углы поворота?

посмотри внимательно на видео, там не просто вращение происходит. этот длинный шток (A1B1 и A2B2) сначала как-бы идет вниз, а затем в какой-то момент начинает правый конец поднимать вверх, меняя наклон в противоположную сторону.

Ответы6523665240

7 29 мая, 16:46 7 3465236

>>3465232
еще добавлю. это поведение будет зависеть полностью от расположения осей O1 и O2. а я как раз потом и хочу менять эти оси, чтобы потом отсортировать результаты по длине хода (насколько глубоко А1B1 и A2B2 проходят внутрь отверстия, грани которого ограничиваются C1D1 и C2D2) и выбрать нужные, оптимальные для меня

207 Кб, 640x640
8 29 мая, 16:48 8 3465240

>>3465232
>геометрически рассчитать эти углы поворота
Так ты геометрически расчитываешь пересечение при повороте, ты же знаешь как найти пересечение двух векторов в 2d? Вооот. А забить все точки пересечения это хуета.

Ответы65260

22 Кб, 1170x423
9 29 мая, 17:07 9 3465260

>>3465240
вот смотри. я повернул на 5 градусов. получилось перечение. с этого момента я должен вращать либо вокруг O1, либо вокруг O2, либо O1 и O2 вместе, подбирая углы так, чтобы выполнилось условие НЕ пересечения. допустим я начал вращать только вокруг O1 с каким-то шагом в левую сторону (т.к. пересечение произошло в нижнем отрезке). и вот я дрочу по 0,01 градусу, чтобы не проебать момент... потом бац: СРАЗУ ПЕРЕСЕЧЕНИЕ ВВЕРХУ, А ВНИЗУ ЕГО НЕТ. начинаю так же вращать уже зеленые отрезки вокруг О2. и все по новой. я могу либо попасть снова в такую ситуацию. и придется обратно вращат ьчерные отрезки вокруг О1 снова. короче, это все сводится к какой-то хуйне, где ты ловишь углы ОБЕИХ компонент так, чтобы выполнилось условие. это дроч. это костыли. это хуйня.

>Так ты геометрически расчитываешь пересечение при повороте, ты же знаешь как найти пересечение двух векторов в 2d?
ну я определил, что где-то у меня произошло пересечение. и что это дает мне? я должен все равно подбирать эти углы, потому что я не знаю уравнения по которому можно было бы сразу рассчитать эти углы

10 29 мая, 17:08 10 3465261

Доверни каждую из точек на pi/2 pi 3pi/2 2pi, это будут экстремумы координат. Дальше смотришь пересечение таких повёрнутых отрезков.

Ответы6526265270

11 29 мая, 17:09 11 3465262

>>3465261
точнее не на, а до

12 29 мая, 17:14 12 3465267

ладно, забей, я обосрался. Задача нерешаемая. Нужно дать настояться.

13 29 мая, 17:17 13 3465270

>>3465261
можно поподробней? каких именно точек? всех черных и зеленых отрезков? относительно чего? своей оси вращения т.е. О1 и О2?
>pi/2 pi 3pi/2 2pi
что-то одно любое выбрать?
>это будут экстремумы координат
от куда такая уверенность? положение изначальное точек ведь может быть любым абсолютно. если я правильно вообще понял что ты подразумеваешь под экстремумами. я не совсем в общем понял твою идею.

14 31 мая, 19:56 14 3466752

27 Кб, 1183x7683,4 Мб, mp4,
1920x1080, 0:42

в общем, сделал так:
провел зеленую линию от центра вращения до середины отверстия (перпендикулярно). от сюда горизонтально провел произвольную линию (красная). так же горизонтальную уже готовую линию (не стал новую рисовать), которая является самим штоком. и соединил центра узлов вращения двух деталей синей линией. все эти отрезки превратил в вектора, и относительно синей линии находил угол между векторами. это тот самый угол на который надо повернуть каждую деталь.

вроде похоже на то, что надо было, но заметил проблему - когда начинаю далеко вращать, синяя и красные линии начинают расходиться. в чем может быть проблема?

Ответы66762

3 Мб, mp4,
1920x1080, 0:19
15 31 мая, 20:06 15 3466762

>>3466752
а все исправил. не обновлял другой конец синей линии

Ответы67372

16 2 июня, 01:42 16 3467372

>>3465204 (OP)
>>3466762
Че у вас здесь происходит?
Это че за машина ебалка?

Ответы69469

17 4 июня, 19:18 17 3469469

114 Кб, 1202x79352 Кб, 638x45194 Кб, 1024x768

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

Ответы71937

4,4 Мб, mp4,
1920x1080, 0:34
18 7 июня, 20:52 18 3471937

>>3469469
короче доделал. теперь норм все. на графике угол педали A(o) и сила пружины F(kg) при угле

sage 19 7 июня, 23:11 19 3471977

>>3465204 (OP)
Это классическая проблема из области вычислительной геометрии и кинематики, которую можно разбить на несколько логических шагов. Цель — найти "безопасную" область конфигураций (углов поворота), где нет столкновений.

Ваше описание "чтобы черные отрезки не пересекались с зелеными, а были между ними всегда" — это ключевой момент. Это можно интерпретировать как две более строгие геометрические задачи:
Параллельность: Полоса, образованная черными линиями, должна быть параллельна полосе, образованной зелеными линиями.

Вложение: Черные отрезки должны полностью находиться внутри "коридора", очерченного зелеными отрезками.
Давайте решим эту задачу по шагам.

Шаг 1: Упрощение и формализация задачи
Для начала введем обозначения:
α (альфа) — угол поворота черных отрезков вокруг точки O1.
β (бета) — угол поворота зеленых отрезков вокруг точки O2.
γ (гамма) — угол поворота всей синей пластины (вместе с O1 и черными отрезками) вокруг O3.
Иерархия вращений:
Сначала вся система {A1B1, A2B2, O1} поворачивается на угол γ вокруг O3. Это дает нам новые координаты для O1, A1, B1, A2, B2.
Затем, уже в новой системе, отрезки {A1B1, A2B2} поворачиваются на угол α вокруг (нового) O1.
Зеленые отрезки просто поворачиваются на угол β вокруг O2.

Шаг 2: Условие параллельности (самое важное упрощение)
Чтобы черные линии были "между" зелеными, они должны быть параллельны друг другу. Это самое сильное ограничение, которое сразу связывает углы α и β.
Начальные углы:
Вычисляем начальный угол наклона черных линий, θ_black_init. Это можно сделать с помощью вектора (B1 - A1). θ_black_init = atan2(B1.y - A1.y, B1.x - A1.x).
Аналогично, начальный угол зеленых линий: θ_green_init = atan2(D1.y - C1.y, D1.x - C1.x).
Конечные углы:
Итоговый угол черных линий после всех вращений будет: θ_black_final = θ_black_init + γ + α.
Итоговый угол зеленых линий: θ_green_final = θ_green_init + β.
Условие: Для параллельности θ_black_final должен быть равен θ_green_final.
θ_black_init + γ + α = θ_green_init + β
Отсюда мы получаем прямую зависимость между β и α:
β = α + γ + (θ_black_init - θ_green_init)
Это гениальное упрощение! Теперь нам не нужно перебирать пары (α, β). Для любого выбранного α (и заданного γ) мы можем однозначно вычислить β, при котором системы будут параллельны. Задача свелась к поиску подходящего α.

Шаг 3: Условие вложения (поиск диапазона для α)
Теперь, когда линии параллельны, нам нужно убедиться, что черные отрезки находятся внутри "зеленого коридора". Это условие можно разбить на два:
Поперечное вложение: Полоса, образованная черными линиями, должна быть уже и находиться внутри полосы, образованной зелеными линиями.
Продольное вложение: Проекция черных отрезков на общую ось движения должна лежать внутри проекции зеленых отрезков.

Алгоритм решения:
Для заданного угла γ:
Подготовка (выполняется один раз):
Вычислите Δθ = θ_black_init - θ_green_init. Теперь β = α + γ + Δθ.
Найдите ширину черной и зеленой полос (W_black, W_green). Это расстояние между параллельными прямыми A1B1 и A2B2, и C1D1 и C2D2 соответственно.
Определите векторы от центров вращения до "центров" полос. Например, вектор от O1 до середины отрезка, соединяющего A1 и A2.
Основной цикл (для поиска α):
Мы ищем диапазон допустимых значений α. Это можно сделать аналитически (сложно) или численно (проще и надежнее).
Численный метод (рекомендуется):
Перебираем угол α с небольшим шагом (например, от -180° до +180° с шагом в 1°). Для каждого значения α:
Вычисляем β: β = α + γ + Δθ.
Находим текущие положения всех точек:
O1_new = rotate(O1, O3, γ)
A1_init_rot = rotate(A1, O3, γ) (и так для B1, A2, B2)
A1_final = rotate(A1_init_rot, O1_new, α) (и так для B1, A2, B2)
C1_final = rotate(C1, O2, β) (и так для D1, C2, D2)

Проверяем поперечное вложение:
Найдем уравнения двух зеленых прямых в виде ax + by + c = 0. Пусть это L_C1D1 и L_C2D2. Нормализуем их так, чтобы вектор нормали (a, b) был одинаковым.
Чтобы черные точки P (A1_final, B1_final, A2_final, B2_final) были между зелеными линиями, знаки (aP.x + bP.y + c1) и (aP.x + bP.y + c2) должны быть противоположными для всех четырех точек.
Упрощенная проверка: Найдите перпендикулярное расстояние от центральной оси зеленой полосы до центральной оси черной полосы (d_centers). Условие вложения: d_centers + W_black/2 <= W_green/2.

Проверяем продольное вложение:
Возьмем одну из линий, например, A1_final B1_final, как общую ось.
Спроецируем все 8 конечных точек (A1_final...D2_final) на эту ось.
Проекции черных точек образуют на оси отрезок [min_black, max_black].
Проекции зеленых точек образуют на оси отрезок [min_green, max_green].
Условие вложения: [min_black, max_black] должен полностью содержаться внутри [min_green, max_green]. То есть, min_green <= min_black и max_black <= max_green.

Результат:
Если оба условия (поперечное и продольное) выполнены, то текущий угол α является допустимым.
Собираем все допустимые α в один или несколько диапазонов.

Псевдокод
# --- Начальные данные ---
# Координаты точек A1, B1, A2, B2, C1, D1, C2, D2
# Координаты центров вращения O1, O2, O3

# --- Подготовка ---
theta_black_init = atan2(B1.y - A1.y, B1.x - A1.x)
theta_green_init = atan2(D1.y - C1.y, D1.x - C1.x)
delta_theta = theta_black_init - theta_green_init

# --- Входные данные для симуляции ---
gamma = ... # Заданный угол поворота вокруг O3

# --- Основной расчет ---
valid_alpha_ranges = []
for alpha in range(-180, 181): # Перебор с шагом в 1 градус

# 1. Вычисляем зависимый угол beta
beta = alpha + gamma + delta_theta

# 2. Вычисляем текущие координаты всех вершин
# Для черных (сначала вокруг O3, потом вокруг O1)
O1_new = rotate(O1, O3, gamma)
A1_temp = rotate(A1, O3, gamma)
# ... и для B1, A2, B2
A1_final = rotate(A1_temp, O1_new, alpha)
# ... и для B1, A2, B2

# Для зеленых (вокруг O2)
C1_final = rotate(C1, O2, beta)
# ... и для D1, C2, D2

# 3. Проверка вложения
is_transverse_fit = check_transverse_containment(A1_final, ..., D2_final)
is_longitudinal_fit = check_longitudinal_containment(A1_final, ..., D2_final)

if is_transverse_fit and is_longitudinal_fit:
# Этот alpha подходит. Добавляем его в список/диапазон.
add_to_valid_ranges(alpha)

# В valid_alpha_ranges теперь находятся все "безопасные" углы alpha
# для заданного gamma. Для любого alpha из этого диапазона,
# соответствующий beta гарантирует бесконфликтное прохождение.

Этот алгоритм позволит вам для любого положения "синей пластины" (γ) мгновенно вычислить все возможные углы α и β, при которых механизм будет работать без столкновений. "Оптимальность" здесь заключается в том, что мы не ищем одно решение, а находим всю область допустимых решений, из которой можно выбрать любое.

sage 19 7 июня, 23:11 19 3471977

>>3465204 (OP)
Это классическая проблема из области вычислительной геометрии и кинематики, которую можно разбить на несколько логических шагов. Цель — найти "безопасную" область конфигураций (углов поворота), где нет столкновений.

Ваше описание "чтобы черные отрезки не пересекались с зелеными, а были между ними всегда" — это ключевой момент. Это можно интерпретировать как две более строгие геометрические задачи:
Параллельность: Полоса, образованная черными линиями, должна быть параллельна полосе, образованной зелеными линиями.

Вложение: Черные отрезки должны полностью находиться внутри "коридора", очерченного зелеными отрезками.
Давайте решим эту задачу по шагам.

Шаг 1: Упрощение и формализация задачи
Для начала введем обозначения:
α (альфа) — угол поворота черных отрезков вокруг точки O1.
β (бета) — угол поворота зеленых отрезков вокруг точки O2.
γ (гамма) — угол поворота всей синей пластины (вместе с O1 и черными отрезками) вокруг O3.
Иерархия вращений:
Сначала вся система {A1B1, A2B2, O1} поворачивается на угол γ вокруг O3. Это дает нам новые координаты для O1, A1, B1, A2, B2.
Затем, уже в новой системе, отрезки {A1B1, A2B2} поворачиваются на угол α вокруг (нового) O1.
Зеленые отрезки просто поворачиваются на угол β вокруг O2.

Шаг 2: Условие параллельности (самое важное упрощение)
Чтобы черные линии были "между" зелеными, они должны быть параллельны друг другу. Это самое сильное ограничение, которое сразу связывает углы α и β.
Начальные углы:
Вычисляем начальный угол наклона черных линий, θ_black_init. Это можно сделать с помощью вектора (B1 - A1). θ_black_init = atan2(B1.y - A1.y, B1.x - A1.x).
Аналогично, начальный угол зеленых линий: θ_green_init = atan2(D1.y - C1.y, D1.x - C1.x).
Конечные углы:
Итоговый угол черных линий после всех вращений будет: θ_black_final = θ_black_init + γ + α.
Итоговый угол зеленых линий: θ_green_final = θ_green_init + β.
Условие: Для параллельности θ_black_final должен быть равен θ_green_final.
θ_black_init + γ + α = θ_green_init + β
Отсюда мы получаем прямую зависимость между β и α:
β = α + γ + (θ_black_init - θ_green_init)
Это гениальное упрощение! Теперь нам не нужно перебирать пары (α, β). Для любого выбранного α (и заданного γ) мы можем однозначно вычислить β, при котором системы будут параллельны. Задача свелась к поиску подходящего α.

Шаг 3: Условие вложения (поиск диапазона для α)
Теперь, когда линии параллельны, нам нужно убедиться, что черные отрезки находятся внутри "зеленого коридора". Это условие можно разбить на два:
Поперечное вложение: Полоса, образованная черными линиями, должна быть уже и находиться внутри полосы, образованной зелеными линиями.
Продольное вложение: Проекция черных отрезков на общую ось движения должна лежать внутри проекции зеленых отрезков.

Алгоритм решения:
Для заданного угла γ:
Подготовка (выполняется один раз):
Вычислите Δθ = θ_black_init - θ_green_init. Теперь β = α + γ + Δθ.
Найдите ширину черной и зеленой полос (W_black, W_green). Это расстояние между параллельными прямыми A1B1 и A2B2, и C1D1 и C2D2 соответственно.
Определите векторы от центров вращения до "центров" полос. Например, вектор от O1 до середины отрезка, соединяющего A1 и A2.
Основной цикл (для поиска α):
Мы ищем диапазон допустимых значений α. Это можно сделать аналитически (сложно) или численно (проще и надежнее).
Численный метод (рекомендуется):
Перебираем угол α с небольшим шагом (например, от -180° до +180° с шагом в 1°). Для каждого значения α:
Вычисляем β: β = α + γ + Δθ.
Находим текущие положения всех точек:
O1_new = rotate(O1, O3, γ)
A1_init_rot = rotate(A1, O3, γ) (и так для B1, A2, B2)
A1_final = rotate(A1_init_rot, O1_new, α) (и так для B1, A2, B2)
C1_final = rotate(C1, O2, β) (и так для D1, C2, D2)

Проверяем поперечное вложение:
Найдем уравнения двух зеленых прямых в виде ax + by + c = 0. Пусть это L_C1D1 и L_C2D2. Нормализуем их так, чтобы вектор нормали (a, b) был одинаковым.
Чтобы черные точки P (A1_final, B1_final, A2_final, B2_final) были между зелеными линиями, знаки (aP.x + bP.y + c1) и (aP.x + bP.y + c2) должны быть противоположными для всех четырех точек.
Упрощенная проверка: Найдите перпендикулярное расстояние от центральной оси зеленой полосы до центральной оси черной полосы (d_centers). Условие вложения: d_centers + W_black/2 <= W_green/2.

Проверяем продольное вложение:
Возьмем одну из линий, например, A1_final B1_final, как общую ось.
Спроецируем все 8 конечных точек (A1_final...D2_final) на эту ось.
Проекции черных точек образуют на оси отрезок [min_black, max_black].
Проекции зеленых точек образуют на оси отрезок [min_green, max_green].
Условие вложения: [min_black, max_black] должен полностью содержаться внутри [min_green, max_green]. То есть, min_green <= min_black и max_black <= max_green.

Результат:
Если оба условия (поперечное и продольное) выполнены, то текущий угол α является допустимым.
Собираем все допустимые α в один или несколько диапазонов.

Псевдокод
# --- Начальные данные ---
# Координаты точек A1, B1, A2, B2, C1, D1, C2, D2
# Координаты центров вращения O1, O2, O3

# --- Подготовка ---
theta_black_init = atan2(B1.y - A1.y, B1.x - A1.x)
theta_green_init = atan2(D1.y - C1.y, D1.x - C1.x)
delta_theta = theta_black_init - theta_green_init

# --- Входные данные для симуляции ---
gamma = ... # Заданный угол поворота вокруг O3

# --- Основной расчет ---
valid_alpha_ranges = []
for alpha in range(-180, 181): # Перебор с шагом в 1 градус

# 1. Вычисляем зависимый угол beta
beta = alpha + gamma + delta_theta

# 2. Вычисляем текущие координаты всех вершин
# Для черных (сначала вокруг O3, потом вокруг O1)
O1_new = rotate(O1, O3, gamma)
A1_temp = rotate(A1, O3, gamma)
# ... и для B1, A2, B2
A1_final = rotate(A1_temp, O1_new, alpha)
# ... и для B1, A2, B2

# Для зеленых (вокруг O2)
C1_final = rotate(C1, O2, beta)
# ... и для D1, C2, D2

# 3. Проверка вложения
is_transverse_fit = check_transverse_containment(A1_final, ..., D2_final)
is_longitudinal_fit = check_longitudinal_containment(A1_final, ..., D2_final)

if is_transverse_fit and is_longitudinal_fit:
# Этот alpha подходит. Добавляем его в список/диапазон.
add_to_valid_ranges(alpha)

# В valid_alpha_ranges теперь находятся все "безопасные" углы alpha
# для заданного gamma. Для любого alpha из этого диапазона,
# соответствующий beta гарантирует бесконфликтное прохождение.

Этот алгоритм позволит вам для любого положения "синей пластины" (γ) мгновенно вычислить все возможные углы α и β, при которых механизм будет работать без столкновений. "Оптимальность" здесь заключается в том, что мы не ищем одно решение, а находим всю область допустимых решений, из которой можно выбрать любое.

Показать весь текст

Обновить тред

« /pr/В начало тредаВеб-версияНастройки

/a//b//mu//s//vg/Все доски

Скачать тред только с превьюс превью и прикрепленными файлами

Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах.Подробнее

Пользуетесь скринридером — пишите, что можно улучшить.
Host-Food.ru — надёжный хостинг от 12 руб/мес | Free DNS
Зеркала М.Двача: m2ch.hk, m2ch.gq, m2ch.cf, m2ch.fapp.in, m2ch.lib, m2chfapiswfw2wcakptqp4o6ltgchvjuxfab7urxlduraomtlnhw5xad.onion