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.
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);