Evalutate Surface With Code's surface normal is not the "same" direction with Grasshopper's "Evalutate Surface" Component

The Evalutate surface with C# Code, And the normal of the surface is not the “same” with When I using Grasshopper “Evalutate Surface”, The C# Code is below:

double U = Surface.Domain(0).Mid;
double V = Surface.Domain(1).Mid;
Vector3d Vec = Surface.NormalAt(U, V);
Point3d _Pt = Surface.PointAt(U, V);
Vector = Vec;
Point = _Pt;

The picture show evalutate surface with component:

The picture show evalutate surface with compnent and Code and the green vector is the result evaluate surface with Component, red is the result evalutate with C# code;

Is anyone can help me? Thanks

Check your c# surface domain, it’s sim that your uvs are not split in u or v ,in your gh definition the normal is computed from a closest point not a domain division like in your c# def so the difference is normal

(barycentre computation from boundary are sometimes different than surface domain *.5)

How Can I knew wether the uvs are not split in u or v? and I think for the surface the two method will get the same direction for the surface normal, However is not

Hi @cughudson,

Since your input is a Brep, you sould be evaluating the BrepFace, not the underlying surface.

– Dale

@dale OK Thanks, It is helpful

Hi @dale, The underlying surface is so difficult to understand for me, could you show me what is underlying surface excatcly is? Thanks

Breps are made of multiple trimmed or untrimmed surfaces called BrepFaces, each of which have their own independent u-v domains.

Area centroid is generally not the same thing as the middle of the surface domain - To obtain the same result as the GH definition you will have to use the AreaMassProperties class: http://developer.rhino3d.com/api/RhinoCommon/html/T_Rhino_Geometry_AreaMassProperties.htm

and this very cumbersome overload of Brep.ClosestPoint():
http://developer.rhino3d.com/api/RhinoCommon/html/M_Rhino_Geometry_Brep_ClosestPoint_1.htm

Hi @cughudson,

This diagram can be helpful:

http://developer.rhino3d.com/guides/cpp/brep-data-structure/

@qythium

A Brep Face is just a proxy to the underlying surface. A face get its parameterization, including domain, from the surface.

– Dale

1 Like

@dale, Thankyou, I have understand the Brep through the diagram, Thankyou very much