2013-09-19 4 views
3

Я уже отвечал на этот вопрос по этой теме: Speeding up a closest point on a hyperbolic paraboloid algorithmплощадь поверхности в Hypar (гиперболический параболоид)

Указанные четыре точки (p0, p1, p2, p3), чтобы определить doubly ruled hyperbolic paraboloid, что является лучшим (самый быстрый) способ вычислить его площадь поверхности с помощью модуля numpy python?

+2

Пытался что-нибудь до сих пор? – reptilicus

+0

Эта поверхность, как представляется, описывается с использованием конечных элементов, поэтому вы должны рассчитать площадь для каждого из них и суммировать их ... –

+0

@SaulloCastro извините, если изображение вводит в заблуждение. Сетка здесь видна только для визуализации поверхности. Поверхностный тип, с которым я имею дело, представляет собой двукратно управляемый гиперболический параболоид [link] (http://en.wikipedia.org/wiki/Doubly_ruled_surface) – Fnord

ответ

3

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

s = p0 + u * (p1 - p0) + v * (p3 - p0) + u * v * (p2 - p3 - p1 + p0) = 
    p0 + u * a + v * b + u * v * c 

с областью, ограниченной ваших четырех точек, отстоящих 0 <= u <= 1 и 0 <= v <= 1.

Вы можете получить два вектора касательной к поверхности путем дифференцирования:

t1 = ds/du = a + v * c 
t2 = ds/dv = b + u * c 

И вы можете получить вектор, перпендикулярный к двум другим, с нормой, равной площади параллелограмма, описанного ими, принимая их декартово произведение:

A = t1 x t2 = a x b + u * a x c + v * c x b 

заманчиво просто идти вперед и интегрировать, но это его норма вы хотите интегрировать, а не сам вектор. Я пробовал подавать это в Mathematica, чтобы узнать, придумает ли оно какое-нибудь хорошее закрытое решение, но это уже несколько минут, не прибывая нигде. Таким образом, вы можете также сделать вещи численно:

def integrate_hypar(p0, p1, p2, p3, n=100): 
    a = p1 - p0 
    b = p3 - p0 
    c = p2 - p3 - p1 + p0 
    delta = 1/n 
    u = np.linspace(0,1, num=n, endpoint=False) + delta/2 
    axb = np.cross(a, b) 
    axc = np.cross(a, c) 
    cxb = np.cross(c, b) 
    diff_areas = (axb + u[:, None, None] * axc + 
        u[:, None] * cxb) * delta * delta 
    diff_areas *= diff_areas 
    diff_areas = np.sum(diff_areas, axis=-1) 
    diff_areas = np.sqrt(diff_areas) 
    return np.sum(diff_areas) 

С точки данных из другого вопроса, я получаю:

p0 = np.array([1.15, 0.62, -1.01]) 
p1 = np.array([1.74, 0.86, -0.88]) 
p2 = np.array([1.79, 0.40, -1.46]) 
p3 = np.array([0.91, 0.79, -1.84]) 

>>> integrate_hypar(p0, p1, p2, p3) 
0.54825122958719719 
+0

Я получил 0.0, возвращенный из вашего кода, а затем сделал эту быструю коррекцию, и она работает! 'delta = 1./n' вместо' delta = 1/n' Еще раз спасибо! Ты машина! – Fnord

+0

Это такой хороший ответ - мне бы очень хотелось увидеть вопрос, осужденный к математике. –

Смежные вопросы