Компьютерная симуляция замкнутой кривой
Должно получиться достаточно предсказуемо.
На каждом шаге какую-то вершину хочется подвинуть на какой-то вектор, но при этом чтобы кривая осталась хорошей. У меня есть идея, например, следить чтобы расстояние между концами i-го и i+k-го сегментов не сильно отличалось от длины кривой между ними для небольших k, но это еще не гарантирует хорошести кривой.
К сожалению у других ничего интересного не происходило, по крайней мере по этому запросу.
первая ссылка же - там моделируют как объединение одномерных упругих стержней (пружинок). Если смущает, жесткость можешь взять очень большую - тогда веревка будет нерастяжимой
ну вот 1) Веревка не замкнутая, соответственно никаких проблем с постоянной длиной нет.
2) Там на веревку действуют только "хорошие" силы трения и упругости. Что будет если к каждой частице приложить рандомную силу? Правильно. веревку расколбасит, мне же хочется, чтобы она как могла двинулась в нужном направлении, при этом сохранив свою хорошесть.
Короче это слишком примитивная модель.
Это не помогает со вторым условием - кривая может стать плохой в результате таких действий.Попробуй хоть как-нибудь формализовать, что такое "хорошая" кривая.
например, если хочется, чтобы кривая не слипалась, то компенсировать изменение длины можно следующим образом: считать среднее расстояние от центра масс до вершины и двигать вершины к среднему (или от среднего - если нужно компенсировать уменьшение длины). тогда чем больше одну вершину вытягиваешь в сторону, тем больше остальные складываются в круг (а не в гармошку)
Про 2) не понял - ну приложил ты какую-то рандомную силу, получил рандомный результат. Ты так говоришь, как будто это что-то плохое.
АПД - если не хочешь больших поворотов звеньев относительно друг друга - можно добавить еще малую упругую силу, стремящуюся сделать угол между соседними звеньями равным нулю. Т.е. тогда в такой модели будет две жесткости - одна относительно большая (жесткость на растяжение другая относительно маленькая (жесткость на поворот).
Ты так говоришь, как будто это что-то плохое.да, плохое.
ТС хочет разложить систему на ряд независимых переменных, при чем чтобы произвольные шевеление одной переменной не затрагивали остальные переменные. Одной из переменной является "хорошесть", которая не должна меняться при изменение независимой переменной "место положение вершины i".
Но может быть ситуация, когда кривая идет близко к прямой, и при этом быстро обвивается вокруг нее. Такая кривая тоже плохая, хотя и удовлетворяет критерию. Может быть этого можно избежать аналогичным критерием, только на производные.
Может быть этого можно избежать аналогичным критерием, только на производные.начни с этого - это часто встречающийся подход.
Гармошка тебе не нравится из-за того, что там есть изломы (углы близки к острым)? или из-за того, что она "неоптимальная" (много длины веревки на малое расстояние?)
Вообще я, конечно, надеюсь, что кто-то уже знает как решать эту задачу или знает, где написано, как ее решать. Не думаю, что что-то хорошее можно прямо с лету придумать.
Гармошка тебе не нравится из-за того, что там есть изломы?Да, она портит первую производную, которая используется в расчете силы.
Кстати, хорошая идея. Можно определить хорошесть как достаточную непрерывность всех функций (типа производной которые участвуют в расчете силы.
Вообще я, конечно, надеюсь, что кто-то уже знает как решать эту задачу или знает, где написано, как ее решать.Чтобы задачу решить ее надо с начала сформулировать. Кроме тебя критерии "хорошести" никто не сформулирует, т.к. в каждой задаче хочется что-то свое.
Вот методы поддержания "хорошести" уже можно брать готовые.
Что будет если к каждой частице приложить рандомную силу? Правильно. веревку расколбасит, мне же хочется, чтобы она как могла двинулась в нужном направлении, при этом сохранив свою хорошесть.А если не к каждой прикладывать, а только к небольшому числу?
Тогда она только в окрестностях этих точек испортится.
ну остальные должны следовать за ними - по законам типа упругости
следить чтобы расстояние между концами i-го и i+k-го сегментов не сильно отличалось от длины кривой между ними для небольших kможно следить за тем, чтобы разница углов между соседними звеньями была малой и не меняла знак более одного раза на некоторой более широкой области в несколько звеньев
Пусть так, но это уже другая задача.
А, вижу, уже в общих чертах советовали. Тогда конкретизирую: представить верёвку имеющей толщину и учесть упругость этой верёвки как тела (а не как системы одномерных пружин). Вроде, в Ландафшице, в 7 томе, были рассмотрены соответствующие силы, и уж точно это есть во множестве учебников по упругости.
При этом в симуляциях должно быть несложно сделать не только упругость, минимизирующую не угол отклонения от прямой, а угол отклонения от старой кривизны — тем самым, задав некоторую память формы.
На самом деле длину сегмента тоже скорее всего придётся не абсолютно жёсткой делать, чтоб не было бесконечных сил. Но если жёстко сделать, то не сильно флуктуировать будет. Подойдёт гармонический потенциал либо FENE.
Вообще то что тебе надо довольно сильно похоже на моделирование полимерной молекулы. Больше всего тебе подходит модель wormlike chain (WLC она же semiflexible chain, она же Kratky-Porod.
Но она не дискретная, поэтому в компьютере с ней надо сделать типа того что я выше написал. Это делают, получается нормально.
Правда, в физике там температура есть, рандомные силы и т.д. Тебе они не нужны, но, кстати, зря опасаешься что от них прямо сразу "расколбасит". Зависит от температуры и от твоих параметров жёсткости.
пропорционально косинусу удобнее всего на самом деле ... На самом деле длину сегмента тоже скорее всего придётся не абсолютно жёсткой делать, чтоб не было бесконечных сил.Сделал так, пока получается то, что надо.

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