Компьютерная симуляция замкнутой кривой

blackout

Пока в самых общих чертах представляю, что мне нужно. Хочется как иметь какое-то представление замкнутой кривой, например в виде ломаной. И иметь возможность по некоторому произвольному правилу двигать ее, например отдельно двигая каждую вершину. При этом хочется, чтобы:
1) Длина кривой оставалась постоянной или почти постоянной.
2) Кривая оставалась "красивой" - то есть, например, не сжималась локально в гармошку.
Может быть кто-то видел что-то подобное?

antcatt77

При передвижении одной вершины двигать все остальные к центру (или от центра) масс, компенсируя изменения длины кривой от движения вершины.
Должно получиться достаточно предсказуемо.

sashok01

В общем-то вопрос довольно часто возникает в интернете, посмотри, что происходило у других

blackout

Это не помогает со вторым условием - кривая может стать плохой в результате таких действий.
На каждом шаге какую-то вершину хочется подвинуть на какой-то вектор, но при этом чтобы кривая осталась хорошей. У меня есть идея, например, следить чтобы расстояние между концами i-го и i+k-го сегментов не сильно отличалось от длины кривой между ними для небольших k, но это еще не гарантирует хорошести кривой.

blackout

К сожалению у других ничего интересного не происходило, по крайней мере по этому запросу.

sashok01

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

blackout

Там:
1) Веревка не замкнутая, соответственно никаких проблем с постоянной длиной нет.
2) Там на веревку действуют только "хорошие" силы трения и упругости. Что будет если к каждой частице приложить рандомную силу? Правильно. веревку расколбасит, мне же хочется, чтобы она как могла двинулась в нужном направлении, при этом сохранив свою хорошесть.
Короче это слишком примитивная модель.

antcatt77

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

sashok01

Сформулируй уже критерий "хорошести", а то не очень понятно. И да, не вижу никаких проблем сделать веревку по той ссылке замкнутой - проблема сохранения длины решается за счет упругих возвращающих сил каждого звена.
Про 2) не понял - ну приложил ты какую-то рандомную силу, получил рандомный результат. Ты так говоришь, как будто это что-то плохое.
АПД - если не хочешь больших поворотов звеньев относительно друг друга - можно добавить еще малую упругую силу, стремящуюся сделать угол между соседними звеньями равным нулю. Т.е. тогда в такой модели будет две жесткости - одна относительно большая (жесткость на растяжение другая относительно маленькая (жесткость на поворот).

antcatt77

Ты так говоришь, как будто это что-то плохое.
да, плохое.
ТС хочет разложить систему на ряд независимых переменных, при чем чтобы произвольные шевеление одной переменной не затрагивали остальные переменные. Одной из переменной является "хорошесть", которая не должна меняться при изменение независимой переменной "место положение вершины i".

blackout

Пока речь только о локальной хорошести. От гармошки спасет вышеприведенный критерий "следить чтобы расстояние между концами i-го и i+k-го сегментов не сильно отличалось от длины кривой между ними для небольших k".
Но может быть ситуация, когда кривая идет близко к прямой, и при этом быстро обвивается вокруг нее. Такая кривая тоже плохая, хотя и удовлетворяет критерию. Может быть этого можно избежать аналогичным критерием, только на производные.

antcatt77

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

blackout

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

blackout

Гармошка тебе не нравится из-за того, что там есть изломы?
Да, она портит первую производную, которая используется в расчете силы.
Кстати, хорошая идея. Можно определить хорошесть как достаточную непрерывность всех функций (типа производной которые участвуют в расчете силы.

antcatt77

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

Nefertyty

Что будет если к каждой частице приложить рандомную силу? Правильно. веревку расколбасит, мне же хочется, чтобы она как могла двинулась в нужном направлении, при этом сохранив свою хорошесть.
А если не к каждой прикладывать, а только к небольшому числу?

blackout

Тогда она только в окрестностях этих точек испортится.

Nefertyty

ну остальные должны следовать за ними - по законам типа упругости

ipolk36

следить чтобы расстояние между концами i-го и i+k-го сегментов не сильно отличалось от длины кривой между ними для небольших k
можно следить за тем, чтобы разница углов между соседними звеньями была малой и не меняла знак более одного раза на некоторой более широкой области в несколько звеньев

blackout

Пусть так, но это уже другая задача.

Martika1

а нельзя насимулировать с учётом упругости? Просто добавить упругие силы
А, вижу, уже в общих чертах советовали. Тогда конкретизирую: представить верёвку имеющей толщину и учесть упругость этой верёвки как тела (а не как системы одномерных пружин). Вроде, в Ландафшице, в 7 томе, были рассмотрены соответствующие силы, и уж точно это есть во множестве учебников по упругости.
При этом в симуляциях должно быть несложно сделать не только упругость, минимизирующую не угол отклонения от прямой, а угол отклонения от старой кривизны — тем самым, задав некоторую память формы.

demiurg

Допустим, моделируешь из жёстких сегментов. Тогда просто поставь гармонический потенциал на угол между соседними сегментами (пропорционально косинусу удобнее всего на самом деле). Должно удовлетворить.
На самом деле длину сегмента тоже скорее всего придётся не абсолютно жёсткой делать, чтоб не было бесконечных сил. Но если жёстко сделать, то не сильно флуктуировать будет. Подойдёт гармонический потенциал либо FENE.
Вообще то что тебе надо довольно сильно похоже на моделирование полимерной молекулы. Больше всего тебе подходит модель wormlike chain (WLC она же semiflexible chain, она же Kratky-Porod.
Но она не дискретная, поэтому в компьютере с ней надо сделать типа того что я выше написал. Это делают, получается нормально.
Правда, в физике там температура есть, рандомные силы и т.д. Тебе они не нужны, но, кстати, зря опасаешься что от них прямо сразу "расколбасит". Зависит от температуры и от твоих параметров жёсткости.

blackout

пропорционально косинусу удобнее всего на самом деле ... На самом деле длину сегмента тоже скорее всего придётся не абсолютно жёсткой делать, чтоб не было бесконечных сил.
Сделал так, пока получается то, что надо.

demiurg

кулъ