How to draw normal line at given points ?

28 visualizaciones (últimos 30 días)
MMSAAH
MMSAAH el 27 de Mzo. de 2020
Respondida: michael scheinfeild el 28 de Ag. de 2021
Hello everyone,
I have a red curve that fit 4 bleu points. I want to draw normal at these points.
Here attached my curve.
and the x, y coordinates of the bleu points are :
x=[142;127;181;234];
y=[251;251;261;255];
So, please, how to get the normal line ?
I will be very grateful if anyone could help me.
  2 comentarios
Ameer Hamza
Ameer Hamza el 27 de Mzo. de 2020
How did you create this curved line fitting through these points?
MMSAAH
MMSAAH el 30 de Mzo. de 2020
Hello Ameer,
Here is my code:
x=[142;127;181;234]
y=[251;251;261;255]
p = polyfit(x, y, 1);
v = polyval(p, x);
xint = linspace(127,300,50)';
spl = spline(x,y);
figure
t=plot(y,x,'.',ppval(spl,xint),xint,'r-')
xlim([200 300])
ylim([50 234])

Iniciar sesión para comentar.

Respuesta aceptada

Ameer Hamza
Ameer Hamza el 31 de Mzo. de 2020
Try this:
x=[142;127;181;234];
y=[251;251;261;255];
[x, idx] = sort(x);
y = y(idx);
points = [x y];
xint = linspace(127,234,50)';
spl = spline(x,y);
tangent_vector = zeros(4,2);
for i=1:4
if i==4 % last polynomial need to evalauted at endpoint
deri_coef = polyder(spl.coefs(i-1,:));
tangent_vector(i, :) = [1 polyval(deri_coef, x(end)-x(end-1))];
else
deri_coef = polyder(spl.coefs(i,:));
tangent_vector(i, :) = [1 polyval(deri_coef, 0)];
end
end
normal_vec = [-tangent_vector(:,2) tangent_vector(:,1)];
start_points = points;
end_points = 10*normal_vec + points;
fig = figure;
ax = axes();
hold(ax);
t = plot(y,x,'.',ppval(spl,xint),xint,'r-');
for i=1:4
p1 = start_points(i,:);
p2 = end_points(i,:);
plot([p1(2) p2(2)], [p1(1) p2(1)], 'r', 'LineWidth', 2);
end
daspect([1 1 1]);
xlim([180 340])
ylim([100 250])
  2 comentarios
MMSAAH
MMSAAH el 1 de Abr. de 2020
Thank you very much for the answer.It worked perfectly.
However, could you explain me more the for loop ? and why did you evaluated the polynome at endpoint ?
Thank you though!
Ameer Hamza
Ameer Hamza el 1 de Abr. de 2020
For loop is just calculating the tangent vector at each point, since we can calculate the normal vectors from tangent vectors. The spline function output 3 polynomials for 4 data points. So to compute tangent at 4 data points, we need to do it like this
datapoint # 1 -> polynomial # 1 (start point)
datapoint # 2 -> polynomial # 2 (start point) or polynomial # 1 (end point)
datapoint # 3 -> polynomial # 3 (start point) or polynomial # 2 (end point)
datapoint # 4 -> polynomial # 3 (end point)
Which shows where I evaluated the derivative of each polynomial

Iniciar sesión para comentar.

Más respuestas (1)

michael scheinfeild
michael scheinfeild el 28 de Ag. de 2021
https://michaelsheinfeild.medium.com/unit-normal-vector-to-curve-d63ef0124acd

Categorías

Más información sobre Polynomials en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by