3d форум по Blender

Blender => Моделирование => Тема начата: zdmihail от 26 Июнь 2018, 20:47:48

Название: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: zdmihail от 26 Июнь 2018, 20:47:48
Здравствуйте. У меня стоит задача высокоточного моделирования объекта.

Есть 3 NURBS сферы:
(https://cdn1.savepice.ru/uploads/2018/6/26/b417abf60994f9529da4451cce746f59-full.png)

Нужно определить координаты точки пересечения 3-х NURBS сфер (там, где курсор) с максимальной точностью,
 чтобы создать на ней следующий элемент.
Как это сделать?
Сейчас подобные вещи приходится делать с помощью ручных расчетов, что весьма трудоемко.
Хочу переложить эту работу на компьютер.
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: Samovar от 26 Июнь 2018, 21:30:45
NURBS  в Блендере не реализованы до конца, и не поддерживаются...  это уже атавизм...
Блендер - это не CAD (САПР), а прога для художников больше (с кучей погрешностей и неточностей), чем для инженеров...
Каков смысл сего предприятия? Что там настолько неимоверно точно надо разместить?  :)
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: zdmihail от 26 Июнь 2018, 22:13:52
Смысл в эксперименте по геометрической упаковке сфер. В точке пересечения поверхностей нужно разместить следующую сферу, затем выбрать другую точку пересечения и разместить там еще сферу, и т.д.

Возможно, я действительно выбрал неправильный инструмент. Можете посоветовать свободную CAD систему, где вышеописанная задача легко решается, желательно с Python API?
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: Samovar от 26 Июнь 2018, 22:18:56
Лично я не в курсе, т.к больше художник, чем инженер... Но у нас тут есть знающие люди, которые посоветуют нужный бесплатный софт для таких вещей... подожди ответов день-два...
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: Striver от 26 Июнь 2018, 22:56:21
Цитировать
Сейчас подобные вещи приходится делать с помощью ручных расчетов, что весьма трудоемко.
Хочу переложить эту работу на компьютер.
А формула есть готовая, вычисляющая координаты этой точки пересечения? Если есть, можно будет слепить Питоновский скрипт, перемещающий курсор в эту точку.
Если такой формулы пока нет, завтра попробую подумать на эту тему.
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: zdmihail от 27 Июнь 2018, 00:04:49
Оказывается, есть математический алгоритм позволяющий найти координаты точек пересечения 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
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: Samovar от 27 Июнь 2018, 00:47:29
Цитировать
Оказывается, есть математический алгоритм позволяющий найти координаты точек пересечения 3-х сфер.
Ну и что дальше? Вопрос закрыт?
Вероятно, кому-то эта функция кроме тебя будет полезна... но скорей всего, тогда уже API Блендера будет снова совсем иной :)
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: zdmihail от 27 Июнь 2018, 02:13:47
Цитировать
Ну и что дальше? Вопрос закрыт?

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

Для сравнения, структура, которую я создавал, вычисляя точки пересечения индивидуально:
(https://cdn1.savepice.ru/uploads/2018/6/27/e205afee442279f3cfbcaec6a9b59649-full.png)
Здесь все сходится и 4 сферы пересекаются в одной точке.

А это то, что получается с применением вышеуказанной функции:
(https://cdn1.savepice.ru/uploads/2018/6/27/2cbe3e04bfce40406c4d72ede5e59dd6-full.png)
Здесь образовался перешеек, из-за накопившейся погрешности.

Мне необходим метод расчетов, где не будет накапливаться погрешности.
Чтобы погрешность была такая же или меньше, чем я когда я делал расчеты вручную.
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: Samovar от 27 Июнь 2018, 02:41:45
... тупанул... попробую намутить тебе видеопример в виде гифки:)
...если не усну :)
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: Samovar от 27 Июнь 2018, 02:51:02
Точек будет куча, а не одна, при пересечении нескольких окружностей (или сфер - это концептуально пофиг т.к. сфера в 2D всегда даёт проекцию одной и той же окружности)...
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: Samovar от 27 Июнь 2018, 03:09:43
Точек будет куча, а не одна, при пересечении нескольких окружностей...
не... действительно, просто нарисуй кучу окружностей (или сфер) с их радиусами равными расстоянию от центра пересечения :)
Если это не сработает, то я не знаю  :)
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: Николай Николаев от 27 Июнь 2018, 03:50:58
>>Здесь образовался перешеек, из-за накопившейся погрешности.
>>Мне необходим метод расчётов, где не будет накапливаться погрешности.
>>Чтобы погрешность была такая же или меньше, чем я когда я делал расчёты вручную.
... мне думается, что это не проявление эффекта влияния накопившейся погрешности, а результат противоречивости постановки задачи, поскольку не для любой тройки сфер имеется решение ...
... если есть возможность, выложите весь текст задания (с условиями, ограничениями) ...
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: Striver от 27 Июнь 2018, 08:44:05
Попытался погуглить на эту тему, нашел похожий код, т.е. кажется что должно быть всё правильно.
Но попытка повторить всё это с твоей программой тоже привела заметному сдвигу.
Не думаю, что это погрешность, слишком большое отклонение, кажется что-то с самим алгоритмом.

