Самый простой способ решить эту проблему - интерполировать из одной сетки на другую. Такой подход хорошо работает, когда он более разрешен, чем другой, или когда вы не так же озабочены результатами на отдельных узлах, а скорее общим шаблоном между элементами. Если это не так, то у вас есть очень сложная проблема, потому что вам нужно создать многоугольную поверхность, которая полностью захватывает все узлы и края обеих триангуляций. Рассмотрим следующую пару треугольных моделей:
поверхность, которая захватила все изменения должны были бы иметь все вершины и ребра, которые составляют как из них, которая не является чисто треугольной поверхности. Итак, давайте вместо этого рассмотрим более простой случай. Чтобы отображать результаты от одной триангуляции к другой, вам просто нужно сформулировать функции, которые определяют, как значения изменяются вдоль треугольников, которые более широко называются basis functions. Часто предполагается, что значения между узлами (т. Е. Вершинами) треугольников линейно изменяются вдоль поверхностей треугольников. Вы можете сделать это по-другому, если хотите, просто нужно определить новые базовые функции. Если мы идем для линейных функций, то уравнения в 2D довольно просты. Предположим, вы создали массив trimap
, у которого треугольник каждой из вершин другой триангуляции находится внутри. This can be accomplished using the info here. Затем мы устанавливаем координаты вершин текущего треугольника (x1, y1), (x2, y2) и (х3, у3), а затем сделать математику:
for cnt1=1,npoints
x1=x(tri1(trimap(cnt1),1));
x2=x(tri1(trimap(cnt1),2));
x3=x(tri1(trimap(cnt1),3));
y1=y(tri1(trimap(cnt1),1));
y2=y(tri1(trimap(cnt1),2));
y3=y(tri1(trimap(cnt1),3));
delta=x2*y3+x1*y2+x3*y1-x2*y1-x1*y3-x3*y2;
delta1=(x2*y3-x3*y2+xstat(cnt1)*(y2-y3)+ystat(cnt1)*(x3-x2));
delta2=(x3*y1-x1*y3+xstat(cnt1)*(y3-y1)+ystat(cnt1)*(x1-x3));
delta3=(x1*y2-x2*y1+xstat(cnt1)*(y1-y2)+ystat(cnt1)*(x2-x1));
weights(cnt1,1)=delta1/delta;
weights(cnt1,2)=delta2/delta;
weights(cnt1,3)=delta3/delta;
z1=z(tri1(trimap(cnt1),1));
z2=z(tri1(trimap(cnt1),2));
z3=z(tri1(trimap(cnt1),3));
valinterp(cnt1)=sum(weights(cnt1,:).*[z1,z2,z3]);
end
valinterp
является интерполированным значение для каждой точки. Here и here - некоторые приятные слайды, объясняющие математику за всем этим. Обратите внимание: я не тестировал ни один из этих кодов. Также обратите внимание, что вам нужно будет сделать что-то, чтобы назначить значения за пределами триангуляции. Возможно, нулевое значение или взвешенное значение обратного расстояния.
Сначала вам нужно определить, как вы хотите, чтобы разность была выведена. Например, вы хотите сопоставить одну поверхность с другой, а затем сделать разницу? Или вы хотите, чтобы полигональная поверхность поддерживала полное разрешение обоих? Или что-то другое? – TTT
Благодарим вас за ответ. Ох, ну ладно. Что ты предлагаешь? Мне хотелось бы узнать оба пути, если это возможно. Поэтому мы можем убить двух зайцев одним выстрелом в этой теме :) – MatlabNewb
Создание новой многоугольной поверхности - непростая задача. Но независимо от того, как вы это делаете, вам необходимо определить функционально, как значения изменяются в разных треугольных элементах. Я считаю, что функция 'trisurf' предполагает линейную вариацию. Затем вы можете вычислять значения в любой заданной точке треугольника и тем самым интерполировать между двумя триангуляциями. – TTT