Get the normal of a line


#1

Hello

I need to get the normal projected onto a line each “X” line segments.

For example, in the picture I should get the normal projected on the corner lines.

To divide the line into segments I use:

Line.ToNurbsCurve () DivideByLength (10, true).;

But for each segment, I don’t know how calculate the normal

I’m using c # and RhinoCommon


(Dale Fugier) #2

Find the closest point on the surface using Rhino.Geometry.Surface.ClosestPoint. Then use Rhino.Geometry.Surface.NormalAt.


(Rajaa Issa) #3

If you are dealing with a planar curve, then you can also find the normals using
1- The curve plane normal (v1),
2- The tangents to your curve at each divide point (v2, v3, etc.),
Then calculate the normals using the vector cross-product operation (v2xv1, v3xv1, etc.)


#4

And, How I can get the plane?

For example, in the image, I need calculate the normal of two lines in different planes.


(Rajaa Issa) #5

The following shows a sample GH script and C# sample. I hope this helps.

CrvNormals.gh (8.7 KB)


#6

Hi again,

I reopen this post _:slight_smile:

With your code, the line’s direction determines the normnal’s direction. For example. In the Image

The normal of Line 1 is outside and the Line 2 is inside.

I’d like get some similar at command _Dir

Select a Brep Object, and in a determinated Brep point get the normal. Something like this image

With the command _Dir


(Menno Deij - van Rijswijk) #7

Try this

protected override Result RunCommand(RhinoDoc doc, RunMode mode)
{
    ObjRef cRef;
    Result res = RhinoGet.GetOneObject("Select BREP", false, ObjectType.Brep, out cRef);
    if (res != Result.Success)
        return res;

    Brep b = cRef.Brep();

    GetPoint gp = new GetPoint();
    gp.SetCommandPrompt("Select point for normal");
    while (true)
    {
        GetResult gr = gp.Get();
        if (gr != GetResult.Point)
            break;

        Point3d pt = gp.Point();
        Point3d closest;
        ComponentIndex ci;
        double s, t;
        Vector3d normal;
        if (b.ClosestPoint(pt, out closest, out ci, out s, out t, double.MaxValue, out normal))
        {
            doc.Objects.AddLine(closest, closest + normal);
            doc.Views.Redraw();
            RhinoApp.WriteLine("Normal is :"+normal);
        }
    }
            

    return Result.Success;
}

#8

It works perfectly!!

Thank you very much!