Ok, a bit slow for surfaces… it creates a very complex surface.
But nevertheless amazing! I would be glad to have it as a new Rhino tool.
// Grasshopper Script Instance
// by By Daniel Piker 250604 v2
#region Usings
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Threading.Tasks;
using Rhino;
using Rhino.Geometry;
using Grasshopper;
using Grasshopper.Kernel;
using Grasshopper.Kernel.Data;
using Grasshopper.Kernel.Types;
#endregion
public class Script_Instance : GH_ScriptInstance
{
#region Notes
/*
Members:
RhinoDoc RhinoDocument
GH_Document GrasshopperDocument
IGH_Component Component
int Iteration
Methods (Virtual & overridable):
Print(string text)
Print(string format, params object[] args)
Reflect(object obj)
Reflect(object obj, string method_name)
*/
#endregion
private void RunScript(
Mesh M1,
Mesh M2,
GeometryBase Geom,
double thickness,
ref object a)
{
Mesh offset = M2.DuplicateMesh();
OffsetMesh(ref offset, thickness);
var morph = new ThickMeshMorph(M1,M2,offset);
morph.Morph(Geom);
a = Geom;
}
void OffsetMesh(ref Mesh M, double d)
{
M.Normals.ComputeNormals();
var normals = M.Normals.ToFloatArray();
for (int i = 0; i < M.Vertices.Count; i++)
{
double dist = d;
M.Vertices.SetVertex(i,
M.Vertices[i].X + dist * normals[3 * i],
M.Vertices[i].Y + dist * normals[3 * i + 1],
M.Vertices[i].Z + dist * normals[3 * i + 2]);
}
}
public class ThickMeshMorph : SpaceMorph
{
Mesh RefMesh;
Mesh TargetInner;
Mesh TargetOuter;
public ThickMeshMorph(Mesh RefMesh,Mesh TargetInner,Mesh TargetOuter)
{
this.RefMesh = RefMesh;
this.TargetInner = TargetInner;
this.TargetOuter = TargetOuter;
}
public override Point3d MorphPoint(Point3d Pt)
{
MeshPoint mp = RefMesh.ClosestMeshPoint(Pt,0);
return (TargetInner.PointAt(mp) * (1 - Pt.Z) + TargetOuter.PointAt(mp) * Pt.Z);
}
}
}
