Автор Тема: Как узнать точку пересечения 3-х NURBS поверхностей?  (Прочитано 4240 раз)

Оффлайн zdmihail

  • Житель
Здравствуйте. У меня стоит задача высокоточного моделирования объекта.

Есть 3 NURBS сферы:


Нужно определить координаты точки пересечения 3-х NURBS сфер (там, где курсор) с максимальной точностью,
 чтобы создать на ней следующий элемент.
Как это сделать?
Сейчас подобные вещи приходится делать с помощью ручных расчетов, что весьма трудоемко.
Хочу переложить эту работу на компьютер.
« Последнее редактирование: 26 Июнь 2018, 21:11:11 от zdmihail »

Оффлайн Samovar

  • Житель
NURBS  в Блендере не реализованы до конца, и не поддерживаются...  это уже атавизм...
Блендер - это не CAD (САПР), а прога для художников больше (с кучей погрешностей и неточностей), чем для инженеров...
Каков смысл сего предприятия? Что там настолько неимоверно точно надо разместить?  :)

Оффлайн zdmihail

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

Возможно, я действительно выбрал неправильный инструмент. Можете посоветовать свободную CAD систему, где вышеописанная задача легко решается, желательно с Python API?

Оффлайн Samovar

  • Житель
Лично я не в курсе, т.к больше художник, чем инженер... Но у нас тут есть знающие люди, которые посоветуют нужный бесплатный софт для таких вещей... подожди ответов день-два...

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Цитировать
Сейчас подобные вещи приходится делать с помощью ручных расчетов, что весьма трудоемко.
Хочу переложить эту работу на компьютер.
А формула есть готовая, вычисляющая координаты этой точки пересечения? Если есть, можно будет слепить Питоновский скрипт, перемещающий курсор в эту точку.
Если такой формулы пока нет, завтра попробую подумать на эту тему.

Оффлайн zdmihail

  • Житель
Оказывается, есть математический алгоритм позволяющий найти координаты точек пересечения 3-х сфер.
Нашел код на Python и адаптировал его для решения моей задачи:
Код
import numpy                                             
from numpy import sqrt, dot, cross                       
from numpy.linalg import norm                           

#P1,P2,P3 - координаты центров сфер, r - радиус сфер
def trilaterate(P1,P2,P3,r):                     
    temp1 = P2-P1                                       
    e_x = temp1/norm(temp1)                             
    temp2 = P3-P1                                       
    i = dot(e_x,temp2)                                   
    temp3 = temp2 - i*e_x                               
    e_y = temp3/norm(temp3)                             
    e_z = cross(e_x,e_y)                                 
    d = norm(P2-P1)                                     
    j = dot(e_y,temp2)                                   
    x = (d*d) / (2*d)                   
    y = (-2*i*x + i*i + j*j) / (2*j)       
    temp4 = r*r - x*x - y*y                           
    if temp4<0:                                         
        raise Exception("The three spheres do not intersect!");
    z = sqrt(temp4)                                     
    p_12_a = P1 + x*e_x + y*e_y + z*e_z                 
    p_12_b = P1 + x*e_x + y*e_y - z*e_z                 
    return p_12_a,p_12_b #возвращаем координаты точек пересечения 3-х сфер 

#получаем координаты 3-х выделенных объектов
a = numpy.array(bpy.context.selected_objects[0].location)
b = numpy.array(bpy.context.selected_objects[1].location)
c = numpy.array(bpy.context.selected_objects[2].location)

p = trilaterate(a,b,c,1) #получаем точки пересечения выделенных сфер, r=1

#создаем новую сферу в одной из точек пересечения
bpy.ops.surface.primitive_nurbs_surface_sphere_add(location=p[0])

Выделяем 3 сферы, выполняем этот код и точно на их пересечении появляется 4-я.

У меня все сферы одинакового радиуса, поэтому я упростил функцию trilaterate.
Функция, возвращающая координаты точек пересечения 3-х сфер с произвольными радиусами:
Код
import numpy                                             
from numpy import sqrt, dot, cross                       
from numpy.linalg import norm                           

# Find the intersection of three spheres                 
# P1,P2,P3 are the centers, r1,r2,r3 are the radii       
# Implementaton based on Wikipedia Trilateration article.                             
def trilaterate(P1,P2,P3,r1,r2,r3):                     
    temp1 = P2-P1                                       
    e_x = temp1/norm(temp1)                             
    temp2 = P3-P1                                       
    i = dot(e_x,temp2)                                   
    temp3 = temp2 - i*e_x                               
    e_y = temp3/norm(temp3)                             
    e_z = cross(e_x,e_y)                                 
    d = norm(P2-P1)                                     
    j = dot(e_y,temp2)                                   
    x = (r1*r1 - r2*r2 + d*d) / (2*d)                   
    y = (r1*r1 - r3*r3 -2*i*x + i*i + j*j) / (2*j)       
    temp4 = r1*r1 - x*x - y*y                           
    if temp4<0:                                         
        raise Exception("The three spheres do not intersect!");
    z = sqrt(temp4)                                     
    p_12_a = P1 + x*e_x + y*e_y + z*e_z                 
    p_12_b = P1 + x*e_x + y*e_y - z*e_z                 
    return p_12_a,p_12_b

