Давайте предположим, что ваш профиль закрыт.
Чтобы вычислить нормали в каждой точке, вы можете усреднить нормали для каждого сегмента.
Это должно решить проблему с задним фронтом ...
Полагаю, ваши данные x, y
xtmp1 = [x, x(1)]
ytmp1 = [y, y(1)]
xtmp2 = [x(end), x]
ytmp2 = [y(end), y]
nx = (diff(ytmp1)+diff(ytmp2))/2.0
ny = -(diff(xtmp1)+diff(xtmp2))/2.0
nx
будут содержать x-компонент вашего нормального значения, а ny
будут содержать y-компонент вашего обычного
конечно, вы можете нормализовать результат, если вы хотите, чтобы нормали равной длины
ntmp = 1.0 ./ sqrt(nx.*nx+ny.*ny)
nx = nx .* tmp
ny = ny .* tmp
Как и предполагалось, вы также можете нормализовать нормали каждого сегмента и затем усреднить как таковые
xtmp1 = [x, x(1)]
ytmp1 = [y, y(1)]
xtmp2 = [x(end), x]
ytmp2 = [y(end), y]
nxF = diff(ytmp1)
nyF = -diff(xtmp1)
nxB = diff(ytmp2)
nyB = -diff(xtmp2)
ntmp = 1.0 ./ sqrt(nxF.*nxF+nyF.*nyF)
nxF = nxF .* tmp
nyF = nyF .* tmp
ntmp = 1.0 ./ sqrt(nxB.*nxB+nyB.*nyB)
nxB = nxB .* tmp
nyB = nyB .* tmp
nx = (nxF+nxB)/2.0
ny = (nyF+nxB)/2.0
И затемнормализуйте nx
и ny