Позвольте мне предложить самый простой метод: подумайте, что вы должны найти контур f(x,y) = Z
для определенного Z
.Затем начертите свое поле графика, D = subset(RxR)
с сеткой из равносторонней треугольной сетки вершин и ребер, M = (V,E,r)
, где M
- сетка, V
-множество вершин, E
- множество ребер, r
- длина стороны треугольника, level of detail
, LOD.Затем для каждой вершины в V
вычислите значение f
.Затем для каждого ребра в E
проверьте, имеет ли ребро (e[k]
) значение f
в его вершинах (например, v[i]
и v[j]
) на разных сторонах относительно Z
, чтоесть, если f(v[i])>Z
и f(v[j])<Z
.Если это так, то линия контура f(x,y) = Z
пересекает этот край e[k]
в определенной точке (c[k]
), которая может быть линейно аппроксимирована:
t = (f (v [i]]) - Z) / (f (v [i]) - f (v [j]))
c '[k] = v [i] * (1-t) + v [j] * t
Поскольку треугольник с одним пересечением контура ребра имеет второе пересечение на некоторых из оставшихся двух ребер (доказательство тривиально), мы получаем второе c'[k]
.Таким образом, для каждого треугольника из M
мы имеем либо нулевой, либо отдельный отрезок, аппроксимирующий контурную линию.Рисование всех найденных сегментов даст нам приблизительный контурный график f(x,y)=Z
с определенным уровнем детализации r
.Понижение r
приведет к более точному контуру, повышение r
даст производительность.