Цитировать
Для сравнения, структура, которую я создавал, вычисляя точки пересечения индивидуально:
Здесь все сходится и 4 сферы пересекаются в одной точке.
Выложи тут, как ты их вычислял "индивидуально". По каким формулам?
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: Samovar от 27 Июнь 2018, 08:49:17
Блядь (извините, но грубость привлекает внимание, а я этого и хотел), ну никак у нескольких сфер или окружностей не может быть единого центра пересечения, если их радиусы меньше или больше расстояния до точки пересечения :)
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: Striver от 27 Июнь 2018, 09:06:51
Цитировать
ну никак у нескольких сфер или окружностей не может быть единого центра пересечения, если их радиусы меньше или больше расстояния до точки пересечения
Не стал полную цитату приводить  :)

Точек пересечения трёх сфер может быть:
Случай, когда точек пересечения нет, в коде обработан в строках:
Код
if temp4<0:                                          
        raise Exception("The three spheres do not intersect!");
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: Samovar от 27 Июнь 2018, 09:22:54
Да и хрен с ним... мне вообще непонятно, нафига это? По прикалываться?
Ясен пень, что сферы могут пересекаться, и не пересекаться, как угодно, в зависимости от их параметров...
Человек может  нормально объяснить, что он хочет получить в итоге, и ради чего это всё "извращение"?
А если  даже объяснить не может, зачем и для чего ему это, то и нафиг тратить на него время?
Вот, что он пишет:
Цитировать
Смысл в эксперименте по геометрической упаковке сфер. В точке пересечения поверхностей нужно разместить следующую сферу, затем выбрать другую точку пересечения и разместить там еще сферу, и т.д.
... А я ему дал вполне годный алгоритм, для этого, по-моему, наглядно, хоть не точно и схематично.
(http://blender-3d.ru/forum/index.php?action=dlattach;topic=2300.0;attach=9143;image)
 Ты не согласен? :)


Код ему написать, как всех разбаловал Николай?... ну пишите :) Я  всегда даю концепцию решения, а не готовое решение, иначе челы перестанут пытаться самостоятельно соображать и учится...

Что мешает даже вручную нарисовать эти сферы в Блендере, именно от центра их "пересечения"? А если напридумывать прогу на великом  Python'e, то вообще просто :)
Название: Re: Как узнать точку пересечения 3-х NURBS поверхностей?
Отправлено: Samovar от 27 Июнь 2018, 10:04:46
Мне вот иногда непонятно, что люди не осознают, что сфера - это окружность в любом случае, с какой стороны на неё не посмотри :)  Она 2D, хоть и в 3D... и все геометрические построения  её в 2D, будут справедливы и для 3D, и наоборот  :)

А на самом деле, раз возникают подобные вопросы, то это очень печально :)  Это средняя школа и уроки геометрии и черчения для подростков 12-13 лет... У меня  практика от ВУЗ была в школе несколько месяцев именно для таких.... преподавал им черчение, потому, я в курсе этого :)