2013-04-12 6 views
2

Я изобразили n случайные точки (черные точки) и используется триангуляции Делоне, теперь я хочу, чтобы интерполировать m случайных точек оценки (красные точки) поэтому мне нужно чтобы вычислить, какой треугольник находится в точке оценки.Как найти триангуляции Делоне грани, содержащие заданные точки

Каков подход для вычисления вершин треугольника для каждой точки?

+0

Вы задаете тег «триангуляции» на этот вопрос. Означает ли это, что треугольники не пересекаются? Составляют ли они триангуляцию какого-либо объекта (укажите, если это возможно)? – unkulunkulu

+0

Вы можете взглянуть на SciPy, похоже, что у него есть реализация этой проблемы. Вы можете начать здесь http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.Delaunay.html – unkulunkulu

+0

Я сделал существенное изменение на ваш вопрос, чтобы сделать его конкретно о триангуляции delaunay (так как это специальный предмет). Конечно, вы можете откатиться, но я считаю это более подходящим :) Существующие ответы все же применимы, конечно, но я считаю, что для треугольных триангуляций существуют более эффективные алгоритмы. – unkulunkulu

ответ

2

Для данного треугольника ABC точка находится внутри треугольника, если она находится на той же стороне линии AB, что и точка C на той же стороне линии BC, что и точка A, и на том же сторона линии AC как точка B есть. Вы можете предварительно оптимизировать эту проверку для каждого треугольника и проверить их все, пока не найдете треугольник (ы), в котором он находится. Подробнее см. this page.

Чтобы сохранить вычисления, вы можете вычислить минимальные и максимальные координаты X и Y точек для каждого треугольника. Если координаты X и Y точки не находятся в пределах минимального и максимального значений, вы можете сразу пропустить проверку этого треугольника. Точка не может находиться внутри нее, если она не находится внутри прямоугольника, который ограничивает треугольник.

+1

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

+0

без проверки четности и грубой проверки существует простой подход к обходному графику, который проходит только по краям треугольников, начиная с любой случайной вершины. – WhitAngl

+0

@WhitAngl вы можете предоставить ссылку? –

0

Я предполагаю, что треугольники не пересекаются, за исключением общих ребер.

Вы не хотите проверять каждый треугольник (или подмножество) самостоятельно. Основная причина - ошибки вычислений - из-за них вы можете получить ответ «внутри» для более чем одного треугольника (или нуля), который может нарушить логику вашей программы.

Более надежный способ:

  1. Найти ближайший край с точки
  2. Выберите один из треугольников касаясь этого края
  3. сделать одну проверку для этого треугольника (точка лежит на той же стороне, что и третья вершина треугольника)
  4. Если «внутри» - вернуть этот треугольник
  5. Если «снаружи» - возвращает другой треугольник на этой кромке (или «ничего», если нет другого треугольника)

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

Для # 1 вы можете использовать что-то вроде квадроцикла, как предлагает Майкл Уайлд.

1

Триангуляция Делоне сама по себе является структурой данных поиска. Вероятность реализации триангуляции Delaunay, вероятно, имеет функции определения местоположения. Как вы вычислили триангуляцию Деланея ваших очков?

CGAL имеет реализацию двумерных и трехмерных триангуляций. Полученная структура данных способна локализовать любую точку, используя прогулку от данной точки. См., Например, that chapter of the manual. CGAL - это библиотека C++, но она имеет python bindings.

+1

Триангуляция Delaunay полезна для многих вещей, а не только для пространственного поиска. Поэтому я не согласен с тем, что реализация * должна иметь функцию определения местоположения. –

+0

Прошу прощения за мою формулировку. Когда я сказал: «Ваша реализация триангуляции Delaunay должна иметь функции определения местоположения», «must» должен был быть «may». – lrineau

1

Этот простой пример триангулирует 10 случайных точек, еще 3 случайных точек генерируются и, если они попадают в треугольнике, вершины приведены:

import numpy as np 
from pyhull.delaunay import DelaunayTri 

def sign(a,b,c): 
    return (a[0]-c[0])*(b[1]-c[1])-(b[0]-c[0])*(a[1]-c[1]) 

def findfacet(p,simplice): 
    c,b,a = simplice.coords 
    b1 = sign(p,a,b) < 0.0 
    b2 = sign(p,b,c) < 0.0 
    b3 = sign(p,c,a) < 0.0 
    return b1 == b2 == b3 

data = np.random.randn(10, 2) 
dtri = DelaunayTri(data) 

interpolate = np.random.randn(3, 2) 

for point in interpolate: 
    for triangle in dtri.simplices: 
     if findfacet(point,triangle): 
      print "Point",point,"inside",triangle.coords 
     break 

Использование matplotlib для визуализации (код опущен):

enter image description here

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