From a0538720210b8e62a3bbca68408bafa23e6e6ee4 Mon Sep 17 00:00:00 2001 From: Christopher Short Date: Sun, 6 Sep 2026 22:24:58 +0100 Subject: [PATCH 1/7] Add new Fillet.cs class --- Geometry_Engine/Modify/Fillet.cs | 322 +++++++++++++++++++++++++++++++ 1 file changed, 322 insertions(+) create mode 100644 Geometry_Engine/Modify/Fillet.cs diff --git a/Geometry_Engine/Modify/Fillet.cs b/Geometry_Engine/Modify/Fillet.cs new file mode 100644 index 000000000..26174b093 --- /dev/null +++ b/Geometry_Engine/Modify/Fillet.cs @@ -0,0 +1,322 @@ +/* + * This file is part of the Buildings and Habitats object Model (BHoM) + * Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. + * + * Each contributor holds copyright over their respective contributions. + * The project versioning (Git) records all such contribution source information. + * + * + * The BHoM is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3.0 of the License, or + * (at your option) any later version. + * + * The BHoM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this code. If not, see . + */ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using BH.oM.Base.Attributes; +using BH.oM.Geometry; + +namespace BH.Engine.Geometry +{ + public static partial class Modify + { + /***************************************************/ + /**** Public Methods ****/ + /***************************************************/ + + [Description("Fillets a Polyline by inserting a circular arc at each internal vertex; the end points of an open Polyline stay sharp. The trim taken from either side of a corner is capped at half the adjacent segment, so an arc never runs past a segment midpoint. A corner that cannot be rounded - a joint running straight through or doubling back, or one where the requested radius leaves no room - is left sharp rather than dropped, so the result is always a single contiguous curve.")] + [Input("polyline", "Polyline to fillet.")] + [Input("radius", "Target fillet radius (> 0). The radius achieved at a corner reduces where the trim-length cap bites.")] + [Input("distTol", "Distance tolerance.")] + [Input("angleTol", "Angle tolerance (radians). A joint is left sharp where it comes within this of running straight through, or of doubling back on itself.")] + [Output("polyCurve", "The filleted curve, as trimmed Lines joined by Arc fillets, or null where there is nothing to fillet - a null Polyline, fewer than two control points, fewer than three distinct vertices, or a radius that is not a positive number.")] + public static PolyCurve Fillet(this Polyline polyline, double radius, + double distTol = Tolerance.Distance, double angleTol = Tolerance.Angle) + { + if (polyline == null) + { + Base.Compute.RecordError("Cannot fillet a null Polyline."); + return null; + } + + IList pts = polyline.ControlPoints; + if (pts == null || pts.Count < 2) + { + Base.Compute.RecordError("The Polyline needs at least two control points to be filleted."); + return null; + } + + if (double.IsNaN(radius)) + { + Base.Compute.RecordError("The fillet radius is not a number, so no corner has been rounded."); + return null; + } + + if (radius <= 0) + { + Base.Compute.RecordError("The fillet radius is zero or negative, so no corner has been rounded."); + return null; + } + + bool closed = polyline.IsClosed(distTol); + + List vertices = FilletVertices(pts, closed, distTol); + if (vertices.Count < 3) + { + Base.Compute.RecordError("The Polyline has fewer than three distinct vertices, so it has no corner to round."); + return null; + } + + // A closed polyline carries a segment from its last vertex back to its first; an open one does not. + int segCount = closed ? vertices.Count : vertices.Count - 1; + + double[] trim = FilletTrimLengths(vertices, segCount, closed, radius, distTol, angleTol); + Arc[] arcs = FilletArcs(vertices, trim, distTol); + + return FilletedCurve(vertices, trim, arcs, segCount, closed, distTol); + } + + /***************************************************/ + /**** Private Methods ****/ + /***************************************************/ + + // Fraction of a segment's own length that its two trims may occupy, on a segment too short for + // the distTol margin to leave any room at all. + private const double ShortSegmentFallbackFraction = 0.99; + + /***************************************************/ + + // The polyline's vertices with coincident points collapsed, so that every returned vertex is + // further than distTol from both its neighbours - the closing pair of a closed polyline included. + // Everything downstream relies on that: it is what makes every segment long enough to trim and + // build on, and so what keeps the assembled curve contiguous. + private static List FilletVertices(IList pts, bool closed, double distTol) + { + List vertices = new List(); + + foreach (Point pt in pts) + { + // Measured against the last vertex KEPT rather than the last one seen. Against the raw + // predecessor, a there-and-back jitter passes both tests and leaves two retained vertices + // closer together than distTol. + if (vertices.Count == 0 || pt.Distance(vertices[vertices.Count - 1]) > distTol) + vertices.Add(pt); + } + + // A closed polyline repeats its first point last. Drop that repeat, and any further vertex + // that has collapsed onto the first, so the closing segment is no shorter than the rest. + while (closed && vertices.Count > 1 && vertices[0].Distance(vertices[vertices.Count - 1]) <= distTol) + vertices.RemoveAt(vertices.Count - 1); + + return vertices; + } + + /***************************************************/ + + // How far back along each adjacent segment a corner is cut before its fillet arc starts, per + // vertex, and zero where no fillet applies. This owns every trim decision: the cap from the + // requested radius, the balancing of the two trims a segment carries, and the final check that + // a segment keeps some length between them. + private static double[] FilletTrimLengths(List vertices, int segCount, bool closed, double radius, double distTol, double angleTol) + { + int nVerts = vertices.Count; + + double[] segLengths = new double[segCount]; + for (int s = 0; s < segCount; s++) + segLengths[s] = vertices[s].Distance(vertices[(s + 1) % nVerts]); + + double[] trim = new double[nVerts]; + + for (int i = 0; i < nVerts; i++) + { + if (!closed && (i == 0 || i == nVerts - 1)) + continue; + + Point corner = vertices[i]; + Vector v1 = vertices[(i - 1 + nVerts) % nVerts] - corner; + Vector v2 = vertices[(i + 1) % nVerts] - corner; + + double len1 = v1.Length(); + double len2 = v2.Length(); + if (len1 < distTol || len2 < distTol) + continue; + + v1 /= len1; + v2 /= len2; + + // Clamped so that rounding on near-parallel vectors cannot push Acos outside its domain. + double d = Math.Max(-1.0, Math.Min(1.0, v1.DotProduct(v2))); + double theta = Math.Acos(d); + + // There is nothing to round on a joint that runs straight through, or that doubles back + // on itself. + if (theta < angleTol || Math.Abs(Math.PI - theta) < angleTol) + continue; + + // The segment leaving vertex i is segment i, and the one arriving is segment i-1. Capping + // at half of each keeps an arc clear of the corner at the far end of either segment. + double tDesired = radius / Math.Tan(theta / 2.0); + double prevHalf = 0.5 * segLengths[(i - 1 + segCount) % segCount]; + double nextHalf = 0.5 * segLengths[i]; + + double t = Math.Min(tDesired, Math.Min(prevHalf, nextHalf)); + if (t > distTol) + trim[i] = t; + } + + // Balance the two trims a segment carries against its length. The half-segment cap above + // already holds their sum to the segment length, so this only bites inside the distTol margin + // band - but that band is reachable on a near-regular polygon with a large radius. + double margin = distTol * 2.0; + for (int s = 0; s < segCount; s++) + { + int vEnd = (s + 1) % nVerts; + double sum = trim[s] + trim[vEnd]; + + double maxAllowed = segLengths[s] - margin; + if (maxAllowed < distTol) + maxAllowed = segLengths[s] * ShortSegmentFallbackFraction; + + if (sum <= maxAllowed || (trim[s] <= distTol && trim[vEnd] <= distTol)) + continue; + + double scale = maxAllowed / sum; + trim[s] *= scale; + trim[vEnd] *= scale; + + if (trim[s] <= distTol) + trim[s] = 0; + if (trim[vEnd] <= distTol) + trim[vEnd] = 0; + } + + // A segment short enough to have fallen back to ShortSegmentFallbackFraction above can still + // be left with no straight length between its two trims. Give up the smaller corner first, + // and both only if that is not enough - a sharp corner is recoverable, a zero-length or + // reversed segment is not. + for (int s = 0; s < segCount; s++) + { + int vEnd = (s + 1) % nVerts; + if (trim[s] + trim[vEnd] < segLengths[s] - distTol) + continue; + + if (trim[s] >= trim[vEnd]) + trim[vEnd] = 0; + else + trim[s] = 0; + + if (trim[s] + trim[vEnd] >= segLengths[s] - distTol) + { + trim[s] = 0; + trim[vEnd] = 0; + } + } + + return trim; + } + + /***************************************************/ + + // The fillet arc at each vertex, or null where the vertex is not filleted or its arc could not be + // built. Resolving every arc before any curve is assembled is what keeps the result contiguous: + // assembly treats a null arc as an untrimmed corner, so a corner can never be cut back and then + // left open by an arc that failed. + private static Arc[] FilletArcs(List vertices, double[] trim, double distTol) + { + int nVerts = vertices.Count; + Arc[] arcs = new Arc[nVerts]; + + for (int i = 0; i < nVerts; i++) + { + if (trim[i] <= 0) + continue; + + arcs[i] = FilletArc(vertices[(i - 1 + nVerts) % nVerts], vertices[i], vertices[(i + 1) % nVerts], trim[i], distTol); + } + + return arcs; + } + + /***************************************************/ + + // The arc rounding a single corner, tangent to both adjacent segments at the trim distance from + // the corner, or null where no valid arc exists. + private static Arc FilletArc(Point prev, Point corner, Point next, double trim, double distTol) + { + Vector v1 = (prev - corner).Normalise(); + Vector v2 = (next - corner).Normalise(); + + // Clamped so that rounding on near-parallel vectors cannot push Acos outside its domain. + double d = Math.Max(-1.0, Math.Min(1.0, v1.DotProduct(v2))); + double theta = Math.Acos(d); + + // The arc sweeps pi - theta. Create.ArcByCentre throws out of CartesianCoordinateSystem + // rather than returning null when asked for a sweep below Tolerance.Angle, and the joint test + // in FilletTrimLengths only rules that out while the caller leaves angleTol at its default. + if (Math.PI - theta < Tolerance.Angle) + return null; + + double R = trim * Math.Tan(theta / 2.0); + if (R <= distTol) + return null; + + // Non-zero because the sweep check above holds theta away from pi. + Vector bis = (v1 + v2).Normalise(); + Point centre = corner + bis * (R / Math.Sin(theta / 2.0)); + + return BH.Engine.Geometry.Create.ArcByCentre(centre, corner + v1 * trim, corner + v2 * trim, distTol); + } + + /***************************************************/ + + // The trimmed Lines and corner Arcs as a single PolyCurve, with a closing Line where a closed + // polyline's last curve does not already meet its first. Reads the trims and arcs it is given + // and changes neither. + private static PolyCurve FilletedCurve(List vertices, double[] trim, Arc[] arcs, int segCount, bool closed, double distTol) + { + int nVerts = vertices.Count; + List output = new List(); + + for (int s = 0; s < segCount; s++) + { + int vEnd = (s + 1) % nVerts; + + Point pA = vertices[s]; + Point pB = vertices[vEnd]; + Vector dir = (pB - pA).Normalise(); + + // A corner is only cut back where its arc was actually built, so that the line always + // runs to something that closes it. + double tStart = arcs[s] == null ? 0 : trim[s]; + double tEnd = arcs[vEnd] == null ? 0 : trim[vEnd]; + + output.Add(new Line { Start = pA + dir * tStart, End = pB - dir * tEnd }); + + if (arcs[vEnd] != null) + output.Add(arcs[vEnd]); + } + + if (closed) + { + Point startPoint = output.First().IStartPoint(); + Point endPoint = output.Last().IEndPoint(); + if (startPoint.Distance(endPoint) > distTol) + output.Add(BH.Engine.Geometry.Create.Line(endPoint, startPoint)); + } + + return new PolyCurve { Curves = output }; + } + + } +} From b8dbb25d68fc9a2e579eaaa9edb262cda4b974b8 Mon Sep 17 00:00:00 2001 From: Christopher Short Date: Mon, 7 Sep 2026 11:25:23 +0100 Subject: [PATCH 2/7] Add unit tests for fillet --- .ci/Datasets/Geometry_Engine/Modify/Fillet.json | 1 + Geometry_Engine/Modify/Fillet.cs | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 .ci/Datasets/Geometry_Engine/Modify/Fillet.json diff --git a/.ci/Datasets/Geometry_Engine/Modify/Fillet.json b/.ci/Datasets/Geometry_Engine/Modify/Fillet.json new file mode 100644 index 000000000..8c4ac8691 --- /dev/null +++ b/.ci/Datasets/Geometry_Engine/Modify/Fillet.json @@ -0,0 +1 @@ +{ "_t" : "BH.oM.Data.Library.Dataset", "SourceInformation" : { "_t" : "BH.oM.Data.Library.Source", "SourceLink" : "", "Title" : "Fillet", "Author" : "Christopher Short", "ItemReference" : "", "Version" : "", "Publisher" : "", "Schema" : "", "Language" : "", "Location" : "", "Copyright" : "", "Contributors" : "", "Confidence" : "High", "BHoM_Guid" : "ebaf1c21-00d3-4ef2-9422-4caea03607e3", "Name" : "" }, "TimeOfCreation" : { "$date" : 1788776661261 }, "Data" : [{ "_t" : "BH.oM.Test.UnitTests.UnitTest", "Method" : { "_t" : "System.Reflection.MethodBase", "TypeName" : "{ \"_t\" : \"System.Type\", \"Name\" : \"BH.Engine.Geometry.Modify, Geometry_Engine, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null\", \"_bhomVersion\" : \"9.3\" }", "MethodName" : "Fillet", "Parameters" : ["{ \"_t\" : \"System.Type\", \"Name\" : \"BH.oM.Geometry.Polyline\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }"], "_bhomVersion" : "9.3" }, "Data" : [{ "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -8.6165725230395473, "Y" : 14.647882460889299, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 7.0568169740295179, "Y" : 22.317839023284794, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 16.171837816296637, "Y" : 13.20281818101768, "Z" : 0.0 }] }, 1.8300000000000001, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.6165725230395473, "Y" : 14.647882460889299, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.8827194016384965, "Y" : 21.743280636795571, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.43955286398082632, "Y" : 0.89821672204777681, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.89821672204777681, "Y" : 0.43955286398082632, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.94594594594594605 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.6871011427234084, "Y" : 20.09954403544814, "Z" : 0.0 } }, "Radius" : 1.8299999999999994, "StartAngle" : 0.0, "EndAngle" : 1.2404989719656432 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 7.9811065522947908, "Y" : 21.39354944501952, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 16.171837816296637, "Y" : 13.20281818101768, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "4014f049-7e6e-42c9-b433-c69aefe7101a", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -4.5153854936660922, "Y" : -1.2790362342573496, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -6.4920778557001766, "Y" : 9.06952966109756, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 8.817598281622633, "Y" : 6.1238704549291212, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -11.4144294239027, "Y" : 1.0852428654304769, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.39910947236997, "Y" : -10.348565895354911, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 7.6160793948960306, "Y" : -2.0929683833302071, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 8.5075288914996374, "Y" : 3.0231765536991864, "Z" : 0.0 }] }, 1.8300000000000001, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.5153854936660922, "Y" : -1.2790362342573496, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -5.9858686242763719, "Y" : 6.4193754495258784, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.98224183660571229, "Y" : -0.18761922721682095, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.18761922721682095, "Y" : 0.98224183660571229, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.92910169278788768 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.1883660632879183, "Y" : 6.7627186353326607, "Z" : 0.0 } }, "Radius" : 1.8300000000000001, "StartAngle" : 0.0, "EndAngle" : 1.9496162789470843 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.842606595296441, "Y" : 8.5597579755515252, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 1.1627602129612278, "Y" : 7.5967000580133401, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.18893959999534321, "Y" : 0.98198871050211145, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.98198871050211156, "Y" : -0.18893959999534324, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.42064769696994853 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 0.83792036326493058, "Y" : 5.9083876813023242, "Z" : 0.0 } }, "Radius" : 1.7192788049953716, "StartAngle" : 0.0, "EndAngle" : 2.7074335188416687 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 1.2534025454240361, "Y" : 4.2400669190942226, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.9905135175416326, "Y" : 1.6889000834897461, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.24166073643897687, "Y" : 0.97036080323958429, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.9703608032395844, "Y" : -0.2416607364389769, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.95346992796453134 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.548274369858305, "Y" : -0.086860186438693088, "Z" : 0.0 } }, "Radius" : 1.8299999999999998, "StartAngle" : 0.0, "EndAngle" : 1.8770493552506229 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -10.108078529974337, "Y" : -1.0438925694251402, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -5.4069283636705805, "Y" : -8.7059881443401039, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.85235200006340572, "Y" : -0.52296851529314081, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.52296851529314081, "Y" : -0.85235200006340572, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.99866470480034186 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.8471242035545479, "Y" : -7.7489557613536562, "Z" : 0.0 } }, "Radius" : 1.8300000000000001, "StartAngle" : 0.0, "EndAngle" : 1.6224798343074009 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.8107894766022405, "Y" : -9.257236349875793, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.9816996792150388, "Y" : -2.5288486395884364, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.56630312948213479, "Y" : -0.82419704290827234, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.82419704290827234, "Y" : 0.56630312948213479, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.71475402237226959 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.9453649522627323, "Y" : -1.0205680510662984, "Z" : 0.0 } }, "Radius" : 1.8299999999999996, "StartAngle" : 0.0, "EndAngle" : 0.79627233310392032 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 7.7482021302940263, "Y" : -1.3346987714808423, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.5075288914996374, "Y" : 3.0231765536991864, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "9b62f78e-1321-4d42-8c84-7c3f0ff58b53", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -2.0808069096255757, "Y" : -26.933828106748301, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -11.853598780332099, "Y" : -17.161036236041781, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 10.973892678855524, "Y" : -18.109142910065543, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.406193671934549, "Y" : -30.799186085460576, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 13.599418853075187, "Y" : -33.643506107531877, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 6.7438782870571758, "Y" : -25.256408606552402, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -2.0808069096255757, "Y" : -26.933828106748301, "Z" : 0.0 }] }, 1.8300000000000001, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.7654059617225499, "Y" : -26.249229054651327, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.5365001397401166, "Y" : -20.478134876633764, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.70710678118654724, "Y" : -0.70710678118654768, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.70710678118654779, "Y" : 0.70710678118654735, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.67715432298275957 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -7.2424947301687341, "Y" : -19.18412946706238, "Z" : 0.0 } }, "Radius" : 1.8300000000000014, "StartAngle" : 0.0, "EndAngle" : 2.3977041789262672 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -7.1665538125573587, "Y" : -17.355705835342327, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 3.8894647641755844, "Y" : -17.814901495078839, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.041497769186543035, "Y" : 0.99913859656833415, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99913859656833415, "Y" : -0.041497769186543035, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.48394509730038804 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 3.8135238465642107, "Y" : -19.643325126798889, "Z" : 0.0 } }, "Radius" : 1.8299999999999981, "StartAngle" : 0.0, "EndAngle" : 2.6364353558550673 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.6319247263291325, "Y" : -21.280126886328738, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.7657209401051386, "Y" : -27.978949719545874, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.44721359549995798, "Y" : 0.89442719099991597, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.89442719099991597, "Y" : -0.44721359549995798, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.53530014514623869 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -7.9473200603402159, "Y" : -29.615751479075719, "Z" : 0.0 } }, "Radius" : 1.8299999999999992, "StartAngle" : 0.0, "EndAngle" : 2.5767296029215205 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.1322282235362433, "Y" : -31.436385701313529, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 9.1973400673370413, "Y" : -33.196419980855346, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.10104271212897686, "Y" : -0.99488208865454042, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99488208865454031, "Y" : -0.10104271212897685, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.70634759202153097 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 9.3822482305330688, "Y" : -31.375785758617539, "Z" : 0.0 } }, "Radius" : 1.8299999999999979, "StartAngle" : 0.0, "EndAngle" : 2.3572675702614978 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 10.799138875170913, "Y" : -30.217631666478777, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 7.432911286489718, "Y" : -26.099374510113488, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.77425718286220913, "Y" : 0.63287108860041585, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.63287108860041597, "Y" : 0.77425718286220924, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.87881937697629753 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.016020641851874, "Y" : -27.25752860225225, "Z" : 0.0 } }, "Radius" : 1.8300000000000016, "StartAngle" : 0.0, "EndAngle" : 1.0733822354080464 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.6742882586139647, "Y" : -25.459719107826732, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.1296681689132586, "Y" : -26.753033139505462, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.18673900723383038, "Y" : -0.98240955979536526, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.98240955979536537, "Y" : -0.18673900723383041, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.82671287996087872 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.4714005521511682, "Y" : -24.955223645079943, "Z" : 0.0 } }, "Radius" : 1.8299999999999998, "StartAngle" : 0.0, "EndAngle" : 0.97323987380973187 }] }], "BHoM_Guid" : "78f10eeb-babb-476e-80d3-cac5c7a85c37", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }] }, 1.8300000000000001, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "ef323ab9-3916-4b17-a581-37b993d434bf", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -12.333294483078074, "Y" : -50.058662911947017, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.49677153761105, "Y" : -40.467247970184154, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.1120816758527674, "Y" : -40.106668461095325, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -1.5794120050266027, "Y" : -41.634959286628309, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -2.4534159340441519, "Y" : -49.842315206493716, "Z" : 0.0 }] }, 1.8300000000000001, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.333294483078074, "Y" : -50.058662911947017, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -14.010702410825461, "Y" : -42.622154432266939, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.97549180943120295, "Y" : -0.22003574648824134, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.22003574648824134, "Y" : 0.97549180943120295, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.98253982685140506 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.225552399566357, "Y" : -42.219489016193457, "Z" : 0.0 } }, "Radius" : 1.8300000000000023, "StartAngle" : 0.0, "EndAngle" : 1.7579391634955841 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.289055796877559, "Y" : -40.390591173630909, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.655505283606038, "Y" : -40.125537336364538, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.03470131000612009, "Y" : 0.99939772817625472, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99939772817625472, "Y" : 0.03470131000612009, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.54605388172266367 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.5920018862948382, "Y" : -41.954435178927085, "Z" : 0.0 } }, "Radius" : 1.8300000000000012, "StartAngle" : 0.0, "EndAngle" : 0.57764659036259003 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.646525094816059, "Y" : -40.387599630193584, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.5770286649157401, "Y" : -41.032966691119363, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.51665398441463384, "Y" : 0.85619428892540694, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.85619428892540694, "Y" : -0.51665398441463384, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.90608980444991782 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.5225054563945193, "Y" : -42.599802239852856, "Z" : 0.0 } }, "Radius" : 1.8299999999999985, "StartAngle" : 0.0, "EndAngle" : 1.1339485079789842 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.7027943021036271, "Y" : -42.793583856497236, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.4534159340441519, "Y" : -49.842315206493716, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "9421cf68-6f2e-414c-b1f4-9b9b57565941", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 20.680645937491363, "Y" : -48.351578267897722, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -30.404316128055978, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 40.716674889177597, "Y" : -47.116480592793778, "Z" : 0.0 }] }, 1.8300000000000001, 9.9999999999999995E-07, 0.61689044238027346], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 20.680645937491363, "Y" : -48.351578267897722, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 25.42406852728767, "Y" : -32.513435650751482, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.95795969456382246, "Y" : 0.28690281210052304, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.28690281210052304, "Y" : 0.95795969456382246, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.98314540865002542 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 27.177134768339464, "Y" : -33.038467796895439, "Z" : 0.0 } }, "Radius" : 1.829999999999999, "StartAngle" : 0.0, "EndAngle" : 1.7546557922477815 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 28.013822646194988, "Y" : -31.410937952299761, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 40.716674889177597, "Y" : -47.116480592793778, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "6c9c83fe-68c5-4c88-a9a4-dfa2d192b5b7", "Name" : "" }], "BHoM_Guid" : "50c0cc3d-4147-48c6-9698-a3aaa9bae8a5", "Name" : "" }], "BHoM_Guid" : "8421b8d1-8fad-4efc-ab96-9c391912b982", "Name" : "Fillet", "_bhomVersion" : "9.3" } \ No newline at end of file diff --git a/Geometry_Engine/Modify/Fillet.cs b/Geometry_Engine/Modify/Fillet.cs index 26174b093..bcdef1f19 100644 --- a/Geometry_Engine/Modify/Fillet.cs +++ b/Geometry_Engine/Modify/Fillet.cs @@ -101,6 +101,9 @@ public static PolyCurve Fillet(this Polyline polyline, double radius, // further than distTol from both its neighbours - the closing pair of a closed polyline included. // Everything downstream relies on that: it is what makes every segment long enough to trim and // build on, and so what keeps the assembled curve contiguous. + // Not Modify.RemoveShortSegments, which cannot offer that guarantee here: it restores the + // original end point of an open polyline, so the last segment may come back shorter than the + // tolerance, and it re-closes a closed one, whereas the wrap is handled by segCount below. private static List FilletVertices(IList pts, bool closed, double distTol) { List vertices = new List(); @@ -301,7 +304,7 @@ private static PolyCurve FilletedCurve(List vertices, double[] trim, Arc[ double tStart = arcs[s] == null ? 0 : trim[s]; double tEnd = arcs[vEnd] == null ? 0 : trim[vEnd]; - output.Add(new Line { Start = pA + dir * tStart, End = pB - dir * tEnd }); + output.Add(BH.Engine.Geometry.Create.Line(pA + dir * tStart, pB - dir * tEnd)); if (arcs[vEnd] != null) output.Add(arcs[vEnd]); From c6c92bf0838ef586d51b9ec80610182ed15eb2b3 Mon Sep 17 00:00:00 2001 From: Christopher Short Date: Tue, 8 Sep 2026 00:06:57 +0100 Subject: [PATCH 3/7] Update to comments --- .../Geometry_Engine/Modify/Fillet.json | 2 +- Geometry_Engine/Modify/Fillet.cs | 251 ++++++++++++------ 2 files changed, 174 insertions(+), 79 deletions(-) diff --git a/.ci/Datasets/Geometry_Engine/Modify/Fillet.json b/.ci/Datasets/Geometry_Engine/Modify/Fillet.json index 8c4ac8691..1029ff802 100644 --- a/.ci/Datasets/Geometry_Engine/Modify/Fillet.json +++ b/.ci/Datasets/Geometry_Engine/Modify/Fillet.json @@ -1 +1 @@ -{ "_t" : "BH.oM.Data.Library.Dataset", "SourceInformation" : { "_t" : "BH.oM.Data.Library.Source", "SourceLink" : "", "Title" : "Fillet", "Author" : "Christopher Short", "ItemReference" : "", "Version" : "", "Publisher" : "", "Schema" : "", "Language" : "", "Location" : "", "Copyright" : "", "Contributors" : "", "Confidence" : "High", "BHoM_Guid" : "ebaf1c21-00d3-4ef2-9422-4caea03607e3", "Name" : "" }, "TimeOfCreation" : { "$date" : 1788776661261 }, "Data" : [{ "_t" : "BH.oM.Test.UnitTests.UnitTest", "Method" : { "_t" : "System.Reflection.MethodBase", "TypeName" : "{ \"_t\" : \"System.Type\", \"Name\" : \"BH.Engine.Geometry.Modify, Geometry_Engine, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null\", \"_bhomVersion\" : \"9.3\" }", "MethodName" : "Fillet", "Parameters" : ["{ \"_t\" : \"System.Type\", \"Name\" : \"BH.oM.Geometry.Polyline\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }"], "_bhomVersion" : "9.3" }, "Data" : [{ "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -8.6165725230395473, "Y" : 14.647882460889299, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 7.0568169740295179, "Y" : 22.317839023284794, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 16.171837816296637, "Y" : 13.20281818101768, "Z" : 0.0 }] }, 1.8300000000000001, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.6165725230395473, "Y" : 14.647882460889299, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.8827194016384965, "Y" : 21.743280636795571, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.43955286398082632, "Y" : 0.89821672204777681, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.89821672204777681, "Y" : 0.43955286398082632, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.94594594594594605 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.6871011427234084, "Y" : 20.09954403544814, "Z" : 0.0 } }, "Radius" : 1.8299999999999994, "StartAngle" : 0.0, "EndAngle" : 1.2404989719656432 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 7.9811065522947908, "Y" : 21.39354944501952, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 16.171837816296637, "Y" : 13.20281818101768, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "4014f049-7e6e-42c9-b433-c69aefe7101a", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -4.5153854936660922, "Y" : -1.2790362342573496, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -6.4920778557001766, "Y" : 9.06952966109756, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 8.817598281622633, "Y" : 6.1238704549291212, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -11.4144294239027, "Y" : 1.0852428654304769, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.39910947236997, "Y" : -10.348565895354911, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 7.6160793948960306, "Y" : -2.0929683833302071, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 8.5075288914996374, "Y" : 3.0231765536991864, "Z" : 0.0 }] }, 1.8300000000000001, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.5153854936660922, "Y" : -1.2790362342573496, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -5.9858686242763719, "Y" : 6.4193754495258784, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.98224183660571229, "Y" : -0.18761922721682095, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.18761922721682095, "Y" : 0.98224183660571229, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.92910169278788768 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.1883660632879183, "Y" : 6.7627186353326607, "Z" : 0.0 } }, "Radius" : 1.8300000000000001, "StartAngle" : 0.0, "EndAngle" : 1.9496162789470843 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.842606595296441, "Y" : 8.5597579755515252, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 1.1627602129612278, "Y" : 7.5967000580133401, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.18893959999534321, "Y" : 0.98198871050211145, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.98198871050211156, "Y" : -0.18893959999534324, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.42064769696994853 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 0.83792036326493058, "Y" : 5.9083876813023242, "Z" : 0.0 } }, "Radius" : 1.7192788049953716, "StartAngle" : 0.0, "EndAngle" : 2.7074335188416687 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 1.2534025454240361, "Y" : 4.2400669190942226, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.9905135175416326, "Y" : 1.6889000834897461, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.24166073643897687, "Y" : 0.97036080323958429, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.9703608032395844, "Y" : -0.2416607364389769, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.95346992796453134 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.548274369858305, "Y" : -0.086860186438693088, "Z" : 0.0 } }, "Radius" : 1.8299999999999998, "StartAngle" : 0.0, "EndAngle" : 1.8770493552506229 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -10.108078529974337, "Y" : -1.0438925694251402, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -5.4069283636705805, "Y" : -8.7059881443401039, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.85235200006340572, "Y" : -0.52296851529314081, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.52296851529314081, "Y" : -0.85235200006340572, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.99866470480034186 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.8471242035545479, "Y" : -7.7489557613536562, "Z" : 0.0 } }, "Radius" : 1.8300000000000001, "StartAngle" : 0.0, "EndAngle" : 1.6224798343074009 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.8107894766022405, "Y" : -9.257236349875793, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.9816996792150388, "Y" : -2.5288486395884364, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.56630312948213479, "Y" : -0.82419704290827234, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.82419704290827234, "Y" : 0.56630312948213479, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.71475402237226959 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.9453649522627323, "Y" : -1.0205680510662984, "Z" : 0.0 } }, "Radius" : 1.8299999999999996, "StartAngle" : 0.0, "EndAngle" : 0.79627233310392032 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 7.7482021302940263, "Y" : -1.3346987714808423, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.5075288914996374, "Y" : 3.0231765536991864, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "9b62f78e-1321-4d42-8c84-7c3f0ff58b53", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -2.0808069096255757, "Y" : -26.933828106748301, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -11.853598780332099, "Y" : -17.161036236041781, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 10.973892678855524, "Y" : -18.109142910065543, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.406193671934549, "Y" : -30.799186085460576, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 13.599418853075187, "Y" : -33.643506107531877, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 6.7438782870571758, "Y" : -25.256408606552402, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -2.0808069096255757, "Y" : -26.933828106748301, "Z" : 0.0 }] }, 1.8300000000000001, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.7654059617225499, "Y" : -26.249229054651327, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.5365001397401166, "Y" : -20.478134876633764, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.70710678118654724, "Y" : -0.70710678118654768, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.70710678118654779, "Y" : 0.70710678118654735, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.67715432298275957 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -7.2424947301687341, "Y" : -19.18412946706238, "Z" : 0.0 } }, "Radius" : 1.8300000000000014, "StartAngle" : 0.0, "EndAngle" : 2.3977041789262672 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -7.1665538125573587, "Y" : -17.355705835342327, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 3.8894647641755844, "Y" : -17.814901495078839, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.041497769186543035, "Y" : 0.99913859656833415, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99913859656833415, "Y" : -0.041497769186543035, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.48394509730038804 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 3.8135238465642107, "Y" : -19.643325126798889, "Z" : 0.0 } }, "Radius" : 1.8299999999999981, "StartAngle" : 0.0, "EndAngle" : 2.6364353558550673 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.6319247263291325, "Y" : -21.280126886328738, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.7657209401051386, "Y" : -27.978949719545874, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.44721359549995798, "Y" : 0.89442719099991597, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.89442719099991597, "Y" : -0.44721359549995798, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.53530014514623869 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -7.9473200603402159, "Y" : -29.615751479075719, "Z" : 0.0 } }, "Radius" : 1.8299999999999992, "StartAngle" : 0.0, "EndAngle" : 2.5767296029215205 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.1322282235362433, "Y" : -31.436385701313529, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 9.1973400673370413, "Y" : -33.196419980855346, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.10104271212897686, "Y" : -0.99488208865454042, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99488208865454031, "Y" : -0.10104271212897685, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.70634759202153097 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 9.3822482305330688, "Y" : -31.375785758617539, "Z" : 0.0 } }, "Radius" : 1.8299999999999979, "StartAngle" : 0.0, "EndAngle" : 2.3572675702614978 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 10.799138875170913, "Y" : -30.217631666478777, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 7.432911286489718, "Y" : -26.099374510113488, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.77425718286220913, "Y" : 0.63287108860041585, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.63287108860041597, "Y" : 0.77425718286220924, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.87881937697629753 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.016020641851874, "Y" : -27.25752860225225, "Z" : 0.0 } }, "Radius" : 1.8300000000000016, "StartAngle" : 0.0, "EndAngle" : 1.0733822354080464 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.6742882586139647, "Y" : -25.459719107826732, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.1296681689132586, "Y" : -26.753033139505462, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.18673900723383038, "Y" : -0.98240955979536526, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.98240955979536537, "Y" : -0.18673900723383041, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.82671287996087872 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.4714005521511682, "Y" : -24.955223645079943, "Z" : 0.0 } }, "Radius" : 1.8299999999999998, "StartAngle" : 0.0, "EndAngle" : 0.97323987380973187 }] }], "BHoM_Guid" : "78f10eeb-babb-476e-80d3-cac5c7a85c37", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }] }, 1.8300000000000001, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "ef323ab9-3916-4b17-a581-37b993d434bf", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -12.333294483078074, "Y" : -50.058662911947017, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.49677153761105, "Y" : -40.467247970184154, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.1120816758527674, "Y" : -40.106668461095325, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -1.5794120050266027, "Y" : -41.634959286628309, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -2.4534159340441519, "Y" : -49.842315206493716, "Z" : 0.0 }] }, 1.8300000000000001, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.333294483078074, "Y" : -50.058662911947017, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -14.010702410825461, "Y" : -42.622154432266939, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.97549180943120295, "Y" : -0.22003574648824134, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.22003574648824134, "Y" : 0.97549180943120295, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.98253982685140506 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.225552399566357, "Y" : -42.219489016193457, "Z" : 0.0 } }, "Radius" : 1.8300000000000023, "StartAngle" : 0.0, "EndAngle" : 1.7579391634955841 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.289055796877559, "Y" : -40.390591173630909, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.655505283606038, "Y" : -40.125537336364538, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.03470131000612009, "Y" : 0.99939772817625472, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99939772817625472, "Y" : 0.03470131000612009, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.54605388172266367 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.5920018862948382, "Y" : -41.954435178927085, "Z" : 0.0 } }, "Radius" : 1.8300000000000012, "StartAngle" : 0.0, "EndAngle" : 0.57764659036259003 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.646525094816059, "Y" : -40.387599630193584, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.5770286649157401, "Y" : -41.032966691119363, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.51665398441463384, "Y" : 0.85619428892540694, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.85619428892540694, "Y" : -0.51665398441463384, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.90608980444991782 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.5225054563945193, "Y" : -42.599802239852856, "Z" : 0.0 } }, "Radius" : 1.8299999999999985, "StartAngle" : 0.0, "EndAngle" : 1.1339485079789842 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.7027943021036271, "Y" : -42.793583856497236, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.4534159340441519, "Y" : -49.842315206493716, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "9421cf68-6f2e-414c-b1f4-9b9b57565941", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 20.680645937491363, "Y" : -48.351578267897722, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -30.404316128055978, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 40.716674889177597, "Y" : -47.116480592793778, "Z" : 0.0 }] }, 1.8300000000000001, 9.9999999999999995E-07, 0.61689044238027346], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 20.680645937491363, "Y" : -48.351578267897722, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 25.42406852728767, "Y" : -32.513435650751482, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.95795969456382246, "Y" : 0.28690281210052304, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.28690281210052304, "Y" : 0.95795969456382246, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.98314540865002542 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 27.177134768339464, "Y" : -33.038467796895439, "Z" : 0.0 } }, "Radius" : 1.829999999999999, "StartAngle" : 0.0, "EndAngle" : 1.7546557922477815 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 28.013822646194988, "Y" : -31.410937952299761, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 40.716674889177597, "Y" : -47.116480592793778, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "6c9c83fe-68c5-4c88-a9a4-dfa2d192b5b7", "Name" : "" }], "BHoM_Guid" : "50c0cc3d-4147-48c6-9698-a3aaa9bae8a5", "Name" : "" }], "BHoM_Guid" : "8421b8d1-8fad-4efc-ab96-9c391912b982", "Name" : "Fillet", "_bhomVersion" : "9.3" } \ No newline at end of file +{ "_t" : "BH.oM.Data.Library.Dataset", "SourceInformation" : { "_t" : "BH.oM.Data.Library.Source", "SourceLink" : "", "Title" : "Fillet", "Author" : "Christopher Short", "ItemReference" : "", "Version" : "", "Publisher" : "", "Schema" : "", "Language" : "", "Location" : "", "Copyright" : "", "Contributors" : "", "Confidence" : "High", "BHoM_Guid" : "01efaea8-3065-47ba-a4f4-526db65cc6fe", "Name" : "" }, "TimeOfCreation" : { "$date" : 1788822402614 }, "Data" : [{ "_t" : "BH.oM.Test.UnitTests.UnitTest", "Method" : { "_t" : "System.Reflection.MethodBase", "TypeName" : "{ \"_t\" : \"System.Type\", \"Name\" : \"BH.Engine.Geometry.Modify, Geometry_Engine, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null\", \"_bhomVersion\" : \"9.3\" }", "MethodName" : "Fillet", "Parameters" : ["{ \"_t\" : \"System.Type\", \"Name\" : \"BH.oM.Geometry.Polyline\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }"], "_bhomVersion" : "9.3" }, "Data" : [{ "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -8.6165725230395473, "Y" : 14.647882460889299, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 7.0568169740295179, "Y" : 22.317839023284794, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 16.171837816296637, "Y" : 13.20281818101768, "Z" : 0.0 }] }, 4.4500000000000002, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.6165725230395473, "Y" : 14.647882460889299, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.201770964663373, "Y" : 20.920688848488595, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.43955286398082627, "Y" : 0.89821672204777681, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.89821672204777681, "Y" : 0.43955286398082627, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.94594594594594561 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.15778120937805, "Y" : 16.923624435375988, "Z" : 0.0 } }, "Radius" : 4.4500000000000002, "StartAngle" : 0.0, "EndAngle" : 1.2404989719656419 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 9.3044063856581865, "Y" : 20.070249611656127, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 16.171837816296637, "Y" : 13.20281818101768, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "94640db3-7d3d-49dc-aea2-fde60c4da83b", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -4.5153854936660922, "Y" : -1.2790362342573496, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -6.4920778557001766, "Y" : 9.06952966109756, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 8.817598281622633, "Y" : 6.1238704549291212, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -11.4144294239027, "Y" : 1.0852428654304769, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.39910947236997, "Y" : -10.348565895354911, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 7.6160793948960306, "Y" : -2.0929683833302071, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 8.5075288914996374, "Y" : 3.0231765536991864, "Z" : 0.0 }] }, 4.4500000000000002, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.5153854936660922, "Y" : -1.2790362342573496, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -5.7743138539569516, "Y" : 5.3118240049124434, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.98224183660571218, "Y" : -0.18761922721682137, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.18761922721682137, "Y" : 0.98224183660571229, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.92910169278788746 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.2255997033084225, "Y" : 5.7986570449239601, "Z" : 0.0 } }, "Radius" : 2.5947929070665561, "StartAngle" : 0.0, "EndAngle" : 1.9496162789470852 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.7353405693765134, "Y" : 8.3467143857542734, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.7353386053990931, "Y" : 8.3467140078750734, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.18893959999534329, "Y" : 0.98198871050211145, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.98198871050211134, "Y" : -0.18893959999534329, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.42064769696994875 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.2255977393310022, "Y" : 5.798656667044761, "Z" : 0.0 } }, "Radius" : 2.5947929070665561, "StartAngle" : 0.0, "EndAngle" : 2.7074335188416683 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.5985381745026643, "Y" : 3.2807713375032819, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -5.5202076843908161, "Y" : 2.5531524940445474, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.24166073643897712, "Y" : 0.97036080323958429, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.97036080323958429, "Y" : -0.24166073643897712, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.95346992796453156 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.4448174072373678, "Y" : -1.7649530803716031, "Z" : 0.0 } }, "Radius" : 4.4500000000000002, "StartAngle" : 0.0, "EndAngle" : 1.8770493552506224 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.2377838075195253, "Y" : -4.0921629734260785, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -6.8498166124179036, "Y" : -6.3543194516303787, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.85235200006340595, "Y" : -0.52296851529314037, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.52296851529314037, "Y" : -0.85235200006340595, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.99866470480034175 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.056850212135747, "Y" : -4.027109558575904, "Z" : 0.0 } }, "Radius" : 4.4500000000000002, "StartAngle" : 0.0, "EndAngle" : 1.6224798343074014 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -0.53680128594024534, "Y" : -7.6947863995177137, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.0734620534859696, "Y" : -3.1528957824280877, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.56630312948213513, "Y" : -0.824197042908272, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.82419704290827212, "Y" : 0.56630312948213524, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.71475402237226915 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 3.5534131272904679, "Y" : 0.5147810585137238, "Z" : 0.0 } }, "Radius" : 4.4500000000000011, "StartAngle" : 0.0, "EndAngle" : 0.79627233310391987 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 7.9373614563829591, "Y" : -0.24908872610087718, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.5075288914996374, "Y" : 3.0231765536991864, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "e45dc6d2-ed39-4427-8633-76cc51aab00e", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -2.0808069096255757, "Y" : -26.933828106748301, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -11.853598780332099, "Y" : -17.161036236041781, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 10.973892678855524, "Y" : -18.109142910065543, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.406193671934549, "Y" : -30.799186085460576, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 13.599418853075187, "Y" : -33.643506107531877, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 6.7438782870571758, "Y" : -25.256408606552402, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -2.0808069096255757, "Y" : -26.933828106748301, "Z" : 0.0 }] }, 4.4500000000000002, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.7455423095335183, "Y" : -25.269092706840357, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -5.4210108607884306, "Y" : -23.593624155585449, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.7071067811865468, "Y" : -0.70710678118654813, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.70710678118654813, "Y" : 0.7071067811865468, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.67715432298275857 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.9116481714873004, "Y" : -21.084261466284314, "Z" : 0.0 } }, "Radius" : 3.548774748122685, "StartAngle" : 0.0, "EndAngle" : 2.3977041789262685 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.7643819360946669, "Y" : -17.538543644907872, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.7643799378174769, "Y" : -17.538543727903409, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.04149776918654375, "Y" : 0.99913859656833404, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99913859656833415, "Y" : -0.041497769186543756, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.48394509730038943 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.9116461732101069, "Y" : -21.084261549279848, "Z" : 0.0 } }, "Radius" : 3.548774748122681, "StartAngle" : 0.0, "EndAngle" : 2.6364353558550659 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.3245858584827044, "Y" : -24.258382178734657, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.3245876473370863, "Y" : -24.258383073161848, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.44721359549995759, "Y" : 0.89442719099991608, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.89442719099991608, "Y" : -0.44721359549995759, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.53530014514623803 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 0.5734798353500139, "Y" : -28.054518038536052, "Z" : 0.0 } }, "Radius" : 4.2442079171702645, "StartAngle" : 0.0, "EndAngle" : 2.576729602921521 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 0.14463355655985666, "Y" : -32.27700447585454, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.9505460478698726, "Y" : -32.765104963253215, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.10104271212897636, "Y" : -0.99488208865454042, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99488208865454053, "Y" : -0.10104271212897636, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.70634759202153252 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.3138396784400079, "Y" : -29.188059985331869, "Z" : 0.0 } }, "Radius" : 3.5954461525776122, "StartAngle" : 0.0, "EndAngle" : 2.357267570261496 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.0976396876675185, "Y" : -26.912606064745905, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.0976384219253408, "Y" : -26.912604516231539, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.77425718286220979, "Y" : 0.63287108860041519, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.6328710886004153, "Y" : 0.7742571828622099, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.87881937697629831 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.3138384126978329, "Y" : -29.188058436817503, "Z" : 0.0 } }, "Radius" : 3.5954461525776056, "StartAngle" : 0.0, "EndAngle" : 1.0733822354080473 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.642428367602796, "Y" : -25.655857764795797, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 0.23207144893716247, "Y" : -26.494190071649598, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.18673900723383033, "Y" : -0.98240955979536537, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.98240955979536537, "Y" : -0.18673900723383033, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.82671287996087917 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -0.59891713325338247, "Y" : -22.122467530560222, "Z" : 0.0 } }, "Radius" : 4.4500000000000002, "StartAngle" : 0.0, "EndAngle" : 0.97323987380973254 }] }], "BHoM_Guid" : "81895d6b-f40a-4eb9-9ec4-f195f235d652", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }] }, 4.4500000000000002, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "d496b2cf-acc0-4086-9df8-a8a3a078ae58", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -12.333294483078074, "Y" : -50.058662911947017, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.49677153761105, "Y" : -40.467247970184154, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.1120816758527674, "Y" : -40.106668461095325, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -1.5794120050266027, "Y" : -41.634959286628309, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -2.4534159340441519, "Y" : -49.842315206493716, "Z" : 0.0 }] }, 4.4500000000000002, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.333294483078074, "Y" : -50.058662911947017, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -13.314800163733523, "Y" : -45.707321061041192, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.97549180943120295, "Y" : -0.22003574648824092, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.22003574648824095, "Y" : 0.97549180943120306, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.98253982685140473 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.9738616117646686, "Y" : -44.72816198916852, "Z" : 0.0 } }, "Radius" : 4.4500000000000011, "StartAngle" : 0.0, "EndAngle" : 1.7579391634955848 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -9.128282441291903, "Y" : -40.280842098784184, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -5.0527164009276886, "Y" : -40.139329389049315, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.034701310006119923, "Y" : 0.99939772817625472, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99939772817625472, "Y" : 0.034701310006119923, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.54605388172266434 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.9427957058770895, "Y" : -43.305045406506572, "Z" : 0.0 } }, "Radius" : 3.1676237880130023, "StartAngle" : 0.0, "EndAngle" : 0.57764659036259103 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.306230254673598, "Y" : -40.592944009745572, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.3062285422850204, "Y" : -40.592945043053547, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.51665398441463384, "Y" : 0.85619428892540694, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.85619428892540694, "Y" : -0.51665398441463384, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.90608980444991671 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.942793993488511, "Y" : -43.305046439814539, "Z" : 0.0 } }, "Radius" : 3.1676237880129978, "StartAngle" : 0.0, "EndAngle" : 1.1339485079789813 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.7929796002401925, "Y" : -43.640471171269368, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.4534159340441519, "Y" : -49.842315206493716, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "43ea09c9-467b-47f1-98af-c1eedc097435", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 20.680645937491363, "Y" : -48.351578267897722, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -30.404316128055978, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 40.716674889177597, "Y" : -47.116480592793778, "Z" : 0.0 }] }, 4.4500000000000002, 9.9999999999999995E-07, 0.61689044238027346], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 20.680645937491363, "Y" : -48.351578267897722, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 24.519713491053253, "Y" : -35.53304939362701, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.95795969456382235, "Y" : 0.28690281210052365, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.28690281210052365, "Y" : 0.95795969456382224, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.98314540865002575 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 28.782634131862263, "Y" : -36.809766907474341, "Z" : 0.0 } }, "Radius" : 4.4500000000000011, "StartAngle" : 0.0, "EndAngle" : 1.7546557922477801 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 30.81720301517214, "Y" : -32.852112367337313, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 40.716674889177597, "Y" : -47.116480592793778, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "8f34ea55-8873-4e55-870a-858e1b7cfe18", "Name" : "" }], "BHoM_Guid" : "c3e06266-117c-45a4-9f37-1c27c239de1f", "Name" : "" }], "BHoM_Guid" : "83a15198-3990-4e3a-b0c3-082637ee9a94", "Name" : "Fillet", "_bhomVersion" : "9.3" } \ No newline at end of file diff --git a/Geometry_Engine/Modify/Fillet.cs b/Geometry_Engine/Modify/Fillet.cs index bcdef1f19..317bc5cea 100644 --- a/Geometry_Engine/Modify/Fillet.cs +++ b/Geometry_Engine/Modify/Fillet.cs @@ -26,6 +26,7 @@ using System.Linq; using BH.oM.Base.Attributes; using BH.oM.Geometry; +using BH.oM.Quantities.Attributes; namespace BH.Engine.Geometry { @@ -35,11 +36,13 @@ public static partial class Modify /**** Public Methods ****/ /***************************************************/ - [Description("Fillets a Polyline by inserting a circular arc at each internal vertex; the end points of an open Polyline stay sharp. The trim taken from either side of a corner is capped at half the adjacent segment, so an arc never runs past a segment midpoint. A corner that cannot be rounded - a joint running straight through or doubling back, or one where the requested radius leaves no room - is left sharp rather than dropped, so the result is always a single contiguous curve.")] + [Description("Fillets a Polyline by inserting a circular arc at each internal vertex; the end points of an open Polyline stay sharp.\n" + + "Where two corners share a segment too short to carry both fillets, the two are reduced in proportion until they fit, and a warning is raised.\n" + + "A corner that cannot be rounded - a joint running straight through or doubling back, or one where there is no room at all - is left sharp rather than dropped, so the result is always a single contiguous curve.")] [Input("polyline", "Polyline to fillet.")] - [Input("radius", "Target fillet radius (> 0). The radius achieved at a corner reduces where the trim-length cap bites.")] - [Input("distTol", "Distance tolerance.")] - [Input("angleTol", "Angle tolerance (radians). A joint is left sharp where it comes within this of running straight through, or of doubling back on itself.")] + [Input("radius", "Target fillet radius, which must be greater than zero. A corner achieves less than this only where the adjacent segments are too short to carry the full radius.", typeof(Length))] + [Input("distTol", "Distance tolerance used for checking point coincidence and segment lengths equal to zero.", typeof(Length))] + [Input("angleTol", "Angle tolerance. A joint is left sharp where it comes within this of running straight through, or of doubling back on itself.", typeof(Angle))] [Output("polyCurve", "The filleted curve, as trimmed Lines joined by Arc fillets, or null where there is nothing to fillet - a null Polyline, fewer than two control points, fewer than three distinct vertices, or a radius that is not a positive number.")] public static PolyCurve Fillet(this Polyline polyline, double radius, double distTol = Tolerance.Distance, double angleTol = Tolerance.Angle) @@ -78,12 +81,15 @@ public static PolyCurve Fillet(this Polyline polyline, double radius, return null; } - // A closed polyline carries a segment from its last vertex back to its first; an open one does not. + // A closed polyline carries a segment from its last vertex back to its first, now that + // FilletVertices has stripped the repeated closing point; an open one does not. int segCount = closed ? vertices.Count : vertices.Count - 1; double[] trim = FilletTrimLengths(vertices, segCount, closed, radius, distTol, angleTol); Arc[] arcs = FilletArcs(vertices, trim, distTol); + WarnOnReducedRadius(arcs, radius, distTol); + return FilletedCurve(vertices, trim, arcs, segCount, closed, distTol); } @@ -91,19 +97,11 @@ public static PolyCurve Fillet(this Polyline polyline, double radius, /**** Private Methods ****/ /***************************************************/ - // Fraction of a segment's own length that its two trims may occupy, on a segment too short for - // the distTol margin to leave any room at all. - private const double ShortSegmentFallbackFraction = 0.99; - - /***************************************************/ - // The polyline's vertices with coincident points collapsed, so that every returned vertex is // further than distTol from both its neighbours - the closing pair of a closed polyline included. - // Everything downstream relies on that: it is what makes every segment long enough to trim and - // build on, and so what keeps the assembled curve contiguous. - // Not Modify.RemoveShortSegments, which cannot offer that guarantee here: it restores the - // original end point of an open polyline, so the last segment may come back shorter than the - // tolerance, and it re-closes a closed one, whereas the wrap is handled by segCount below. + // Everything downstream relies on that to keep the assembled curve contiguous. + // Not Modify.RemoveShortSegments, which re-closes a closed polyline by repeating its first point, + // whereas here the wrap is carried by segCount instead. private static List FilletVertices(IList pts, bool closed, double distTol) { List vertices = new List(); @@ -117,8 +115,10 @@ private static List FilletVertices(IList pts, bool closed, double vertices.Add(pt); } - // A closed polyline repeats its first point last. Drop that repeat, and any further vertex - // that has collapsed onto the first, so the closing segment is no shorter than the rest. + // The loop above only ever compares a point against its predecessor, never against the first + // vertex, so dropping the repeated closing point of a closed polyline is not enough on its own: + // any vertex that has collapsed onto the first has to go too, or the closing segment comes back + // shorter than distTol. while (closed && vertices.Count > 1 && vertices[0].Distance(vertices[vertices.Count - 1]) <= distTol) vertices.RemoveAt(vertices.Count - 1); @@ -128,18 +128,23 @@ private static List FilletVertices(IList pts, bool closed, double /***************************************************/ // How far back along each adjacent segment a corner is cut before its fillet arc starts, per - // vertex, and zero where no fillet applies. This owns every trim decision: the cap from the - // requested radius, the balancing of the two trims a segment carries, and the final check that - // a segment keeps some length between them. + // vertex, and zero where no fillet applies. This owns every trim decision: what the requested radius + // costs at each corner, the sharing of a segment between the two corners that pull on it, and the + // final check that a segment keeps some length between them. private static double[] FilletTrimLengths(List vertices, int segCount, bool closed, double radius, double distTol, double angleTol) { int nVerts = vertices.Count; double[] segLengths = new double[segCount]; for (int s = 0; s < segCount; s++) + { + // The modulo wraps the closing segment of a closed polyline back round to the first vertex. segLengths[s] = vertices[s].Distance(vertices[(s + 1) % nVerts]); + } - double[] trim = new double[nVerts]; + // Trim consumed per unit of achieved radius at each corner, and zero where no fillet applies. + // A sharp corner has a high rate: it pays a lot of segment for very little radius. + double[] rate = new double[nVerts]; for (int i = 0; i < nVerts; i++) { @@ -150,61 +155,24 @@ private static double[] FilletTrimLengths(List vertices, int segCount, bo Vector v1 = vertices[(i - 1 + nVerts) % nVerts] - corner; Vector v2 = vertices[(i + 1) % nVerts] - corner; - double len1 = v1.Length(); - double len2 = v2.Length(); - if (len1 < distTol || len2 < distTol) + if (v1.Length() < distTol || v2.Length() < distTol) continue; - v1 /= len1; - v2 /= len2; - - // Clamped so that rounding on near-parallel vectors cannot push Acos outside its domain. - double d = Math.Max(-1.0, Math.Min(1.0, v1.DotProduct(v2))); - double theta = Math.Acos(d); + double theta = v1.Angle(v2); // There is nothing to round on a joint that runs straight through, or that doubles back // on itself. if (theta < angleTol || Math.Abs(Math.PI - theta) < angleTol) continue; - // The segment leaving vertex i is segment i, and the one arriving is segment i-1. Capping - // at half of each keeps an arc clear of the corner at the far end of either segment. - double tDesired = radius / Math.Tan(theta / 2.0); - double prevHalf = 0.5 * segLengths[(i - 1 + segCount) % segCount]; - double nextHalf = 0.5 * segLengths[i]; - - double t = Math.Min(tDesired, Math.Min(prevHalf, nextHalf)); - if (t > distTol) - trim[i] = t; + double cornerRate = 1.0 / Math.Tan(theta / 2.0); + if (radius * cornerRate > distTol) + rate[i] = cornerRate; } - // Balance the two trims a segment carries against its length. The half-segment cap above - // already holds their sum to the segment length, so this only bites inside the distTol margin - // band - but that band is reachable on a near-regular polygon with a large radius. - double margin = distTol * 2.0; - for (int s = 0; s < segCount; s++) - { - int vEnd = (s + 1) % nVerts; - double sum = trim[s] + trim[vEnd]; - - double maxAllowed = segLengths[s] - margin; - if (maxAllowed < distTol) - maxAllowed = segLengths[s] * ShortSegmentFallbackFraction; - - if (sum <= maxAllowed || (trim[s] <= distTol && trim[vEnd] <= distTol)) - continue; - - double scale = maxAllowed / sum; - trim[s] *= scale; - trim[vEnd] *= scale; - - if (trim[s] <= distTol) - trim[s] = 0; - if (trim[vEnd] <= distTol) - trim[vEnd] = 0; - } + double[] trim = ShareTrims(rate, segLengths, segCount, nVerts, radius, distTol); - // A segment short enough to have fallen back to ShortSegmentFallbackFraction above can still + // A segment short enough to have fallen back to ShortSegmentFallbackFraction in ShareTrims can still // be left with no straight length between its two trims. Give up the smaller corner first, // and both only if that is not enough - a sharp corner is recoverable, a zero-length or // reversed segment is not. @@ -231,6 +199,102 @@ private static double[] FilletTrimLengths(List vertices, int segCount, bo /***************************************************/ + // The trim allowed at each corner once the corners pulling on the same segment have been reconciled. + // Every corner's radius is raised together from zero. A corner stops growing when it reaches the + // radius that was asked for, or when a segment it sits on runs out of room; whatever a stopped corner + // leaves behind is then available to those still growing. That is what keeps a corner held back on + // one segment from squeezing its neighbour on the other with a trim it is never going to take. + // Raising the achieved radius rather than the trim length is deliberate: the caller asked for a + // radius, so corners that can reach it keep it and the rest settle at a common achievable radius. + // Growing every corner together also makes the result independent of the order the segments happen + // to be visited in, so a regular polygon fillets symmetrically. + private static double[] ShareTrims(double[] rate, double[] segLengths, int segCount, int nVerts, double radius, double distTol) + { + double margin = distTol * 2.0; + + double[] capacity = new double[segCount]; + for (int s = 0; s < segCount; s++) + { + capacity[s] = segLengths[s] - margin; + if (capacity[s] < distTol) + capacity[s] = segLengths[s] * ShortSegmentFallbackFraction; + } + + double[] trim = new double[nVerts]; + bool[] growing = new bool[nVerts]; + int growingCount = 0; + + for (int i = 0; i < nVerts; i++) + { + growing[i] = rate[i] > 0; + if (growing[i]) + growingCount++; + } + + double level = 0.0; + + // Each pass stops at least one corner, so it cannot need more passes than there are corners. + for (int pass = 0; pass < nVerts && growingCount > 0; pass++) + { + // The radius at which the next corner stops: the one that was asked for, or the point at + // which some segment runs out of room for the corners still growing on it. + double next = radius; + for (int s = 0; s < segCount; s++) + { + int vEnd = (s + 1) % nVerts; + + double growingRate = (growing[s] ? rate[s] : 0) + (growing[vEnd] ? rate[vEnd] : 0); + if (growingRate <= 0) + continue; + + double headroom = capacity[s] - (growing[s] ? 0 : trim[s]) - (growing[vEnd] ? 0 : trim[vEnd]); + next = Math.Min(next, headroom / growingRate); + } + + level = Math.Max(level, next); + + for (int i = 0; i < nVerts; i++) + { + if (growing[i]) + trim[i] = level * rate[i]; + } + + // Everything stops once the requested radius is reached; short of that, only the pair on + // each segment that has just filled up. + if (level >= radius) + break; + + for (int s = 0; s < segCount; s++) + { + int vEnd = (s + 1) % nVerts; + if (trim[s] + trim[vEnd] < capacity[s] - distTol) + continue; + + if (growing[s]) + { + growing[s] = false; + growingCount--; + } + + if (growing[vEnd]) + { + growing[vEnd] = false; + growingCount--; + } + } + } + + for (int i = 0; i < nVerts; i++) + { + if (trim[i] <= distTol) + trim[i] = 0; + } + + return trim; + } + + /***************************************************/ + // The fillet arc at each vertex, or null where the vertex is not filleted or its arc could not be // built. Resolving every arc before any curve is assembled is what keeps the result contiguous: // assembly treats a null arc as an untrimmed corner, so a corner can never be cut back and then @@ -245,7 +309,7 @@ private static Arc[] FilletArcs(List vertices, double[] trim, double dist if (trim[i] <= 0) continue; - arcs[i] = FilletArc(vertices[(i - 1 + nVerts) % nVerts], vertices[i], vertices[(i + 1) % nVerts], trim[i], distTol); + arcs[i] = CornerArc(vertices[(i - 1 + nVerts) % nVerts], vertices[i], vertices[(i + 1) % nVerts], trim[i], distTol); } return arcs; @@ -255,34 +319,55 @@ private static Arc[] FilletArcs(List vertices, double[] trim, double dist // The arc rounding a single corner, tangent to both adjacent segments at the trim distance from // the corner, or null where no valid arc exists. - private static Arc FilletArc(Point prev, Point corner, Point next, double trim, double distTol) + private static Arc CornerArc(Point prev, Point corner, Point next, double trim, double distTol) { Vector v1 = (prev - corner).Normalise(); Vector v2 = (next - corner).Normalise(); - // Clamped so that rounding on near-parallel vectors cannot push Acos outside its domain. - double d = Math.Max(-1.0, Math.Min(1.0, v1.DotProduct(v2))); - double theta = Math.Acos(d); + double theta = v1.Angle(v2); - // The arc sweeps pi - theta. Create.ArcByCentre throws out of CartesianCoordinateSystem - // rather than returning null when asked for a sweep below Tolerance.Angle, and the joint test - // in FilletTrimLengths only rules that out while the caller leaves angleTol at its default. + // The arc sweeps pi - theta. Create.ArcByCentre guards a sweep near pi but not one near zero, + // and CartesianCoordinateSystem throws rather than returning null on parallel vectors, so + // without this check a doubling-back joint becomes an unhandled exception. The joint test in + // FilletTrimLengths only rules that out while the caller leaves angleTol at its default. if (Math.PI - theta < Tolerance.Angle) return null; - double R = trim * Math.Tan(theta / 2.0); - if (R <= distTol) + double arcRadius = trim * Math.Tan(theta / 2.0); + if (arcRadius <= distTol) return null; // Non-zero because the sweep check above holds theta away from pi. - Vector bis = (v1 + v2).Normalise(); - Point centre = corner + bis * (R / Math.Sin(theta / 2.0)); + Vector bisector = (v1 + v2).Normalise(); + Point centre = corner + bisector * (arcRadius / Math.Sin(theta / 2.0)); return BH.Engine.Geometry.Create.ArcByCentre(centre, corner + v1 * trim, corner + v2 * trim, distTol); } /***************************************************/ + // Warns where the segments available could not carry the radius that was asked for, so that a + // reduced fillet does not have to be spotted by eye. + private static void WarnOnReducedRadius(Arc[] arcs, double radius, double distTol) + { + int reduced = 0; + double smallest = radius; + + foreach (Arc arc in arcs) + { + if (arc == null || arc.Radius >= radius - distTol) + continue; + + reduced++; + smallest = Math.Min(smallest, arc.Radius); + } + + if (reduced > 0) + Base.Compute.RecordWarning("The requested fillet radius of " + radius + " did not fit at " + reduced + " corner(s), where the adjacent segments were too short to carry it. The smallest radius achieved was " + smallest + "."); + } + + /***************************************************/ + // The trimmed Lines and corner Arcs as a single PolyCurve, with a closing Line where a closed // polyline's last curve does not already meet its first. Reads the trims and arcs it is given // and changes neither. @@ -321,5 +406,15 @@ private static PolyCurve FilletedCurve(List vertices, double[] trim, Arc[ return new PolyCurve { Curves = output }; } + /***************************************************/ + /**** Private Fields ****/ + /***************************************************/ + + // Fraction of a segment's own length that its two trims may occupy, on a segment too short for + // the distTol margin to leave any room at all. Deliberately not an input: it has no physical + // meaning a caller could set it from, and only ever applies to a degenerate segment. + private const double ShortSegmentFallbackFraction = 0.99; + + /***************************************************/ } } From 3ca9a1d540272e0ddb22f5f8a96d417757558c7a Mon Sep 17 00:00:00 2001 From: Christopher Short Date: Tue, 8 Sep 2026 13:20:26 +0100 Subject: [PATCH 4/7] update to comments --- .../Geometry_Engine/Modify/Fillet.json | 2 +- Geometry_Engine/Modify/Fillet.cs | 299 ++++++------------ 2 files changed, 101 insertions(+), 200 deletions(-) diff --git a/.ci/Datasets/Geometry_Engine/Modify/Fillet.json b/.ci/Datasets/Geometry_Engine/Modify/Fillet.json index 1029ff802..5bd86aa92 100644 --- a/.ci/Datasets/Geometry_Engine/Modify/Fillet.json +++ b/.ci/Datasets/Geometry_Engine/Modify/Fillet.json @@ -1 +1 @@ -{ "_t" : "BH.oM.Data.Library.Dataset", "SourceInformation" : { "_t" : "BH.oM.Data.Library.Source", "SourceLink" : "", "Title" : "Fillet", "Author" : "Christopher Short", "ItemReference" : "", "Version" : "", "Publisher" : "", "Schema" : "", "Language" : "", "Location" : "", "Copyright" : "", "Contributors" : "", "Confidence" : "High", "BHoM_Guid" : "01efaea8-3065-47ba-a4f4-526db65cc6fe", "Name" : "" }, "TimeOfCreation" : { "$date" : 1788822402614 }, "Data" : [{ "_t" : "BH.oM.Test.UnitTests.UnitTest", "Method" : { "_t" : "System.Reflection.MethodBase", "TypeName" : "{ \"_t\" : \"System.Type\", \"Name\" : \"BH.Engine.Geometry.Modify, Geometry_Engine, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null\", \"_bhomVersion\" : \"9.3\" }", "MethodName" : "Fillet", "Parameters" : ["{ \"_t\" : \"System.Type\", \"Name\" : \"BH.oM.Geometry.Polyline\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }"], "_bhomVersion" : "9.3" }, "Data" : [{ "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -8.6165725230395473, "Y" : 14.647882460889299, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 7.0568169740295179, "Y" : 22.317839023284794, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 16.171837816296637, "Y" : 13.20281818101768, "Z" : 0.0 }] }, 4.4500000000000002, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.6165725230395473, "Y" : 14.647882460889299, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.201770964663373, "Y" : 20.920688848488595, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.43955286398082627, "Y" : 0.89821672204777681, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.89821672204777681, "Y" : 0.43955286398082627, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.94594594594594561 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.15778120937805, "Y" : 16.923624435375988, "Z" : 0.0 } }, "Radius" : 4.4500000000000002, "StartAngle" : 0.0, "EndAngle" : 1.2404989719656419 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 9.3044063856581865, "Y" : 20.070249611656127, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 16.171837816296637, "Y" : 13.20281818101768, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "94640db3-7d3d-49dc-aea2-fde60c4da83b", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -4.5153854936660922, "Y" : -1.2790362342573496, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -6.4920778557001766, "Y" : 9.06952966109756, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 8.817598281622633, "Y" : 6.1238704549291212, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -11.4144294239027, "Y" : 1.0852428654304769, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.39910947236997, "Y" : -10.348565895354911, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 7.6160793948960306, "Y" : -2.0929683833302071, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 8.5075288914996374, "Y" : 3.0231765536991864, "Z" : 0.0 }] }, 4.4500000000000002, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.5153854936660922, "Y" : -1.2790362342573496, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -5.7743138539569516, "Y" : 5.3118240049124434, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.98224183660571218, "Y" : -0.18761922721682137, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.18761922721682137, "Y" : 0.98224183660571229, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.92910169278788746 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.2255997033084225, "Y" : 5.7986570449239601, "Z" : 0.0 } }, "Radius" : 2.5947929070665561, "StartAngle" : 0.0, "EndAngle" : 1.9496162789470852 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.7353405693765134, "Y" : 8.3467143857542734, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.7353386053990931, "Y" : 8.3467140078750734, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.18893959999534329, "Y" : 0.98198871050211145, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.98198871050211134, "Y" : -0.18893959999534329, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.42064769696994875 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.2255977393310022, "Y" : 5.798656667044761, "Z" : 0.0 } }, "Radius" : 2.5947929070665561, "StartAngle" : 0.0, "EndAngle" : 2.7074335188416683 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.5985381745026643, "Y" : 3.2807713375032819, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -5.5202076843908161, "Y" : 2.5531524940445474, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.24166073643897712, "Y" : 0.97036080323958429, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.97036080323958429, "Y" : -0.24166073643897712, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.95346992796453156 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.4448174072373678, "Y" : -1.7649530803716031, "Z" : 0.0 } }, "Radius" : 4.4500000000000002, "StartAngle" : 0.0, "EndAngle" : 1.8770493552506224 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.2377838075195253, "Y" : -4.0921629734260785, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -6.8498166124179036, "Y" : -6.3543194516303787, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.85235200006340595, "Y" : -0.52296851529314037, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.52296851529314037, "Y" : -0.85235200006340595, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.99866470480034175 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.056850212135747, "Y" : -4.027109558575904, "Z" : 0.0 } }, "Radius" : 4.4500000000000002, "StartAngle" : 0.0, "EndAngle" : 1.6224798343074014 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -0.53680128594024534, "Y" : -7.6947863995177137, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.0734620534859696, "Y" : -3.1528957824280877, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.56630312948213513, "Y" : -0.824197042908272, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.82419704290827212, "Y" : 0.56630312948213524, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.71475402237226915 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 3.5534131272904679, "Y" : 0.5147810585137238, "Z" : 0.0 } }, "Radius" : 4.4500000000000011, "StartAngle" : 0.0, "EndAngle" : 0.79627233310391987 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 7.9373614563829591, "Y" : -0.24908872610087718, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.5075288914996374, "Y" : 3.0231765536991864, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "e45dc6d2-ed39-4427-8633-76cc51aab00e", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -2.0808069096255757, "Y" : -26.933828106748301, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -11.853598780332099, "Y" : -17.161036236041781, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 10.973892678855524, "Y" : -18.109142910065543, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.406193671934549, "Y" : -30.799186085460576, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 13.599418853075187, "Y" : -33.643506107531877, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 6.7438782870571758, "Y" : -25.256408606552402, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -2.0808069096255757, "Y" : -26.933828106748301, "Z" : 0.0 }] }, 4.4500000000000002, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.7455423095335183, "Y" : -25.269092706840357, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -5.4210108607884306, "Y" : -23.593624155585449, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.7071067811865468, "Y" : -0.70710678118654813, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.70710678118654813, "Y" : 0.7071067811865468, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.67715432298275857 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.9116481714873004, "Y" : -21.084261466284314, "Z" : 0.0 } }, "Radius" : 3.548774748122685, "StartAngle" : 0.0, "EndAngle" : 2.3977041789262685 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.7643819360946669, "Y" : -17.538543644907872, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.7643799378174769, "Y" : -17.538543727903409, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.04149776918654375, "Y" : 0.99913859656833404, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99913859656833415, "Y" : -0.041497769186543756, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.48394509730038943 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.9116461732101069, "Y" : -21.084261549279848, "Z" : 0.0 } }, "Radius" : 3.548774748122681, "StartAngle" : 0.0, "EndAngle" : 2.6364353558550659 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.3245858584827044, "Y" : -24.258382178734657, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.3245876473370863, "Y" : -24.258383073161848, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.44721359549995759, "Y" : 0.89442719099991608, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.89442719099991608, "Y" : -0.44721359549995759, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.53530014514623803 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 0.5734798353500139, "Y" : -28.054518038536052, "Z" : 0.0 } }, "Radius" : 4.2442079171702645, "StartAngle" : 0.0, "EndAngle" : 2.576729602921521 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 0.14463355655985666, "Y" : -32.27700447585454, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.9505460478698726, "Y" : -32.765104963253215, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.10104271212897636, "Y" : -0.99488208865454042, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99488208865454053, "Y" : -0.10104271212897636, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.70634759202153252 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.3138396784400079, "Y" : -29.188059985331869, "Z" : 0.0 } }, "Radius" : 3.5954461525776122, "StartAngle" : 0.0, "EndAngle" : 2.357267570261496 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.0976396876675185, "Y" : -26.912606064745905, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.0976384219253408, "Y" : -26.912604516231539, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.77425718286220979, "Y" : 0.63287108860041519, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.6328710886004153, "Y" : 0.7742571828622099, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.87881937697629831 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.3138384126978329, "Y" : -29.188058436817503, "Z" : 0.0 } }, "Radius" : 3.5954461525776056, "StartAngle" : 0.0, "EndAngle" : 1.0733822354080473 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.642428367602796, "Y" : -25.655857764795797, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 0.23207144893716247, "Y" : -26.494190071649598, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.18673900723383033, "Y" : -0.98240955979536537, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.98240955979536537, "Y" : -0.18673900723383033, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.82671287996087917 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -0.59891713325338247, "Y" : -22.122467530560222, "Z" : 0.0 } }, "Radius" : 4.4500000000000002, "StartAngle" : 0.0, "EndAngle" : 0.97323987380973254 }] }], "BHoM_Guid" : "81895d6b-f40a-4eb9-9ec4-f195f235d652", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }] }, 4.4500000000000002, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "d496b2cf-acc0-4086-9df8-a8a3a078ae58", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -12.333294483078074, "Y" : -50.058662911947017, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.49677153761105, "Y" : -40.467247970184154, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.1120816758527674, "Y" : -40.106668461095325, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -1.5794120050266027, "Y" : -41.634959286628309, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -2.4534159340441519, "Y" : -49.842315206493716, "Z" : 0.0 }] }, 4.4500000000000002, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.333294483078074, "Y" : -50.058662911947017, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -13.314800163733523, "Y" : -45.707321061041192, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.97549180943120295, "Y" : -0.22003574648824092, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.22003574648824095, "Y" : 0.97549180943120306, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.98253982685140473 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.9738616117646686, "Y" : -44.72816198916852, "Z" : 0.0 } }, "Radius" : 4.4500000000000011, "StartAngle" : 0.0, "EndAngle" : 1.7579391634955848 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -9.128282441291903, "Y" : -40.280842098784184, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -5.0527164009276886, "Y" : -40.139329389049315, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.034701310006119923, "Y" : 0.99939772817625472, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99939772817625472, "Y" : 0.034701310006119923, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.54605388172266434 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.9427957058770895, "Y" : -43.305045406506572, "Z" : 0.0 } }, "Radius" : 3.1676237880130023, "StartAngle" : 0.0, "EndAngle" : 0.57764659036259103 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.306230254673598, "Y" : -40.592944009745572, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.3062285422850204, "Y" : -40.592945043053547, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.51665398441463384, "Y" : 0.85619428892540694, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.85619428892540694, "Y" : -0.51665398441463384, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.90608980444991671 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.942793993488511, "Y" : -43.305046439814539, "Z" : 0.0 } }, "Radius" : 3.1676237880129978, "StartAngle" : 0.0, "EndAngle" : 1.1339485079789813 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.7929796002401925, "Y" : -43.640471171269368, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.4534159340441519, "Y" : -49.842315206493716, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "43ea09c9-467b-47f1-98af-c1eedc097435", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 20.680645937491363, "Y" : -48.351578267897722, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -30.404316128055978, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 40.716674889177597, "Y" : -47.116480592793778, "Z" : 0.0 }] }, 4.4500000000000002, 9.9999999999999995E-07, 0.61689044238027346], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 20.680645937491363, "Y" : -48.351578267897722, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 24.519713491053253, "Y" : -35.53304939362701, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.95795969456382235, "Y" : 0.28690281210052365, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.28690281210052365, "Y" : 0.95795969456382224, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.98314540865002575 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 28.782634131862263, "Y" : -36.809766907474341, "Z" : 0.0 } }, "Radius" : 4.4500000000000011, "StartAngle" : 0.0, "EndAngle" : 1.7546557922477801 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 30.81720301517214, "Y" : -32.852112367337313, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 40.716674889177597, "Y" : -47.116480592793778, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "8f34ea55-8873-4e55-870a-858e1b7cfe18", "Name" : "" }], "BHoM_Guid" : "c3e06266-117c-45a4-9f37-1c27c239de1f", "Name" : "" }], "BHoM_Guid" : "83a15198-3990-4e3a-b0c3-082637ee9a94", "Name" : "Fillet", "_bhomVersion" : "9.3" } \ No newline at end of file +{ "_t" : "BH.oM.Data.Library.Dataset", "SourceInformation" : { "_t" : "BH.oM.Data.Library.Source", "SourceLink" : "", "Title" : "Fillet", "Author" : "Christopher Short", "ItemReference" : "", "Version" : "", "Publisher" : "", "Schema" : "", "Language" : "", "Location" : "", "Copyright" : "", "Contributors" : "", "Confidence" : "High", "BHoM_Guid" : "745f75bb-1595-4e38-b946-c3d3f0f3a725", "Name" : "" }, "TimeOfCreation" : { "$date" : 1788870018300 }, "Data" : [{ "_t" : "BH.oM.Test.UnitTests.UnitTest", "Method" : { "_t" : "System.Reflection.MethodBase", "TypeName" : "{ \"_t\" : \"System.Type\", \"Name\" : \"BH.Engine.Geometry.Modify, Geometry_Engine, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null\", \"_bhomVersion\" : \"9.3\" }", "MethodName" : "Fillet", "Parameters" : ["{ \"_t\" : \"System.Type\", \"Name\" : \"BH.oM.Geometry.Polyline\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }"], "_bhomVersion" : "9.3" }, "Data" : [{ "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -8.6165725230395473, "Y" : 14.647882460889299, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 7.0568169740295179, "Y" : 22.317839023284794, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 16.171837816296637, "Y" : 13.20281818101768, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.6165725230395473, "Y" : 14.647882460889299, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.952423510946157, "Y" : 21.288029456244001, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.43955286398082632, "Y" : 0.89821672204777681, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.89821672204777681, "Y" : 0.43955286398082632, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.94594594594594561 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.3941569048032676, "Y" : 18.341878607927292, "Z" : 0.0 } }, "Radius" : 3.2800000000000007, "StartAngle" : 0.0, "EndAngle" : 1.2404989719656419 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.7134671470951428, "Y" : 20.661188850219169, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 16.171837816296637, "Y" : 13.20281818101768, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "ddd2e298-95fe-4f35-9917-afb1b050709b", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -4.5153854936660922, "Y" : -1.2790362342573496, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -6.4920778557001766, "Y" : 9.06952966109756, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 8.817598281622633, "Y" : 6.1238704549291212, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -11.4144294239027, "Y" : 1.0852428654304769, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.39910947236997, "Y" : -10.348565895354911, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 7.6160793948960306, "Y" : -2.0929683833302071, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 8.5075288914996374, "Y" : 3.0231765536991864, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.5153854936660922, "Y" : -1.2790362342573496, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -6.4920778557001766, "Y" : 9.06952966109756, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -6.4920778557001766, "Y" : 9.06952966109756, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.817598281622633, "Y" : 6.1238704549291212, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.817598281622633, "Y" : 6.1238704549291212, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -7.0699244114085475, "Y" : 2.167207715285342, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.24166073643897693, "Y" : 0.97036080323958429, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.9703608032395844, "Y" : -0.24166073643897695, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.95346992796453145 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -6.2772771958887033, "Y" : -1.0155757193404942, "Z" : 0.0 } }, "Radius" : 3.2799999999999998, "StartAngle" : 0.0, "EndAngle" : 1.8770493552506224 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -9.0729917560966751, "Y" : -2.7309124495019947, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -6.2054733868322671, "Y" : -7.404492112115256, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.85235200006340595, "Y" : -0.52296851529314048, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.52296851529314048, "Y" : -0.85235200006340595, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.99866470480034186 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.4097588266242957, "Y" : -5.6891553819537553, "Z" : 0.0 } }, "Radius" : 3.2799999999999998, "StartAngle" : 0.0, "EndAngle" : 1.6224798343074009 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.5522845619228924, "Y" : -8.3925216826928875, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.4790490848229965, "Y" : -2.8742182415416782, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.56630312948213501, "Y" : -0.82419704290827212, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.82419704290827212, "Y" : 0.56630312948213501, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.71475402237226937 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.6215748201215936, "Y" : -0.17085194080254595, "Z" : 0.0 } }, "Radius" : 3.2799999999999998, "StartAngle" : 0.0, "EndAngle" : 0.79627233310391998 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 7.8528895435875201, "Y" : -0.73388405170948756, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.5075288914996374, "Y" : 3.0231765536991864, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "7b3f45bd-d283-4ba9-9ebb-568e17d35cf4", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -2.0808069096255757, "Y" : -26.933828106748301, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -11.853598780332099, "Y" : -17.161036236041781, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 10.973892678855524, "Y" : -18.109142910065543, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.406193671934549, "Y" : -30.799186085460576, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 13.599418853075187, "Y" : -33.643506107531877, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 6.7438782870571758, "Y" : -25.256408606552402, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -2.0808069096255757, "Y" : -26.933828106748301, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.3078478336026658, "Y" : -25.706787182771212, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -5.9081979381781631, "Y" : -23.106437078195714, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.70710678118654746, "Y" : -0.70710678118654768, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.70710678118654768, "Y" : 0.70710678118654746, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.67715432298275968 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.588887695886287, "Y" : -20.787126835903837, "Z" : 0.0 } }, "Radius" : 3.2800000000000007, "StartAngle" : 0.0, "EndAngle" : 2.3977041789262676 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.4527750129544224, "Y" : -17.509952239159702, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.7238797583850065, "Y" : -17.581759390307951, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.041497769186547885, "Y" : 0.99913859656833404, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99913859656833393, "Y" : -0.041497769186547878, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.48394509730039648 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.8599924413168836, "Y" : -20.858933987052087, "Z" : 0.0 } }, "Radius" : 3.2799999999999998, "StartAngle" : 0.0, "EndAngle" : 2.6364353558550579 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -0.39313184807700985, "Y" : -23.792655173531809, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.2964939121528793, "Y" : -25.744336205569745, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.44721359549995926, "Y" : 0.89442719099991519, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.89442719099991519, "Y" : -0.44721359549995926, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.5353001451462408 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.8296333189130127, "Y" : -28.678057392049467, "Z" : 0.0 } }, "Radius" : 3.2800000000000007, "StartAngle" : 0.0, "EndAngle" : 2.5767296029215183 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.1610534146960596, "Y" : -31.941270642836361, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.7093541442111864, "Y" : -32.84217141053788, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.10104271212897675, "Y" : -0.99488208865454042, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99488208865454031, "Y" : -0.10104271212897672, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.70634759202153163 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.0407742399942306, "Y" : -29.578958159750982, "Z" : 0.0 } }, "Radius" : 3.2800000000000047, "StartAngle" : 0.0, "EndAngle" : 2.3572675702614969 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.5803377997822778, "Y" : -27.50314098914162, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 7.9788663953297103, "Y" : -26.767298313481565, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.77425718286220968, "Y" : 0.63287108860041541, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.63287108860041541, "Y" : 0.77425718286220968, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.87881937697629819 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.4393028355416631, "Y" : -28.843115484090927, "Z" : 0.0 } }, "Radius" : 3.2799999999999994, "StartAngle" : 0.0, "EndAngle" : 1.0733822354080471 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.8267988918146996, "Y" : -25.620812127962129, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -0.37603364758382729, "Y" : -26.609780296608132, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.18673900723383036, "Y" : -0.98240955979536537, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.98240955979536537, "Y" : -0.18673900723383036, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.82671287996087883 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -0.98853759131079078, "Y" : -23.387476940479335, "Z" : 0.0 } }, "Radius" : 3.2799999999999994, "StartAngle" : 0.0, "EndAngle" : 0.97323987380973198 }] }], "BHoM_Guid" : "a813e87c-df53-4ed1-9d4e-c74f0ec9afb5", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "e384747d-27b4-4341-939d-2766cd85397d", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -2.2695742232816443, "Y" : -49.918461094214301, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -1.5573184028592664, "Y" : -41.549455204251352, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.1392457518903853, "Y" : -40.303007518512189, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.645019103120475, "Y" : -40.481071473617781, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -12.330187686747749, "Y" : -50.096525049319894, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -13.398571417381305, "Y" : -51.253940757506257, "Z" : 0.0 }] }, 3.2799999999999998, 1.0, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.2695742232816443, "Y" : -49.918461094214301, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.5573184028592664, "Y" : -41.549455204251352, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.5573184028592664, "Y" : -41.549455204251352, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.1392457518903853, "Y" : -40.303007518512189, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.1392457518903853, "Y" : -40.303007518512189, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -10.554071235501338, "Y" : -40.411733374166609, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.016946718543288081, "Y" : 0.99985639405397342, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.99985639405397342, "Y" : -0.016946718543288081, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.97605046458892153 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -10.498485998679353, "Y" : -43.691262346663642, "Z" : 0.0 } }, "Radius" : 3.2800000000000002, "StartAngle" : 0.0, "EndAngle" : 1.790094057706928 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -13.687379528556864, "Y" : -44.458958937189706, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.330187686747749, "Y" : -50.096525049319894, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.330187686747749, "Y" : -50.096525049319894, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -13.398571417381305, "Y" : -51.253940757506257, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "f1a42223-1240-48da-9a2c-e0fc97974e33", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -2.2695742232816443, "Y" : -49.918461094214301, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -1.5573184028592664, "Y" : -41.549455204251352, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.1392457518903853, "Y" : -40.303007518512189, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.645019103120475, "Y" : -40.481071473617781, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -12.330187686747749, "Y" : -50.096525049319894, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -13.398571417381305, "Y" : -51.253940757506257, "Z" : 0.0 }] }, 3.2799999999999998, 0.51600000000000001, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.2695742232816443, "Y" : -49.918461094214301, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.5573184028592664, "Y" : -41.549455204251352, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.5573184028592664, "Y" : -41.549455204251352, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.1392457518903853, "Y" : -40.303007518512189, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.1392457518903853, "Y" : -40.303007518512189, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -10.554071235501338, "Y" : -40.411733374166609, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.016946718543288081, "Y" : 0.99985639405397342, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.99985639405397342, "Y" : -0.016946718543288081, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.97605046458892153 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -10.498485998679353, "Y" : -43.691262346663642, "Z" : 0.0 } }, "Radius" : 3.2800000000000002, "StartAngle" : 0.0, "EndAngle" : 1.790094057706928 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -13.687379528556864, "Y" : -44.458958937189706, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.330187686747749, "Y" : -50.096525049319894, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.330187686747749, "Y" : -50.096525049319894, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -13.398571417381305, "Y" : -51.253940757506257, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "1818288b-cccb-415f-99d1-919fa07e6afd", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 20.680645937491363, "Y" : -48.351578267897722, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -30.404316128055978, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 40.716674889177597, "Y" : -47.116480592793778, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 0.61689044238027346], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 20.680645937491363, "Y" : -48.351578267897722, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 24.923566694257172, "Y" : -34.184595928297092, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.9579596945638218, "Y" : 0.2869028121005251, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.2869028121005251, "Y" : 0.95795969456382191, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.98314540865002598 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 28.06567449242651, "Y" : -35.125637151986815, "Z" : 0.0 } }, "Radius" : 3.2800000000000025, "StartAngle" : 0.0, "EndAngle" : 1.7546557922477781 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 29.565311781697609, "Y" : -32.208534479706039, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 40.716674889177597, "Y" : -47.116480592793778, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "666f5d60-e51e-4f42-b5ff-896dda7d5086", "Name" : "" }], "BHoM_Guid" : "ed38c900-4f84-4b38-a0d0-e6f4283f8292", "Name" : "" }], "BHoM_Guid" : "258df90c-5186-4480-9944-165e391958d5", "Name" : "Fillet", "_bhomVersion" : "9.3" } \ No newline at end of file diff --git a/Geometry_Engine/Modify/Fillet.cs b/Geometry_Engine/Modify/Fillet.cs index 317bc5cea..8c4e80058 100644 --- a/Geometry_Engine/Modify/Fillet.cs +++ b/Geometry_Engine/Modify/Fillet.cs @@ -36,14 +36,13 @@ public static partial class Modify /**** Public Methods ****/ /***************************************************/ - [Description("Fillets a Polyline by inserting a circular arc at each internal vertex; the end points of an open Polyline stay sharp.\n" + - "Where two corners share a segment too short to carry both fillets, the two are reduced in proportion until they fit, and a warning is raised.\n" + - "A corner that cannot be rounded - a joint running straight through or doubling back, or one where there is no room at all - is left sharp rather than dropped, so the result is always a single contiguous curve.")] + [Description("Fillets a Polyline by inserting an arc of exactly the requested radius at each internal vertex.\n" + + "A corner that cannot achieve that radius is left sharp and named in a warning; the end points of an open Polyline stay sharp.")] [Input("polyline", "Polyline to fillet.")] - [Input("radius", "Target fillet radius, which must be greater than zero. A corner achieves less than this only where the adjacent segments are too short to carry the full radius.", typeof(Length))] + [Input("radius", "Fillet radius, which must be greater than zero. A corner either achieves it exactly or is left sharp.", typeof(Length))] [Input("distTol", "Distance tolerance used for checking point coincidence and segment lengths equal to zero.", typeof(Length))] - [Input("angleTol", "Angle tolerance. A joint is left sharp where it comes within this of running straight through, or of doubling back on itself.", typeof(Angle))] - [Output("polyCurve", "The filleted curve, as trimmed Lines joined by Arc fillets, or null where there is nothing to fillet - a null Polyline, fewer than two control points, fewer than three distinct vertices, or a radius that is not a positive number.")] + [Input("angleTol", "Angle tolerance for treating a joint as running straight through or doubling back on itself.", typeof(Angle))] + [Output("polyCurve", "The filleted curve, as trimmed Lines joined by Arc fillets, or null where there is nothing to fillet.")] public static PolyCurve Fillet(this Polyline polyline, double radius, double distTol = Tolerance.Distance, double angleTol = Tolerance.Angle) { @@ -74,21 +73,24 @@ public static PolyCurve Fillet(this Polyline polyline, double radius, bool closed = polyline.IsClosed(distTol); - List vertices = FilletVertices(pts, closed, distTol); - if (vertices.Count < 3) + List vertexIndices = FilletVertices(pts, closed, distTol); + if (vertexIndices.Count < 3) { Base.Compute.RecordError("The Polyline has fewer than three distinct vertices, so it has no corner to round."); return null; } - // A closed polyline carries a segment from its last vertex back to its first, now that - // FilletVertices has stripped the repeated closing point; an open one does not. + List vertices = vertexIndices.Select(i => pts[i]).ToList(); + + // A closed polyline carries a segment from its last vertex back to its first; an open one does not. int segCount = closed ? vertices.Count : vertices.Count - 1; - double[] trim = FilletTrimLengths(vertices, segCount, closed, radius, distTol, angleTol); - Arc[] arcs = FilletArcs(vertices, trim, distTol); + List noRoom; + List degenerate; + double[] trim = FilletTrimLengths(vertices, vertexIndices, segCount, closed, radius, distTol, angleTol, out noRoom, out degenerate); + Arc[] arcs = FilletArcs(vertices, vertexIndices, trim, radius, distTol, degenerate); - WarnOnReducedRadius(arcs, radius, distTol); + WarnOnSkippedCorners(radius, noRoom, degenerate); return FilletedCurve(vertices, trim, arcs, segCount, closed, distTol); } @@ -97,29 +99,22 @@ public static PolyCurve Fillet(this Polyline polyline, double radius, /**** Private Methods ****/ /***************************************************/ - // The polyline's vertices with coincident points collapsed, so that every returned vertex is - // further than distTol from both its neighbours - the closing pair of a closed polyline included. - // Everything downstream relies on that to keep the assembled curve contiguous. - // Not Modify.RemoveShortSegments, which re-closes a closed polyline by repeating its first point, - // whereas here the wrap is carried by segCount instead. - private static List FilletVertices(IList pts, bool closed, double distTol) + // The polyline's vertices as control point indices, with coincident points collapsed so that every + // vertex is further than distTol from its neighbours. Indices, so a warning can name the control point. + private static List FilletVertices(IList pts, bool closed, double distTol) { - List vertices = new List(); + List vertices = new List(); - foreach (Point pt in pts) + for (int i = 0; i < pts.Count; i++) { - // Measured against the last vertex KEPT rather than the last one seen. Against the raw - // predecessor, a there-and-back jitter passes both tests and leaves two retained vertices - // closer together than distTol. - if (vertices.Count == 0 || pt.Distance(vertices[vertices.Count - 1]) > distTol) - vertices.Add(pt); + // Measured against the last vertex KEPT, or a there-and-back jitter retains two close vertices. + if (vertices.Count == 0 || pts[i].Distance(pts[vertices[vertices.Count - 1]]) > distTol) + vertices.Add(i); } - // The loop above only ever compares a point against its predecessor, never against the first - // vertex, so dropping the repeated closing point of a closed polyline is not enough on its own: - // any vertex that has collapsed onto the first has to go too, or the closing segment comes back - // shorter than distTol. - while (closed && vertices.Count > 1 && vertices[0].Distance(vertices[vertices.Count - 1]) <= distTol) + // The loop above never compares against the first vertex, so a closed polyline can still end on one + // that has collapsed onto it. + while (closed && vertices.Count > 1 && pts[vertices[0]].Distance(pts[vertices[vertices.Count - 1]]) <= distTol) vertices.RemoveAt(vertices.Count - 1); return vertices; @@ -127,14 +122,16 @@ private static List FilletVertices(IList pts, bool closed, double /***************************************************/ - // How far back along each adjacent segment a corner is cut before its fillet arc starts, per - // vertex, and zero where no fillet applies. This owns every trim decision: what the requested radius - // costs at each corner, the sharing of a segment between the two corners that pull on it, and the - // final check that a segment keeps some length between them. - private static double[] FilletTrimLengths(List vertices, int segCount, bool closed, double radius, double distTol, double angleTol) + // How far back each corner is cut, and zero where it is left sharp. Every trim buys the full radius, so + // this decides which corners are rounded: those left sharp are reported through noRoom and degenerate. + private static double[] FilletTrimLengths(List vertices, List vertexIndices, int segCount, bool closed, + double radius, double distTol, double angleTol, out List noRoom, out List degenerate) { int nVerts = vertices.Count; + noRoom = new List(); + degenerate = new List(); + double[] segLengths = new double[segCount]; for (int s = 0; s < segCount; s++) { @@ -142,9 +139,8 @@ private static double[] FilletTrimLengths(List vertices, int segCount, bo segLengths[s] = vertices[s].Distance(vertices[(s + 1) % nVerts]); } - // Trim consumed per unit of achieved radius at each corner, and zero where no fillet applies. - // A sharp corner has a high rate: it pays a lot of segment for very little radius. - double[] rate = new double[nVerts]; + // What the radius costs at each corner, and zero where the vertex is no candidate for filleting. + double[] required = new double[nVerts]; for (int i = 0; i < nVerts; i++) { @@ -156,42 +152,47 @@ private static double[] FilletTrimLengths(List vertices, int segCount, bo Vector v2 = vertices[(i + 1) % nVerts] - corner; if (v1.Length() < distTol || v2.Length() < distTol) + { + degenerate.Add(vertexIndices[i]); continue; + } double theta = v1.Angle(v2); - // There is nothing to round on a joint that runs straight through, or that doubles back - // on itself. + // There is nothing to round on a joint that runs straight through, or that doubles back on itself. if (theta < angleTol || Math.Abs(Math.PI - theta) < angleTol) + { + degenerate.Add(vertexIndices[i]); + continue; + } + + double cornerTrim = radius / Math.Tan(theta / 2.0); + + // A trim this small cannot be told from no trim at all. + if (cornerTrim <= distTol) + { + degenerate.Add(vertexIndices[i]); continue; + } - double cornerRate = 1.0 / Math.Tan(theta / 2.0); - if (radius * cornerRate > distTol) - rate[i] = cornerRate; + required[i] = cornerTrim; } - double[] trim = ShareTrims(rate, segLengths, segCount, nVerts, radius, distTol); + // A corner is charged what its neighbours have asked for whether or not those neighbours end up + // filleted, so that the outcome does not depend on which corner happened to be tested first. + double[] trim = new double[nVerts]; - // A segment short enough to have fallen back to ShortSegmentFallbackFraction in ShareTrims can still - // be left with no straight length between its two trims. Give up the smaller corner first, - // and both only if that is not enough - a sharp corner is recoverable, a zero-length or - // reversed segment is not. - for (int s = 0; s < segCount; s++) + for (int i = 0; i < nVerts; i++) { - int vEnd = (s + 1) % nVerts; - if (trim[s] + trim[vEnd] < segLengths[s] - distTol) + if (required[i] <= 0) continue; - if (trim[s] >= trim[vEnd]) - trim[vEnd] = 0; + // Segment i - 1 arrives at this vertex and segment i leaves it. + if (FilletSegmentFits(required, segLengths, nVerts, (i - 1 + nVerts) % nVerts, distTol) + && FilletSegmentFits(required, segLengths, nVerts, i, distTol)) + trim[i] = required[i]; else - trim[s] = 0; - - if (trim[s] + trim[vEnd] >= segLengths[s] - distTol) - { - trim[s] = 0; - trim[vEnd] = 0; - } + noRoom.Add(vertexIndices[i]); } return trim; @@ -199,107 +200,18 @@ private static double[] FilletTrimLengths(List vertices, int segCount, bo /***************************************************/ - // The trim allowed at each corner once the corners pulling on the same segment have been reconciled. - // Every corner's radius is raised together from zero. A corner stops growing when it reaches the - // radius that was asked for, or when a segment it sits on runs out of room; whatever a stopped corner - // leaves behind is then available to those still growing. That is what keeps a corner held back on - // one segment from squeezing its neighbour on the other with a trim it is never going to take. - // Raising the achieved radius rather than the trim length is deliberate: the caller asked for a - // radius, so corners that can reach it keep it and the rest settle at a common achievable radius. - // Growing every corner together also makes the result independent of the order the segments happen - // to be visited in, so a regular polygon fillets symmetrically. - private static double[] ShareTrims(double[] rate, double[] segLengths, int segCount, int nVerts, double radius, double distTol) + // Whether a segment can carry the trims both of its end corners have asked for and keep a straight + // length between them; the margin is what stops two fillets meeting in a line of no length. + private static bool FilletSegmentFits(double[] required, double[] segLengths, int nVerts, int seg, double distTol) { - double margin = distTol * 2.0; - - double[] capacity = new double[segCount]; - for (int s = 0; s < segCount; s++) - { - capacity[s] = segLengths[s] - margin; - if (capacity[s] < distTol) - capacity[s] = segLengths[s] * ShortSegmentFallbackFraction; - } - - double[] trim = new double[nVerts]; - bool[] growing = new bool[nVerts]; - int growingCount = 0; - - for (int i = 0; i < nVerts; i++) - { - growing[i] = rate[i] > 0; - if (growing[i]) - growingCount++; - } - - double level = 0.0; - - // Each pass stops at least one corner, so it cannot need more passes than there are corners. - for (int pass = 0; pass < nVerts && growingCount > 0; pass++) - { - // The radius at which the next corner stops: the one that was asked for, or the point at - // which some segment runs out of room for the corners still growing on it. - double next = radius; - for (int s = 0; s < segCount; s++) - { - int vEnd = (s + 1) % nVerts; - - double growingRate = (growing[s] ? rate[s] : 0) + (growing[vEnd] ? rate[vEnd] : 0); - if (growingRate <= 0) - continue; - - double headroom = capacity[s] - (growing[s] ? 0 : trim[s]) - (growing[vEnd] ? 0 : trim[vEnd]); - next = Math.Min(next, headroom / growingRate); - } - - level = Math.Max(level, next); - - for (int i = 0; i < nVerts; i++) - { - if (growing[i]) - trim[i] = level * rate[i]; - } - - // Everything stops once the requested radius is reached; short of that, only the pair on - // each segment that has just filled up. - if (level >= radius) - break; - - for (int s = 0; s < segCount; s++) - { - int vEnd = (s + 1) % nVerts; - if (trim[s] + trim[vEnd] < capacity[s] - distTol) - continue; - - if (growing[s]) - { - growing[s] = false; - growingCount--; - } - - if (growing[vEnd]) - { - growing[vEnd] = false; - growingCount--; - } - } - } - - for (int i = 0; i < nVerts; i++) - { - if (trim[i] <= distTol) - trim[i] = 0; - } - - return trim; + return required[seg] + required[(seg + 1) % nVerts] <= segLengths[seg] - distTol * 2.0; } /***************************************************/ - // The fillet arc at each vertex, or null where the vertex is not filleted or its arc could not be - // built. Resolving every arc before any curve is assembled is what keeps the result contiguous: - // assembly treats a null arc as an untrimmed corner, so a corner can never be cut back and then - // left open by an arc that failed. - private static Arc[] FilletArcs(List vertices, double[] trim, double distTol) + // The fillet arc at each vertex, or null where the vertex is not filleted or its arc could not be built. + // Resolving every arc before assembly keeps the result contiguous, a null arc being read as no trim. + private static Arc[] FilletArcs(List vertices, List vertexIndices, double[] trim, double radius, double distTol, List degenerate) { int nVerts = vertices.Count; Arc[] arcs = new Arc[nVerts]; @@ -309,7 +221,11 @@ private static Arc[] FilletArcs(List vertices, double[] trim, double dist if (trim[i] <= 0) continue; - arcs[i] = CornerArc(vertices[(i - 1 + nVerts) % nVerts], vertices[i], vertices[(i + 1) % nVerts], trim[i], distTol); + arcs[i] = CornerArc(vertices[(i - 1 + nVerts) % nVerts], vertices[i], vertices[(i + 1) % nVerts], trim[i], radius, distTol); + + // An arc that could not be built leaves the corner sharp, so it belongs with the degenerate ones. + if (arcs[i] == null) + degenerate.Add(vertexIndices[i]); } return arcs; @@ -317,60 +233,54 @@ private static Arc[] FilletArcs(List vertices, double[] trim, double dist /***************************************************/ - // The arc rounding a single corner, tangent to both adjacent segments at the trim distance from - // the corner, or null where no valid arc exists. - private static Arc CornerArc(Point prev, Point corner, Point next, double trim, double distTol) + // The arc rounding a single corner at the requested radius, tangent to both adjacent segments at the + // trim distance from the corner, or null where no valid arc exists. + private static Arc CornerArc(Point prev, Point corner, Point next, double trim, double radius, double distTol) { Vector v1 = (prev - corner).Normalise(); Vector v2 = (next - corner).Normalise(); double theta = v1.Angle(v2); - // The arc sweeps pi - theta. Create.ArcByCentre guards a sweep near pi but not one near zero, - // and CartesianCoordinateSystem throws rather than returning null on parallel vectors, so - // without this check a doubling-back joint becomes an unhandled exception. The joint test in - // FilletTrimLengths only rules that out while the caller leaves angleTol at its default. + // The arc sweeps pi - theta. Create.ArcByCentre guards a sweep near pi but not one near zero, and + // CartesianCoordinateSystem throws on parallel vectors, so a doubling-back joint is caught here. if (Math.PI - theta < Tolerance.Angle) return null; - double arcRadius = trim * Math.Tan(theta / 2.0); - if (arcRadius <= distTol) - return null; - - // Non-zero because the sweep check above holds theta away from pi. + // Offset by the radius asked for rather than by one recovered back out of the trim. Non-zero + // bisector, because the sweep check above holds theta away from pi. Vector bisector = (v1 + v2).Normalise(); - Point centre = corner + bisector * (arcRadius / Math.Sin(theta / 2.0)); + Point centre = corner + bisector * (radius / Math.Sin(theta / 2.0)); return BH.Engine.Geometry.Create.ArcByCentre(centre, corner + v1 * trim, corner + v2 * trim, distTol); } /***************************************************/ - // Warns where the segments available could not carry the radius that was asked for, so that a - // reduced fillet does not have to be spotted by eye. - private static void WarnOnReducedRadius(Arc[] arcs, double radius, double distTol) + // Warns for the corners left sharp, by control point number. The two causes are kept apart because too + // short a segment is answered by a smaller radius and a joint with no corner is not. + private static void WarnOnSkippedCorners(double radius, List noRoom, List degenerate) { - int reduced = 0; - double smallest = radius; + if (noRoom.Count > 0) + Base.Compute.RecordWarning("The fillet radius of " + radius + " could not be achieved at control point(s) " + FilletVertexNumbers(noRoom) + ", where an adjacent segment is too short to carry it, so those corners have been left sharp."); - foreach (Arc arc in arcs) - { - if (arc == null || arc.Radius >= radius - distTol) - continue; + if (degenerate.Count > 0) + Base.Compute.RecordWarning("No arc could be inserted at control point(s) " + FilletVertexNumbers(degenerate) + " - the joint runs straight through, doubles back on itself or is otherwise degenerate, so those corners have been left sharp."); + } - reduced++; - smallest = Math.Min(smallest, arc.Radius); - } + /***************************************************/ - if (reduced > 0) - Base.Compute.RecordWarning("The requested fillet radius of " + radius + " did not fit at " + reduced + " corner(s), where the adjacent segments were too short to carry it. The smallest radius achieved was " + smallest + "."); + // Vertices as a readable list, ascending because a vertex can join one of these lists at either the + // trim or the arc stage, and zero based to match the Polyline's ControlPoints. + private static string FilletVertexNumbers(List vertices) + { + return string.Join(", ", vertices.OrderBy(i => i)); } /***************************************************/ - // The trimmed Lines and corner Arcs as a single PolyCurve, with a closing Line where a closed - // polyline's last curve does not already meet its first. Reads the trims and arcs it is given - // and changes neither. + // The trimmed Lines and corner Arcs as a single PolyCurve, with a closing Line where a closed polyline's + // last curve does not already meet its first. private static PolyCurve FilletedCurve(List vertices, double[] trim, Arc[] arcs, int segCount, bool closed, double distTol) { int nVerts = vertices.Count; @@ -384,8 +294,8 @@ private static PolyCurve FilletedCurve(List vertices, double[] trim, Arc[ Point pB = vertices[vEnd]; Vector dir = (pB - pA).Normalise(); - // A corner is only cut back where its arc was actually built, so that the line always - // runs to something that closes it. + // A corner is only cut back where its arc was built, so a line always runs to something that + // closes it. double tStart = arcs[s] == null ? 0 : trim[s]; double tEnd = arcs[vEnd] == null ? 0 : trim[vEnd]; @@ -406,15 +316,6 @@ private static PolyCurve FilletedCurve(List vertices, double[] trim, Arc[ return new PolyCurve { Curves = output }; } - /***************************************************/ - /**** Private Fields ****/ - /***************************************************/ - - // Fraction of a segment's own length that its two trims may occupy, on a segment too short for - // the distTol margin to leave any room at all. Deliberately not an input: it has no physical - // meaning a caller could set it from, and only ever applies to a degenerate segment. - private const double ShortSegmentFallbackFraction = 0.99; - /***************************************************/ } } From 5c17547df6f7a7a27e2d4303d37d17325d6647ed Mon Sep 17 00:00:00 2001 From: Christopher Short Date: Wed, 9 Sep 2026 13:55:12 +0100 Subject: [PATCH 5/7] update to comments --- Geometry_Engine/Modify/Fillet.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Geometry_Engine/Modify/Fillet.cs b/Geometry_Engine/Modify/Fillet.cs index 8c4e80058..21f6db2bd 100644 --- a/Geometry_Engine/Modify/Fillet.cs +++ b/Geometry_Engine/Modify/Fillet.cs @@ -52,7 +52,7 @@ public static PolyCurve Fillet(this Polyline polyline, double radius, return null; } - IList pts = polyline.ControlPoints; + List pts = polyline.ControlPoints; if (pts == null || pts.Count < 2) { Base.Compute.RecordError("The Polyline needs at least two control points to be filleted."); @@ -147,6 +147,7 @@ private static double[] FilletTrimLengths(List vertices, List vertex if (!closed && (i == 0 || i == nVerts - 1)) continue; + //Vectors go in opposite directions from the corner, so the angle between them is the internal angle of the joint. Point corner = vertices[i]; Vector v1 = vertices[(i - 1 + nVerts) % nVerts] - corner; Vector v2 = vertices[(i + 1) % nVerts] - corner; From 01216fb326677d0b3859f17ad8267d4bc1142b66 Mon Sep 17 00:00:00 2001 From: Christopher Short Date: Thu, 10 Sep 2026 11:42:59 +0100 Subject: [PATCH 6/7] allow zero radius but return as polycuve --- Geometry_Engine/Modify/Fillet.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Geometry_Engine/Modify/Fillet.cs b/Geometry_Engine/Modify/Fillet.cs index 21f6db2bd..dec22fbdb 100644 --- a/Geometry_Engine/Modify/Fillet.cs +++ b/Geometry_Engine/Modify/Fillet.cs @@ -67,8 +67,8 @@ public static PolyCurve Fillet(this Polyline polyline, double radius, if (radius <= 0) { - Base.Compute.RecordError("The fillet radius is zero or negative, so no corner has been rounded."); - return null; + Base.Compute.RecordWarning("The fillet radius is zero or negative, so no corner has been rounded. Polyline returned as a PolyCurve without modification."); + return new PolyCurve { Curves = new List { polyline } }; } bool closed = polyline.IsClosed(distTol); From 7c1e2213d30daad2f46e6dec9e8c73f9a0b38f3f Mon Sep 17 00:00:00 2001 From: Christopher Short Date: Thu, 10 Sep 2026 11:55:50 +0100 Subject: [PATCH 7/7] Update unit tests --- .ci/Datasets/Geometry_Engine/Modify/Fillet.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Datasets/Geometry_Engine/Modify/Fillet.json b/.ci/Datasets/Geometry_Engine/Modify/Fillet.json index 5bd86aa92..5246a703c 100644 --- a/.ci/Datasets/Geometry_Engine/Modify/Fillet.json +++ b/.ci/Datasets/Geometry_Engine/Modify/Fillet.json @@ -1 +1 @@ -{ "_t" : "BH.oM.Data.Library.Dataset", "SourceInformation" : { "_t" : "BH.oM.Data.Library.Source", "SourceLink" : "", "Title" : "Fillet", "Author" : "Christopher Short", "ItemReference" : "", "Version" : "", "Publisher" : "", "Schema" : "", "Language" : "", "Location" : "", "Copyright" : "", "Contributors" : "", "Confidence" : "High", "BHoM_Guid" : "745f75bb-1595-4e38-b946-c3d3f0f3a725", "Name" : "" }, "TimeOfCreation" : { "$date" : 1788870018300 }, "Data" : [{ "_t" : "BH.oM.Test.UnitTests.UnitTest", "Method" : { "_t" : "System.Reflection.MethodBase", "TypeName" : "{ \"_t\" : \"System.Type\", \"Name\" : \"BH.Engine.Geometry.Modify, Geometry_Engine, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null\", \"_bhomVersion\" : \"9.3\" }", "MethodName" : "Fillet", "Parameters" : ["{ \"_t\" : \"System.Type\", \"Name\" : \"BH.oM.Geometry.Polyline\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }"], "_bhomVersion" : "9.3" }, "Data" : [{ "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -8.6165725230395473, "Y" : 14.647882460889299, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 7.0568169740295179, "Y" : 22.317839023284794, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 16.171837816296637, "Y" : 13.20281818101768, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.6165725230395473, "Y" : 14.647882460889299, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.952423510946157, "Y" : 21.288029456244001, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.43955286398082632, "Y" : 0.89821672204777681, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.89821672204777681, "Y" : 0.43955286398082632, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.94594594594594561 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.3941569048032676, "Y" : 18.341878607927292, "Z" : 0.0 } }, "Radius" : 3.2800000000000007, "StartAngle" : 0.0, "EndAngle" : 1.2404989719656419 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.7134671470951428, "Y" : 20.661188850219169, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 16.171837816296637, "Y" : 13.20281818101768, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "ddd2e298-95fe-4f35-9917-afb1b050709b", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -4.5153854936660922, "Y" : -1.2790362342573496, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -6.4920778557001766, "Y" : 9.06952966109756, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 8.817598281622633, "Y" : 6.1238704549291212, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -11.4144294239027, "Y" : 1.0852428654304769, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.39910947236997, "Y" : -10.348565895354911, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 7.6160793948960306, "Y" : -2.0929683833302071, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 8.5075288914996374, "Y" : 3.0231765536991864, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.5153854936660922, "Y" : -1.2790362342573496, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -6.4920778557001766, "Y" : 9.06952966109756, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -6.4920778557001766, "Y" : 9.06952966109756, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.817598281622633, "Y" : 6.1238704549291212, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.817598281622633, "Y" : 6.1238704549291212, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -7.0699244114085475, "Y" : 2.167207715285342, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.24166073643897693, "Y" : 0.97036080323958429, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.9703608032395844, "Y" : -0.24166073643897695, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.95346992796453145 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -6.2772771958887033, "Y" : -1.0155757193404942, "Z" : 0.0 } }, "Radius" : 3.2799999999999998, "StartAngle" : 0.0, "EndAngle" : 1.8770493552506224 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -9.0729917560966751, "Y" : -2.7309124495019947, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -6.2054733868322671, "Y" : -7.404492112115256, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.85235200006340595, "Y" : -0.52296851529314048, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.52296851529314048, "Y" : -0.85235200006340595, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.99866470480034186 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.4097588266242957, "Y" : -5.6891553819537553, "Z" : 0.0 } }, "Radius" : 3.2799999999999998, "StartAngle" : 0.0, "EndAngle" : 1.6224798343074009 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.5522845619228924, "Y" : -8.3925216826928875, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.4790490848229965, "Y" : -2.8742182415416782, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.56630312948213501, "Y" : -0.82419704290827212, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.82419704290827212, "Y" : 0.56630312948213501, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.71475402237226937 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.6215748201215936, "Y" : -0.17085194080254595, "Z" : 0.0 } }, "Radius" : 3.2799999999999998, "StartAngle" : 0.0, "EndAngle" : 0.79627233310391998 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 7.8528895435875201, "Y" : -0.73388405170948756, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.5075288914996374, "Y" : 3.0231765536991864, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "7b3f45bd-d283-4ba9-9ebb-568e17d35cf4", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -2.0808069096255757, "Y" : -26.933828106748301, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -11.853598780332099, "Y" : -17.161036236041781, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 10.973892678855524, "Y" : -18.109142910065543, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.406193671934549, "Y" : -30.799186085460576, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 13.599418853075187, "Y" : -33.643506107531877, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 6.7438782870571758, "Y" : -25.256408606552402, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -2.0808069096255757, "Y" : -26.933828106748301, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.3078478336026658, "Y" : -25.706787182771212, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -5.9081979381781631, "Y" : -23.106437078195714, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.70710678118654746, "Y" : -0.70710678118654768, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.70710678118654768, "Y" : 0.70710678118654746, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.67715432298275968 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.588887695886287, "Y" : -20.787126835903837, "Z" : 0.0 } }, "Radius" : 3.2800000000000007, "StartAngle" : 0.0, "EndAngle" : 2.3977041789262676 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.4527750129544224, "Y" : -17.509952239159702, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.7238797583850065, "Y" : -17.581759390307951, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.041497769186547885, "Y" : 0.99913859656833404, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99913859656833393, "Y" : -0.041497769186547878, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.48394509730039648 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.8599924413168836, "Y" : -20.858933987052087, "Z" : 0.0 } }, "Radius" : 3.2799999999999998, "StartAngle" : 0.0, "EndAngle" : 2.6364353558550579 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -0.39313184807700985, "Y" : -23.792655173531809, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.2964939121528793, "Y" : -25.744336205569745, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.44721359549995926, "Y" : 0.89442719099991519, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.89442719099991519, "Y" : -0.44721359549995926, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.5353001451462408 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.8296333189130127, "Y" : -28.678057392049467, "Z" : 0.0 } }, "Radius" : 3.2800000000000007, "StartAngle" : 0.0, "EndAngle" : 2.5767296029215183 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.1610534146960596, "Y" : -31.941270642836361, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.7093541442111864, "Y" : -32.84217141053788, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.10104271212897675, "Y" : -0.99488208865454042, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99488208865454031, "Y" : -0.10104271212897672, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.70634759202153163 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.0407742399942306, "Y" : -29.578958159750982, "Z" : 0.0 } }, "Radius" : 3.2800000000000047, "StartAngle" : 0.0, "EndAngle" : 2.3572675702614969 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.5803377997822778, "Y" : -27.50314098914162, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 7.9788663953297103, "Y" : -26.767298313481565, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.77425718286220968, "Y" : 0.63287108860041541, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.63287108860041541, "Y" : 0.77425718286220968, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.87881937697629819 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.4393028355416631, "Y" : -28.843115484090927, "Z" : 0.0 } }, "Radius" : 3.2799999999999994, "StartAngle" : 0.0, "EndAngle" : 1.0733822354080471 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.8267988918146996, "Y" : -25.620812127962129, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -0.37603364758382729, "Y" : -26.609780296608132, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.18673900723383036, "Y" : -0.98240955979536537, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.98240955979536537, "Y" : -0.18673900723383036, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.82671287996087883 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -0.98853759131079078, "Y" : -23.387476940479335, "Z" : 0.0 } }, "Radius" : 3.2799999999999994, "StartAngle" : 0.0, "EndAngle" : 0.97323987380973198 }] }], "BHoM_Guid" : "a813e87c-df53-4ed1-9d4e-c74f0ec9afb5", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "e384747d-27b4-4341-939d-2766cd85397d", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -2.2695742232816443, "Y" : -49.918461094214301, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -1.5573184028592664, "Y" : -41.549455204251352, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.1392457518903853, "Y" : -40.303007518512189, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.645019103120475, "Y" : -40.481071473617781, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -12.330187686747749, "Y" : -50.096525049319894, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -13.398571417381305, "Y" : -51.253940757506257, "Z" : 0.0 }] }, 3.2799999999999998, 1.0, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.2695742232816443, "Y" : -49.918461094214301, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.5573184028592664, "Y" : -41.549455204251352, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.5573184028592664, "Y" : -41.549455204251352, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.1392457518903853, "Y" : -40.303007518512189, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.1392457518903853, "Y" : -40.303007518512189, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -10.554071235501338, "Y" : -40.411733374166609, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.016946718543288081, "Y" : 0.99985639405397342, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.99985639405397342, "Y" : -0.016946718543288081, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.97605046458892153 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -10.498485998679353, "Y" : -43.691262346663642, "Z" : 0.0 } }, "Radius" : 3.2800000000000002, "StartAngle" : 0.0, "EndAngle" : 1.790094057706928 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -13.687379528556864, "Y" : -44.458958937189706, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.330187686747749, "Y" : -50.096525049319894, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.330187686747749, "Y" : -50.096525049319894, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -13.398571417381305, "Y" : -51.253940757506257, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "f1a42223-1240-48da-9a2c-e0fc97974e33", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -2.2695742232816443, "Y" : -49.918461094214301, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -1.5573184028592664, "Y" : -41.549455204251352, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.1392457518903853, "Y" : -40.303007518512189, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.645019103120475, "Y" : -40.481071473617781, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -12.330187686747749, "Y" : -50.096525049319894, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -13.398571417381305, "Y" : -51.253940757506257, "Z" : 0.0 }] }, 3.2799999999999998, 0.51600000000000001, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.2695742232816443, "Y" : -49.918461094214301, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.5573184028592664, "Y" : -41.549455204251352, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.5573184028592664, "Y" : -41.549455204251352, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.1392457518903853, "Y" : -40.303007518512189, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.1392457518903853, "Y" : -40.303007518512189, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -10.554071235501338, "Y" : -40.411733374166609, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.016946718543288081, "Y" : 0.99985639405397342, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.99985639405397342, "Y" : -0.016946718543288081, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.97605046458892153 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -10.498485998679353, "Y" : -43.691262346663642, "Z" : 0.0 } }, "Radius" : 3.2800000000000002, "StartAngle" : 0.0, "EndAngle" : 1.790094057706928 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -13.687379528556864, "Y" : -44.458958937189706, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.330187686747749, "Y" : -50.096525049319894, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.330187686747749, "Y" : -50.096525049319894, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -13.398571417381305, "Y" : -51.253940757506257, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "1818288b-cccb-415f-99d1-919fa07e6afd", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 20.680645937491363, "Y" : -48.351578267897722, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -30.404316128055978, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 40.716674889177597, "Y" : -47.116480592793778, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 0.61689044238027346], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 20.680645937491363, "Y" : -48.351578267897722, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 24.923566694257172, "Y" : -34.184595928297092, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.9579596945638218, "Y" : 0.2869028121005251, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.2869028121005251, "Y" : 0.95795969456382191, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.98314540865002598 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 28.06567449242651, "Y" : -35.125637151986815, "Z" : 0.0 } }, "Radius" : 3.2800000000000025, "StartAngle" : 0.0, "EndAngle" : 1.7546557922477781 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 29.565311781697609, "Y" : -32.208534479706039, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 40.716674889177597, "Y" : -47.116480592793778, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "666f5d60-e51e-4f42-b5ff-896dda7d5086", "Name" : "" }], "BHoM_Guid" : "ed38c900-4f84-4b38-a0d0-e6f4283f8292", "Name" : "" }], "BHoM_Guid" : "258df90c-5186-4480-9944-165e391958d5", "Name" : "Fillet", "_bhomVersion" : "9.3" } \ No newline at end of file +{ "_t" : "BH.oM.Data.Library.Dataset", "SourceInformation" : { "_t" : "BH.oM.Data.Library.Source", "SourceLink" : "", "Title" : "Fillet", "Author" : "Christopher Short", "ItemReference" : "", "Version" : "", "Publisher" : "", "Schema" : "", "Language" : "", "Location" : "", "Copyright" : "", "Contributors" : "", "Confidence" : "High", "BHoM_Guid" : "a1b7b4cf-0b2a-4d04-a0b2-bd9e18956890", "Name" : "" }, "TimeOfCreation" : { "$date" : 1789037741096 }, "Data" : [{ "_t" : "BH.oM.Test.UnitTests.UnitTest", "Method" : { "_t" : "System.Reflection.MethodBase", "TypeName" : "{ \"_t\" : \"System.Type\", \"Name\" : \"BH.Engine.Geometry.Modify, Geometry_Engine, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null\", \"_bhomVersion\" : \"9.3\" }", "MethodName" : "Fillet", "Parameters" : ["{ \"_t\" : \"System.Type\", \"Name\" : \"BH.oM.Geometry.Polyline\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }", "{ \"_t\" : \"System.Type\", \"Name\" : \"System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\", \"_bhomVersion\" : \"9.3\" }"], "_bhomVersion" : "9.3" }, "Data" : [{ "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -8.6165725230395473, "Y" : 14.647882460889299, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 7.0568169740295179, "Y" : 22.317839023284794, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 16.171837816296637, "Y" : 13.20281818101768, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -8.6165725230395473, "Y" : 14.647882460889299, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.952423510946157, "Y" : 21.288029456244001, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.43955286398082632, "Y" : 0.89821672204777681, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.89821672204777681, "Y" : 0.43955286398082632, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.94594594594594561 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.3941569048032676, "Y" : 18.341878607927292, "Z" : 0.0 } }, "Radius" : 3.2800000000000007, "StartAngle" : 0.0, "EndAngle" : 1.2404989719656419 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.7134671470951428, "Y" : 20.661188850219169, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 16.171837816296637, "Y" : 13.20281818101768, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "56636840-7400-4786-a9bc-a57580d803a4", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -4.5153854936660922, "Y" : -1.2790362342573496, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -6.4920778557001766, "Y" : 9.06952966109756, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 8.817598281622633, "Y" : 6.1238704549291212, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -11.4144294239027, "Y" : 1.0852428654304769, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.39910947236997, "Y" : -10.348565895354911, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 7.6160793948960306, "Y" : -2.0929683833302071, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 8.5075288914996374, "Y" : 3.0231765536991864, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.5153854936660922, "Y" : -1.2790362342573496, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -6.4920778557001766, "Y" : 9.06952966109756, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -6.4920778557001766, "Y" : 9.06952966109756, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.817598281622633, "Y" : 6.1238704549291212, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.817598281622633, "Y" : 6.1238704549291212, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -7.0699244114085475, "Y" : 2.167207715285342, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.24166073643897693, "Y" : 0.97036080323958429, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.9703608032395844, "Y" : -0.24166073643897695, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.95346992796453145 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -6.2772771958887033, "Y" : -1.0155757193404942, "Z" : 0.0 } }, "Radius" : 3.2799999999999998, "StartAngle" : 0.0, "EndAngle" : 1.8770493552506224 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -9.0729917560966751, "Y" : -2.7309124495019947, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -6.2054733868322671, "Y" : -7.404492112115256, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.85235200006340595, "Y" : -0.52296851529314048, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.52296851529314048, "Y" : -0.85235200006340595, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.99866470480034186 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.4097588266242957, "Y" : -5.6891553819537553, "Z" : 0.0 } }, "Radius" : 3.2799999999999998, "StartAngle" : 0.0, "EndAngle" : 1.6224798343074009 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.5522845619228924, "Y" : -8.3925216826928875, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.4790490848229965, "Y" : -2.8742182415416782, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.56630312948213501, "Y" : -0.82419704290827212, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.82419704290827212, "Y" : 0.56630312948213501, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.71475402237226937 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.6215748201215936, "Y" : -0.17085194080254595, "Z" : 0.0 } }, "Radius" : 3.2799999999999998, "StartAngle" : 0.0, "EndAngle" : 0.79627233310391998 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 7.8528895435875201, "Y" : -0.73388405170948756, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.5075288914996374, "Y" : 3.0231765536991864, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "7fb58783-5d04-4def-8f86-b8b270bd94d8", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -2.0808069096255757, "Y" : -26.933828106748301, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -11.853598780332099, "Y" : -17.161036236041781, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 10.973892678855524, "Y" : -18.109142910065543, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.406193671934549, "Y" : -30.799186085460576, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 13.599418853075187, "Y" : -33.643506107531877, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 6.7438782870571758, "Y" : -25.256408606552402, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -2.0808069096255757, "Y" : -26.933828106748301, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.3078478336026658, "Y" : -25.706787182771212, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -5.9081979381781631, "Y" : -23.106437078195714, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.70710678118654746, "Y" : -0.70710678118654768, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.70710678118654768, "Y" : 0.70710678118654746, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.67715432298275968 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.588887695886287, "Y" : -20.787126835903837, "Z" : 0.0 } }, "Radius" : 3.2800000000000007, "StartAngle" : 0.0, "EndAngle" : 2.3977041789262676 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.4527750129544224, "Y" : -17.509952239159702, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.7238797583850065, "Y" : -17.581759390307951, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.041497769186547885, "Y" : 0.99913859656833404, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99913859656833393, "Y" : -0.041497769186547878, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.48394509730039648 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.8599924413168836, "Y" : -20.858933987052087, "Z" : 0.0 } }, "Radius" : 3.2799999999999998, "StartAngle" : 0.0, "EndAngle" : 2.6364353558550579 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -0.39313184807700985, "Y" : -23.792655173531809, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.2964939121528793, "Y" : -25.744336205569745, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.44721359549995926, "Y" : 0.89442719099991519, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.89442719099991519, "Y" : -0.44721359549995926, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.5353001451462408 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.8296333189130127, "Y" : -28.678057392049467, "Z" : 0.0 } }, "Radius" : 3.2800000000000007, "StartAngle" : 0.0, "EndAngle" : 2.5767296029215183 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -3.1610534146960596, "Y" : -31.941270642836361, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.7093541442111864, "Y" : -32.84217141053788, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.10104271212897675, "Y" : -0.99488208865454042, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.99488208865454031, "Y" : -0.10104271212897672, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.70634759202153163 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 6.0407742399942306, "Y" : -29.578958159750982, "Z" : 0.0 } }, "Radius" : 3.2800000000000047, "StartAngle" : 0.0, "EndAngle" : 2.3572675702614969 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 8.5803377997822778, "Y" : -27.50314098914162, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 7.9788663953297103, "Y" : -26.767298313481565, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.77425718286220968, "Y" : 0.63287108860041541, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.63287108860041541, "Y" : 0.77425718286220968, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.87881937697629819 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 5.4393028355416631, "Y" : -28.843115484090927, "Z" : 0.0 } }, "Radius" : 3.2799999999999994, "StartAngle" : 0.0, "EndAngle" : 1.0733822354080471 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 4.8267988918146996, "Y" : -25.620812127962129, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -0.37603364758382729, "Y" : -26.609780296608132, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.18673900723383036, "Y" : -0.98240955979536537, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.98240955979536537, "Y" : -0.18673900723383036, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.82671287996087883 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -0.98853759131079078, "Y" : -23.387476940479335, "Z" : 0.0 } }, "Radius" : 3.2799999999999994, "StartAngle" : 0.0, "EndAngle" : 0.97323987380973198 }] }], "BHoM_Guid" : "65fd7b3c-2c42-4bf2-8740-8f0b90040098", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "ab706a2b-85e3-41be-817b-6868760c2cbb", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : -2.2695742232816443, "Y" : -49.918461094214301, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -1.5573184028592664, "Y" : -41.549455204251352, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -4.1392457518903853, "Y" : -40.303007518512189, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -14.645019103120475, "Y" : -40.481071473617781, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -12.330187686747749, "Y" : -50.096525049319894, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : -13.398571417381305, "Y" : -51.253940757506257, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -2.2695742232816443, "Y" : -49.918461094214301, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.5573184028592664, "Y" : -41.549455204251352, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -1.5573184028592664, "Y" : -41.549455204251352, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.1392457518903853, "Y" : -40.303007518512189, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -4.1392457518903853, "Y" : -40.303007518512189, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -10.554071235501338, "Y" : -40.411733374166609, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.016946718543288081, "Y" : 0.99985639405397342, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.99985639405397342, "Y" : -0.016946718543288081, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : 0.97605046458892153 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : -10.498485998679353, "Y" : -43.691262346663642, "Z" : 0.0 } }, "Radius" : 3.2800000000000002, "StartAngle" : 0.0, "EndAngle" : 1.790094057706928 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -13.687379528556864, "Y" : -44.458958937189706, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.330187686747749, "Y" : -50.096525049319894, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : -12.330187686747749, "Y" : -50.096525049319894, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : -13.398571417381305, "Y" : -51.253940757506257, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "08c54009-7f3d-4fa5-9b29-d1a108e69a64", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }] }, 0.0, 9.9999999999999995E-07, 9.9999999999999995E-07], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -25.601158502651746, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -29.658454365368208, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 41.840284645768371, "Y" : -33.715750228084673, "Z" : 0.0 }] }] }], "BHoM_Guid" : "353e6eb6-b0dc-4820-820e-7a821d946f85", "Name" : "" }, { "_t" : "BH.oM.Test.UnitTests.TestData", "Inputs" : [{ "_t" : "BH.oM.Geometry.Polyline", "ControlPoints" : [{ "_t" : "BH.oM.Geometry.Point", "X" : 20.680645937491363, "Y" : -48.351578267897722, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 26.055736357939953, "Y" : -30.404316128055978, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, { "_t" : "BH.oM.Geometry.Point", "X" : 40.716674889177597, "Y" : -47.116480592793778, "Z" : 0.0 }] }, 3.2799999999999998, 9.9999999999999995E-07, 0.61689044238027346], "Outputs" : [{ "_t" : "BH.oM.Geometry.PolyCurve", "Curves" : [{ "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 20.680645937491363, "Y" : -48.351578267897722, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 24.923566694257172, "Y" : -34.184595928297092, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Arc", "CoordinateSystem" : { "_t" : "BH.oM.Geometry.CoordinateSystem.Cartesian", "X" : { "_t" : "BH.oM.Geometry.Vector", "X" : -0.9579596945638218, "Y" : 0.2869028121005251, "Z" : 0.0 }, "Y" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.2869028121005251, "Y" : 0.95795969456382191, "Z" : 0.0 }, "Z" : { "_t" : "BH.oM.Geometry.Vector", "X" : 0.0, "Y" : 0.0, "Z" : -0.98314540865002598 }, "Origin" : { "_t" : "BH.oM.Geometry.Point", "X" : 28.06567449242651, "Y" : -35.125637151986815, "Z" : 0.0 } }, "Radius" : 3.2800000000000025, "StartAngle" : 0.0, "EndAngle" : 1.7546557922477781 }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 29.565311781697609, "Y" : -32.208534479706039, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, "Infinite" : false }, { "_t" : "BH.oM.Geometry.Line", "Start" : { "_t" : "BH.oM.Geometry.Point", "X" : 33.948010501854164, "Y" : -34.46161199077244, "Z" : 0.0 }, "End" : { "_t" : "BH.oM.Geometry.Point", "X" : 40.716674889177597, "Y" : -47.116480592793778, "Z" : 0.0 }, "Infinite" : false }] }], "BHoM_Guid" : "d9e6f5a1-fc90-4458-b2e2-0561c90f9baa", "Name" : "" }], "BHoM_Guid" : "3faa8887-9326-425b-8597-5441f4feb44e", "Name" : "" }], "BHoM_Guid" : "574fa359-f677-4ba7-b3f2-6a6b402c7228", "Name" : "Fillet", "_bhomVersion" : "9.3" } \ No newline at end of file