Оффлайн Samovar

  • Житель
Цитировать
Оказывается, есть математический алгоритм позволяющий найти координаты точек пересечения 3-х сфер.
Ну и что дальше? Вопрос закрыт?
Вероятно, кому-то эта функция кроме тебя будет полезна... но скорей всего, тогда уже API Блендера будет снова совсем иной :)

Оффлайн zdmihail

  • Житель
Цитировать
Ну и что дальше? Вопрос закрыт?

Нет, оказывается, вопрос пока открыт. Эта функция вычисляет точку пересечения с ошибкой,
 которая затем накапливается, что видно уже на 3-й итерации..

Для сравнения, структура, которую я создавал, вычисляя точки пересечения индивидуально:

Здесь все сходится и 4 сферы пересекаются в одной точке.

А это то, что получается с применением вышеуказанной функции:

Здесь образовался перешеек, из-за накопившейся погрешности.

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

Оффлайн Samovar

  • Житель
... тупанул... попробую намутить тебе видеопример в виде гифки:)
...если не усну :)
« Последнее редактирование: 27 Июнь 2018, 03:19:40 от Samovar »

Оффлайн Samovar

  • Житель
Точек будет куча, а не одна, при пересечении нескольких окружностей (или сфер - это концептуально пофиг т.к. сфера в 2D всегда даёт проекцию одной и той же окружности)...
« Последнее редактирование: 27 Июнь 2018, 03:15:59 от Samovar »

Оффлайн Samovar

  • Житель
Точек будет куча, а не одна, при пересечении нескольких окружностей...
не... действительно, просто нарисуй кучу окружностей (или сфер) с их радиусами равными расстоянию от центра пересечения :)
Если это не сработает, то я не знаю  :)
« Последнее редактирование: 27 Июнь 2018, 03:48:04 от Samovar »

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
>>Здесь образовался перешеек, из-за накопившейся погрешности.
>>Мне необходим метод расчётов, где не будет накапливаться погрешности.
>>Чтобы погрешность была такая же или меньше, чем я когда я делал расчёты вручную.
... мне думается, что это не проявление эффекта влияния накопившейся погрешности, а результат противоречивости постановки задачи, поскольку не для любой тройки сфер имеется решение ...
... если есть возможность, выложите весь текст задания (с условиями, ограничениями) ...

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Попытался погуглить на эту тему, нашел похожий код, т.е. кажется что должно быть всё правильно.
Но попытка повторить всё это с твоей программой тоже привела заметному сдвигу.
Не думаю, что это погрешность, слишком большое отклонение, кажется что-то с самим алгоритмом.

Цитировать
Для сравнения, структура, которую я создавал, вычисляя точки пересечения индивидуально:
Здесь все сходится и 4 сферы пересекаются в одной точке.
Выложи тут, как ты их вычислял "индивидуально". По каким формулам?

Оффлайн Samovar

  • Житель
Блядь (извините, но грубость привлекает внимание, а я этого и хотел), ну никак у нескольких сфер или окружностей не может быть единого центра пересечения, если их радиусы меньше или больше расстояния до точки пересечения :)

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Цитировать
ну никак у нескольких сфер или окружностей не может быть единого центра пересечения, если их радиусы меньше или больше расстояния до точки пересечения
Не стал полную цитату приводить  :)

Точек пересечения трёх сфер может быть:
  • ни одной, если сферы слишком далеко друг от друга, и окружности их попарных пересечений не пересекаются.
  • 2, если они достаточно близко к друг другу
  • 1 - вырожденный случай, когда 3-я сфера касается окружности пересечения первой и второй сфер (две точки второго случая сливаются в одну)
Случай, когда точек пересечения нет, в коде обработан в строках:
Код
if temp4<0:                                          
        raise Exception("The three spheres do not intersect!");

 


Яметрика

* По форуму

* Рекламный блок

* Последние вложения

1 (1).png
Скачано: 66
Автор: LEXA ANЭGROWND
blender.png
Скачано: 76
Автор: ipv2007
4.png
Скачано: 98
Автор: hiroyukiss
2.png
Скачано: 120
Автор: hiroyukiss

Скачано: 110
Автор: Dilifa12