Нахождение области результирующих треугольников триангуляции Делоне

После применения триангуляции Делоне можно ли найти площадь каждого треугольника? Есть ли какая-либо функция в Matlab, чтобы сделать это? Просьба уточнить меня. Заранее спасибо

4 ответа

Я столкнулся с тем же сомнением, но, к счастью, мне удалось его взломать, попробуйте это:

tri = delaunay(x,y);
areas = polyarea(x(tri'),y(tri'),2);

Это даст вам области каждого треугольника.

Дайте мне знать, если обнаружите какие-либо трудности.

PS: tri' означает транспонирование матрицы.

Это можно сделать с помощью Polyarea - обратите внимание на использование dim вариант.

tri = delaunay(x,y);
areas = polyarea(tri(x),tri(y),2);

Это решение работает, но не векторизовано.

DT = delaunayTriangulation(X,Y);

NTriangles = size(DT.ConnectivityList,1);

% Triangles' Area Calculation (Try to vectorize)
Areas = zeros(NTriangles,1);
for i = 1:NTriangles
    PointIndexes = DT.ConnectivityList(i,:);
    Areas(i) = polyarea(DT.Points(PointIndexes,1),DT.Points(PointIndexes,2));
end

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

При попытке решения, приведенного здесь, я получил следующую ошибку:

      Error using reshape
Number of elements must not change. Use [] as one of the size inputs to
automatically calculate the appropriate size for that dimension.

Error in polyarea (line 46)
  area = reshape(abs(sum( (x([2:siz(1) 1],:) - x(:,:)).* ...

Проблема заключалась в том, чтодал вектор, а не матрицу. Вместо этого я сделал следующее:

      pt = tri.Points;
conn = tri.ConnectivityList;
xmat = reshape(pt(conn,1), [], 2);
ymat = reshape(pt(conn,2), [], 2);
Avec = polyarea(xmat, ymat, 2);

И это решило мою проблему, оставаясь при этом векторизованной операцией.

Другие вопросы по тегам