LINUX.ORG.RU
ФорумTalks

Посчитать длинну кривой пересечения сферы и поверхности.


0

0

Привет!

Надо сделать сабж. Есть поверхность z=f(x,y) и сфера: x0,y0,z0,R. Можно написать программу перевода этого дерьма в сферическую СК, и методом перебора по широте/долготе, искать отличие сферы и поверхности в этой точке, меньше эпсилона - считаем длинну отрезка и делаем следущий шаг.

Велосипед запарил. Хочу сделать в Octave или чем небудь другом. Кто-то подскажет куда копать?


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

Deleted
()
Ответ на: комментарий от Deleted

Это так, смутные воспоминания из универа :(

Deleted
()

Что имеется ввиду под "велосипедом"? Готовый алгоритм или программа вряд ли есть; если есть, то, как уже посоветовали, искать в сторону дифференциальной геометрии. Либо в алгоритмах для компьютерной графики, там такое должно быть.

Я бы делал так:

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

Можно описывать поверхности неявным образом, типа f1(x,y,z)=0, f2(x,y,z)=0. Тогда система из этих двух уравнений будет описывать саму линию пересечения.

Одну из неизвестных берем в виде параметра, например

Z0 - R <= Z <= Z0 + R,

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

Получаем набор точек на линии пересечения.

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

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

Я бы сделал сначала перебором, на грубой сетке, потом бы уточнял каждое приближение, решая систему уравнений.

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

gene
()

А чего, тут делов на пять копеек - смени координаты, переведи поверхность в сферические и считай себе.

e
()

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

Deleted
()

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

bugmaker ★★★★☆
()
Ответ на: комментарий от Deleted

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

Обычно делают наоборот: векторное произведение двух произвольных касательных в данной точке, линейно-независимых векторов дает нормаль к поверхности в данной точке :)

Нормаль - она одна (ну, при соотв. оговорках о гладкости и т.п.)

annoynimous ★★★★★
()

Вообще не понимаю проблемы: в сферических координатах уравнение сферы r=R=const. Надо переписать уравнение поверхности из формы z=f(x,y) в форму r=g(\theta, \phi). Это самая сложная часть. А затем просто найти линию уровня функции g: g(\theta,\phi) = const=R, для чего нужно опять-таки решать уравнение. Полученное уравнение и есть искомое уравнение линии как неявная функция от (\theta,\phi). После чего можно подставить в КИПР (криволинейный интеграл первого рода) и получить ответ.

annoynimous ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.