Many intersection checks are possible in C# in Grasshopper, although finding them isn’t entirely intuitive.
One task I wanted to do today was to see if a ray of light between one point and another was being blocked by a mesh. This requires a mesh-line intersection check – to check if the ray of light was being blocked by the mesh.
How to calculate an intersection
You can find a lot of intersection methods for different kinds of geometry under Rhino.Geometry.Intersection. The mesh line intersection is a good choice as it is one of the faster intersection checks – especially compared to anything involving surfaces.
To do the intersection check, we need our mesh and our ray. The ray can be a bit challenging to set up – it’s a common mistake to forget to realise that your line start and end points might be touching the mesh, which would lead to positive intersection results. This is why I’ve redefined my line to run from 0.001 to 0.999.
//collision test var ln = new Line(e[em], centre); //ray var startpt = new Point3d(ln.PointAt(0.001)); //modify ray so start/end don't intersect var endpt = new Point3d(ln.PointAt(0.999)); ln.From = startpt; ln.To = endpt; Int32[] intersections; //where intersection locations are held Rhino.Geometry.Intersect.Intersection.MeshLine(r, ln, out intersections); //calculate emission contribution and add to that receiver if(intersections == null) { //if no intersections, we can assume ray is unimpeded and do our calcs double contribution = Math.Cos(alpha) / (dist * dist); rtnvals[f] += Math.Max(contribution, 0); }