Got wrong normal vector

I wrote a code presented the scatter points on a peak function, and now I want to solve for unit normal vectors at those points.
ok...maybe this is a math problem...why I got a result looks like tangetial vector...
The arrow on the surrounding flat plant looks good but the peak's normal vectors obviously wrong.
% function handler
f = @(x,y)2*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ...
- 5*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...
- 1/3*exp(-(x+1).^2 - y.^2); % z
rng('default');
ds = 0.0005;
range = (-2:ds:2)';
width = 4;
x = -width+(width-(-width))*rand(length(range),1); %
y = -width+(width-(-width))*rand(length(range),1); % r = a + (b-a).*rand(N,1)
z = f(x,y);
p = [x y z];
p_origin = p;
num_pt = size(p,1);
syms s t
f1 = 2*(1-s).^2.*exp(-(s.^2) - (t+1).^2) ...
- 5*(s/5 - s.^3 - s.^5).*exp(-s.^2-t.^2) ...
- 1/3*exp(-(s+1).^2 - t.^2);
dfs = diff(f1,s);
dft = diff(f1,t);
normal_x = matlabFunction(dfs);
normal_y = matlabFunction(dft);
normal = [normal_x(x,y),normal_y(x,y),-ones(num_pt,1)];
norm_nor = sqrt(sum(normal.*normal,2));
normal = bsxfun(@rdivide,normal,norm_nor);
% draw arrow
x=p(:,1);
y=p(:,2);
z=p(:,3);
u=normal(:,1);
v=normal(:,2);
w=normal(:,3);
plot3(x,y,z,'b.');
axis equal;
grid on;
view(45,15);
hold on;
quiver3(x,y,z,u,v,w,'r','LineWidth',1,'MaxHeadSize',5);

6 Commenti

Bruno Luong
Bruno Luong il 10 Ago 2022
"I got a result looks like tangetial vector."
May be it just looks like. Hard to tell with your graphic representation.
AI-CHI Chang
AI-CHI Chang il 10 Ago 2022
Modificato: AI-CHI Chang il 10 Ago 2022
I've run PCA normal estimation. The result should look more like this. I also fliped them inward.
Outward => inward, just flip the sign from
normal = [normal_x(x,y),normal_y(x,y),-ones(num_pt,1)]
to
normal = -[normal_x(x,y),normal_y(x,y),-ones(num_pt,1)]
AI-CHI Chang
AI-CHI Chang il 10 Ago 2022
Modificato: AI-CHI Chang il 10 Ago 2022
This is outward version (still weird). Or maybe... is there any method to make these normals look nomal =))
Bruno Luong
Bruno Luong il 10 Ago 2022
Your normal is alright just your graphic representation tricks your brain.
AI-CHI Chang
AI-CHI Chang il 10 Ago 2022
yeah...then i think my problem is solved
thank you very much !! :D

Accedi per commentare.

 Risposta accettata

David Goodmanson
David Goodmanson il 12 Ago 2022
Modificato: David Goodmanson il 12 Ago 2022
Hi AC,
You were quite right in your suspicions of the 3d plot, which looks fishy. You might call this a configuration control issue. You have two independent functions, f and f1, that are supposed to represent the same thing. That carries some risk in programming. The two functions are supposed to be identical with x <--> s, y <--> t. But if you compare their second lines,
- 5*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ... % f
- 5*(s/5 - s.^3 - s.^5).*exp(-s.^2-t.^2) ... % f1
you can see that there is a problem with the y.^5 term. I'm not sure which version is correct, but if you change y.^5 to x.^5, or if you change s.^5 to t.^5, in both cases the normal vectors in the plot are pretty clearly normal.

1 Commento

AI-CHI Chang
AI-CHI Chang il 14 Ago 2022
OMG so embarrassing .... David Goodmanson thank you very much ><!!!
I should be more careful

Accedi per commentare.

Più risposte (0)

Community Treasure Hunt

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

Start Hunting!

Translated by